【DIY】基于OpenMV的STM32追球小车

本文介绍了如何使用OpenMV进行颜色识别和STM32进行PID控制,实现追球小车的功能。通过OpenMV的microPython程序识别小球颜色和坐标,STM32接收数据并执行PID控制,当小球靠近至10cm时自动停车。此外,还提供了按键调节PID参数和颜色识别阈值的设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


本帖相关分享资料整理【程序+原理图-手工PCB】,最后有下载链接

注:本文仅用于学习交流分享,[若有不妥之处,请指正,感谢]

关键词:【OpenMV】【颜色识别】【PID】【STM32】
最后面有程序与原理图PCB分享

用到的工具有

  • openMV IDE
  • Keil 5 编译器
  • Altium Designer

实现的小功能有:
①设别颜色小球,并自动追寻小球
②简单测试与颜色小球的粗略距离,并且在小球10cm处停车
③按键调节PID参数以及调节识别的颜色

总体设计

1.基础硬件DIY设计
2.openMV简单识别程序设计 与 单片机控制程序设计
3.效果展示

1.基础硬件DIY设计

电路硬件:
[MCU] STM32F103C8T6最小系统板
[稳压电源]【L7805】 7.2V稳压5.0V 【AMS1117-3.3】5.0V稳压3.3V
[外围电路] 按键、蜂鸣器、OLED、干簧管

1)整体原理图

在这里插入图片描述

2)PCB电路

在这里插入图片描述

2.OpenMV简单识别程序设计 与 STM32控制程序设计

1)OpenMV简单识别程序设计【microPython】

在这里插入图片描述
识别小球颜色并通过串口定时发送小球坐标与距离的数据包

#2018.8.2   【microPython】
import sensor, image, time , pyb
from pyb import UART
from pyb import Timer
from pyb import LED
import json

led = pyb.LED(3) # Red LED = 1, Green LED = 2, Blue LED = 3, IR LEDs = 4.
thresholds = [(27, 67, 19, 91, 45, 76), # 红色
              #(21, 75, 3, -38, 34, 68), # 绿色
              (27, 90, -3, -28, 31, 125),
              (0, 30, 0, 64, -128, 0)]  # generic_blue_thresholds
threshold_index = 1 # 0 for red, 1 for gre9en, 2 for blue


sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)   #320*240
sensor.skip_frames(time = 100)
sensor.set_auto_gain(False) # must be turned off for color tracking
sensor.set_auto_whitebal(False) # must be turned off for color tracking
clock = time.clock()
uart = UART(3, 115200)
uart.init(115200, bits=8, parity=None, stop=1, timeout_char=1000) # 使用给定参数初始化

def tick(timer):            # we will receive the timer object when being called
    global data
    if blobs:
        print("Find")
        print('you send:',output_str)
        uart.write(data)


tim = Timer(4, freq=10)      # create a timer object using timer 4 - trigger at 1Hz
tim.callback(tick)          # set the callback to our tick function


def find_max(blobs):
    max_size=0
    for blob in blobs:
        if blob[2]*blob[3] > max_size:
            max_blob=blob
            max_size = blob[2]*blob[3]
    return max_blob

def Uart_Receive():   #UART接收 改变框小球的颜色阈值
    global threshold_index
    if uart
### 使用OpenMV实现自动小车功能 #### 开发环境搭建 为了使用OpenMV开发自动小车,需先安装并配置好开发环境。确保已下载最新版本的OpenMV IDE,并通过USB线将OpenMV相机模块连接到电脑[^1]。 #### 硬件准备与连接 构建自动小车所需的硬件组件包括但不限于:OpenMV Cam H7 Plus摄像头、电机驱动板、两个直流减速马达以及轮子组成的底盘结构。具体接线方式如下所示: - OpenMV CAM 的 UART TX/RX 接口分别对接至电机控制器对应的RX/TX端; - VCC 和 GND 正确接入电源供应线路; - 驱动器PWM信号输出脚位连结至各伺服马达控制输入端; ```plaintext +-------------------+ | | | OpenMV Cam |----UART_TX --> Motor Driver <-- UART_RX ----| | | ^ (IN1, IN2) | +--------+----------+ | +---> DC Motor 1 | +----------------------------------+---> Wheel Set A GND PWM1------------------------------+ PWM2------------------------------> DC Motor 2 +---> Wheel Set B ``` #### 软件编程逻辑 编写Python脚本以指导OpenMV识别目标物体(即要拾取的),并通过串行通信发送指令给运动控制系统调整方向前进直至接近物品位置停止动作完成抓取操作。下面给出一段简化版示范代码片段用于检测圆形轮廓特征作为代表性的“”。 ```python import sensor, image, time, pyb sensor.reset() # Reset and initialize the sensor. sensor.set_pixformat(sensor.RGB565) # Set pixel format to RGB565 (or GRAYSCALE) sensor.set_framesize(sensor.QVGA) # Set frame size to QVGA (320x240). clock = time.clock() while(True): clock.tick() img = sensor.snapshot().lens_corr(1.8) blobs = img.find_blobs([(30, 100, -64, 64, -32, 32)], pixels_threshold=200, area_threshold=200, merge=True) if blobs: largest_blob = max(blobs, key=lambda b:b.area()) img.draw_circle(largest_blob.cx(), largest_blob.cy(), int(math.sqrt(largest_blob.area()/math.pi)), color=(255,0,0)) print("Ball detected at X:",largest_blob.cx(),"Y:",largest_blob.cy()) # Send command via serial port based on ball position relative to center of screen... ser = pyb.UART(3, baudrate=9600) if largest_blob.cx()<img.width()/2-20 : ser.write('L') # Turn Left elif largest_blob.cx()>img.width()/2+20 : ser.write('R') # Turn Right else: ser.write('F') # Move Forward print(clock.fps()) # Note frames per second. ``` 此段程序实现了基本的对象踪机制,能够帮助理解如何利用图像处理技术配合机械装置达成特定任务目的。实际应用时还需考虑更多因素如光照条件变化影响颜色阈值设定等问题.
评论 139
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值