智能送药小车国一方案:STM32+OpenMV+PID控制全流程实战
在准备全国大学生电子设计竞赛(电赛)时,智能送药小车是控制类题目中的经典赛题,也是许多队伍冲击国奖的“兵家必争之地”。它综合考察了机械结构、运动控制、传感器融合、路径规划以及人机交互等多个维度的能力,对参赛者的系统设计能力和工程实践水平提出了极高要求。很多队伍在备赛过程中,常常面临方案选择困难、代码调试复杂、传感器数据融合不稳定等挑战,导致小车运行效果不佳,与理想成绩失之交臂。
本文将以一个获得国一奖项的智能送药小车作品为蓝本,系统性地拆解其从方案设计、硬件选型、软件算法到调试优化的全流程。无论你是初次接触电赛的新手,还是希望优化现有方案的进阶选手,都能从中获得一套完整、可复现的实战方案。我们将重点讲解如何将零散的模块(如STM32、OpenMV、编码器、舵机)整合成一个稳定、高效、智能的完整系统,并分享在备赛和现场测试中积累的关键“避坑”经验。
1. 智能送药小车赛题解析与核心需求
智能送药小车赛题通常模拟医院场景,要求小车在指定区域内自主行驶,完成药品识别、抓取、运输并精准送达至不同病房(指定区域)的任务。其核心考核点远不止“让车跑起来”那么简单。
1.1 赛题典型任务分解
虽然每年具体规则会有微调,但核心任务框架相对稳定,主要包括以下几个环节:
- 自主启动与循迹:小车从起点区自动出发,沿黑色引导线(可能是直线、曲线、十字路口)稳定行驶。这是所有任务的基础。
- 病房/货架识别与定位:需要识别道路旁的病房编号(通常是数字标签)或不同颜色的货架,并准确判断目标病房的位置。
- 药品识别与抓取:在药房区,需要识别指定的药品(可能通过形状、颜色或二维码区分),并使用机械臂或舵机云台等机构进行抓取。
- 路径规划与决策:根据识别的目标病房,规划从当前位置到该病房的最优或规定路径,并处理途中的岔路选择。
- 精准送达与卸载:将药品运送至目标病房区域,可能要求精确停车(如停在指定色块内),并完成卸货动作(如放下药品、翻转货仓)。
- 返回与重复任务:完成一次送药后,可能需要返回药房进行下一次任务,直至所有药品送达或规定时间结束。
1.2 系统核心能力要求
要高质量完成上述任务,小车系统必须具备以下几种核心能力:
- 稳定的底层运动控制:包括电机PID调速、精确的里程计计算(通过编码器)、稳定的舵机转向控制。这是小车一切智能行为的基础。
- 鲁棒的视觉感知:用于循迹(识别赛道黑线)、识别病房编号、识别药品特征。这通常由独立的视觉模块(如OpenMV、K210)完成。
- 高效的数据融合与决策:主控(如STM32)需要实时接收视觉模块、编码器、陀螺仪等传感器的数据,进行融合处理,并做出行驶、抓取、转向等决策。
- 可靠的机械执行机构:抓取机构(机械爪、电磁铁)、卸货机构(舵机翻斗)需要设计合理、动作准确、响应快速。
- 强健的系统稳定性:在连续运行、不同光照条件、场地轻微不平整等情况下,系统不能出现死机、跑飞、误动作等问题。
2. 硬件系统设计与核心器件选型
硬件是系统的骨架,合理的选型和布局是成功的第一步。国一作品通常采用模块化设计,便于调试和更换。
2.1 主控模块:STM32系列微控制器
STM32F4系列(如F407、F429)或H7系列是主流选择,因其强大的计算能力、丰富的外设(多路PWM、定时器、串口、ADC)和成熟的生态。
- 核心职责:
- 处理编码器数据,实现电机闭环PID控制。
- 通过串口与视觉模块(OpenMV)通信,接收识别结果。
- 控制舵机(转向舵机、抓取舵机)的PWM信号输出。
- 处理按键、显示屏等交互输入输出。
- 推荐型号:STM32F407ZGT6或STM32F429IGT6。资源充足,足以应对多任务调度和复杂计算。
2.2 视觉模块:OpenMV Cam H7
OpenMV是一款基于STM32H7的嵌入式机器视觉模块,内置MicroPython解释器,开发效率高,非常适合电赛的快速原型开发。
- 核心职责:
- 循迹:使用
find_blobs函数寻找黑色赛道线,计算偏距。 - 数字识别:使用内置的
NN(神经网络)功能或template matching(模板匹配)识别病房门牌数字。 - 颜色与形状识别:识别药瓶颜色、形状或场地色块。
- 循迹:使用
- 优势:与STM32主控通过串口(UART)通信,协议简单。社区资源丰富,有大量现成的图像处理例程。
2.3 运动执行模块:电机、驱动与编码器
- 电机:推荐采用直流减速电机(TT马达升级版),如GA25、GA37系列,扭力大,带金属齿轮箱,寿命长。
- 电机驱动:TB6612FNG或DRV8833模块。它们支持双路直流电机控制,具有内置保护电路,比传统的L298N效率高、发热小。
- 编码器:这是实现精准控制的关键! 必须为每个驱动轮配备增量式编码器(如AB相输出)。推荐使用霍尔编码器或光电编码器,精度在500线以上为宜。编码器输出接入STM32的定时器编码器接口,用于实时测量轮子转速和计算行走距离(里程计)。
2.4 传感器模块
- 陀螺仪(IMU):MPU6050(六轴)或MPU9250(九轴)。用于测量小车姿态角(Yaw),在直道行驶时辅助纠正航向角漂移,提升长直道稳定性。数据通过I2C接口读取。
- 超声波传感器/TOF激光测距:HC-SR04或VL53L0X。可用于辅助避障(虽然赛题通常不要求,但可作为安全冗余),或在接近病房时辅助精准停车。
- 巡线传感器(备用):虽然主循迹靠视觉,但可以准备一排红外对管或灰度传感器作为辅助或应急方案,在视觉受到极端光照干扰时使用。
2.5 电源模块
电源管理是稳定性的基石!
- 方案:采用多路独立稳压供电。
- 一块大容量(如5000mAh以上)3S锂聚合物电池(11.1V)作为总电源。
- 电机驱动供电:电池电压(11.1V)直接供给电机驱动模块,保证电机有足够动力。
- 主控及核心模块供电:通过大电流BEC(电池消除器电路)或DC-DC降压模块,将11.1V稳定降至5V,为STM32、OpenMV、舵机、传感器等供电。务必确保5V电源输出电流充足(建议3A以上)且干净稳定,避免因电机启停导致电压波动引起单片机复位。
- 注意:舵机,特别是转向舵机,在堵转时电流很大,必须由独立的5V大电流线路供电,切勿与主控共用微弱的LDO输出。
2.6 机械结构
- 车体:建议使用坚固的铝合金或碳纤维底盘,确保承载能力和刚性。
- 转向机构:前轮阿克曼转向(由舵机驱动)是常见选择,结构简单,控制直观。
- 抓取机构:根据药品形状设计。对于方盒,可采用四杆机构驱动的机械爪;对于圆瓶,可采用自适应夹持器或简单的推板结构。动力源常用舵机或直流电机+丝杠。
- 布局原则:重心低、左右对称、传感器(尤其是摄像头)前置且视野无遮挡、线束整齐固定。
3. 软件架构与核心算法实现
软件是系统的灵魂。一个清晰的架构和稳健的算法是取得高分的关键。
3.1 系统软件架构
采用前后台或轻量级实时操作系统(如FreeRTOS)的思想进行模块化编程。
3.2 核心算法详解
3.2.1 循迹控制算法:PD控制器
视觉(OpenMV)识别赛道中线后,会计算出一个offset(车体中心与赛道中心的横向偏差,单位像素)和angle(赛道切线角度)。
为什么用PD? P(比例)项快速响应偏差,D(微分)项抑制振荡,结合IMU可以更好地保持直道航向,减少“画龙”现象。
3.2.2 电机速度控制:PID闭环
通过编码器获取电机实际转速,与目标转速比较,通过PID控制器调整PWM占空比。
调试关键:先调P(让电机有响应),再调D(抑制超调和震荡),最后加很小的I(消除静差)。左右电机的PID参数需独立调试。
3.2.3 视觉数据处理与通信协议
OpenMV与STM32之间需要定义简单高效的通信协议。
- OpenMV端(MicroPython):
- STM32端(C语言):
3.2.4 状态机设计
使用状态机(State Machine)来管理小车复杂的任务流程,使程序逻辑清晰,易于调试和维护。
4. 系统调试与优化实战经验
调试是电赛备赛中最耗时但也最重要的环节。以下是国一团队总结的实战经验。
4.1 分模块独立调试
- 电机与编码器:单独写测试程序,让电机以固定PWM转动,观察编码器计数是否正常、方向是否正确。确保能准确读取速度。
- PID调试:将小车架空,轮子悬空。编写测试程序,让电机目标速度阶梯变化,通过串口打印实际速度曲线,调整PID参数直至响应快速且无振荡。
- 视觉循迹:单独测试OpenMV,将其画面通过IDE显示出来,观察在不同光照下识别赛道的效果。调整颜色阈值、曝光等参数,确保稳定识别。
- 舵机控制:测试每个舵机,确定其PWM脉宽与角度的对应关系,并标定中位。
4.2 系统联调与问题排查
- 问题:小车循迹“画龙”严重。
- 排查:首先检查视觉
offset数据是否平滑跳动。可能是摄像头帧率低或图像处理算法不稳定。其次,检查PD参数是否合适,D值可能太小。最后,检查转向舵机响应速度,机械连接是否有虚位。 - 解决:优化OpenMV算法,增加图像滤波;适当增大D参数;加固舵机摇臂与转向拉杆的连接。
- 排查:首先检查视觉
- 问题:直道跑偏(不是振荡,是缓慢偏向一边)。
- 排查:这是左右轮实际转速不一致或机械不对称导致。检查左右电机PID参数是否一致,轮胎直径、磨损是否一致,车体重心是否居中。
- 解决:精细调试左右轮PID,使空载转速一致。在代码中为左右轮设置微小的速度补偿系数。确保机械对称。
- 问题:OpenMV与STM32通信丢包或乱码。
- 排查:检查波特率是否一致,串口线连接是否可靠,共地是否良好。检查双方代码的缓冲区大小和解析逻辑。
- 解决:使用示波器查看串口波形。在协议中加入帧头(
$)、帧尾(\r\n)和校验和。STM32端使用中断接收,并做好缓冲区管理。
- 问题:抓取机构动作不到位或卡死。
- 排查:舵机扭矩是否足够?机械结构是否有死点或干涉?电源电压在动作时是否被拉低?
- 解决:更换更大扭矩舵机;优化机械设计,避免死点;为舵机提供独立且容量足够的电源。
4.3 场地适应性优化
比赛场地光照、赛道颜色可能与实验室不同。
- 光照:准备不同光照(强光、弱光、侧光)下的多组颜色阈值,比赛时根据现场情况选择或动态调整。
- 摄像头参数固化:调试到最佳效果后,在OpenMV脚本开头使用
sensor.set_auto_gain(False)和sensor.set_auto_whitebal(False)关闭自动调节,并固定增益和白平衡参数,避免环境光变化引起参数漂移。 - 机械结构加固:赛前对所有螺丝、接线端子进行紧固检查。准备备用关键零件(如舵机、车轮)。
5. 国一作品进阶技巧与心得
除了基本功能,以下几点是作品脱颖而出的关键:
- 速度与稳定性的平衡:不要一味追求高速。国一作品首先追求的是稳定完成所有任务。在稳定基础上,通过优化PID和路径规划,逐步提升平均速度。
- 引入IMU融合:单纯依靠视觉循迹在长直道容易产生累积偏差。将IMU的偏航角(Yaw)或角速度融合到转向控制中,可以极大提升长直道的走线精度,实现“惯性导航”辅助。
- 设计冗余与容错机制:
- 视觉识别失败时,能否根据编码器里程计和上一次识别结果继续行驶一段?
- 抓取动作失败后,是否有重试机制?
- 主循迹失效时,能否切换到底部的红外巡线传感器作为备份?
- 人机交互与调试便利性:
- 增加OLED显示屏,实时显示小车状态、速度、偏差、当前任务等。
- 设计蓝牙或Wi-Fi无线调试接口,可以实时修改PID参数、发送指令,避免频繁插拔串口线。
- 通过蜂鸣器或LED指示不同的运行状态和错误代码。
- 代码的工程化管理:
- 使用版本控制(如Git)。
- 将硬件驱动、算法、应用层分离,提高代码可读性和可移植性。
- 关键参数(如PID值、速度、阈值)定义为宏或全局变量,集中在头文件中,方便调整。
6. 备赛流程与时间规划建议
- 第一阶段(赛前2-3个月):知识储备与方案论证
- 学习STM32、OpenMV基础,掌握PID原理。
- 查阅往年优秀作品报告,确定技术路线(如主控、视觉方案)。
- 完成硬件选型和采购。
- 第二阶段(赛前1-2个月):模块开发与独立调试
- 搭建最小系统车体。
- 逐个攻克电机控制、编码器读取、视觉循迹、舵机控制、传感器读取等模块。
- 实现每个模块的基础功能。
- 第三阶段(赛前1个月):系统集成与算法联调
- 将所有模块整合,实现基础循迹。
- 调试PD转向控制和PID速度控制。
- 实现状态机,完成一次完整的取药-送药流程。
- 第四阶段(赛前2周):优化与稳定性测试
- 进行长时间、多环境的压力测试。
- 优化参数,提升速度和稳定性。
- 设计并制作最终的车体结构和外壳。
- 准备技术报告初稿。
- 第五阶段(赛前1周):模拟与准备
- 按照比赛时长进行全流程模拟。
- 检查所有备件和工具。
- 完善技术报告,准备答辩PPT。
智能送药小车是一个典型的软硬件结合的综合项目,其备战过程本身就是一次完整的工程训练。成功的关键在于清晰的系统设计、扎实的模块调试、耐心的系统联调以及面对问题的解决能力。希望这份从国一作品中提炼的实战指南,能为你提供一条清晰的备赛路径。记住,在电赛的舞台上,稳定可靠的“基本功”往往比炫酷的“黑科技”更能赢得评委的青睐。祝你备赛顺利,在比赛中取得优异成绩!