智能送药小车国一方案全解析:STM32、PID与多传感器融合实战
这次我们来看一个在电赛圈子里讨论度很高的项目——智能送药小车。它不仅是2021年全国大学生电子设计竞赛(电赛)的经典控制类题目,更是许多队伍冲击国奖(包括国一)的核心作品。对于正在备战2025、2026年电赛的同学来说,深入理解一个成熟的国一作品,其价值远超空泛的理论学习。
这个项目的核心不是炫技,而是如何在有限的四天三夜里,稳定、精准地实现一套完整的自动寻迹、精准定位、机械抓取与投放的闭环系统。它涉及STM32等微控制器编程、多种传感器融合、电机控制、机械结构设计以及上位机调试,是对学生综合工程能力的全面检验。
本文将基于一个典型的国一获奖方案框架,为你拆解智能送药小车的核心设计思路、硬件选型门槛、关键代码逻辑、调试避坑要点以及完整的系统测试流程。无论你是初次接触电赛的新手,还是希望优化已有方案的老队员,都能从中获得可直接落地的参考。
1. 核心能力速览(系统规格与设计目标)
在开始动手前,你需要清楚这个系统要达成什么目标,以及需要哪些核心部件。下表概括了一个国一水平智能送药小车的基本规格:
| 能力项 | 说明与典型实现 |
|---|---|
| 核心任务 | 在模拟医院病房的赛道上,自主循迹至指定病房号,精准抓取药品并送达目标病房。 |
| 控制核心 | STM32F4/F1系列主控(如STM32F407ZGT6, STM32F103C8T6),负责所有决策与调度。 |
| 循迹方案 | 多路红外对管/灰度传感器,常见为5-8路,用于识别黑色引导线。 |
| 定位方案 | 编码器(用于路程计量) + 陀螺仪(MPU6050等,用于角度修正) + 视觉辅助(OpenMV/吴鉴鹰等,用于病房号识别)。 |
| 执行机构 | 舵机(用于控制机械臂抓取、释放药品) + 直流减速电机(用于驱动车轮)。 |
| 驱动方案 | 电机驱动模块(如TB6612FNG、L298N)控制直流电机,单片机PWM直接控制舵机。 |
| 通信方式 | 可能涉及蓝牙/WIFI与上位机通信(用于调试与任务下发),或仅作离线自主运行。 |
| 供电系统 | 12V锂电池组为电机供电,经降压模块(如LM2596)为单片机、传感器提供5V/3.3V电源。 |
| 关键算法 | PID循迹控制、编码器测速与闭环、陀螺仪数据融合(互补滤波)、病房号识别算法、运动路径规划。 |
| 开发环境 | Keil MDK-ARM / STM32CubeIDE,搭配串口调试助手、逻辑分析仪等工具。 |
2. 适用场景与使用边界
这个项目方案主要服务于两个核心场景:
- 电赛备赛与学习:为参加全国大学生电子设计竞赛“智能送药小车”及相关控制类题目的团队,提供一个经过验证的高分实现框架。帮助理解从题目分析、方案设计到代码调试的全流程。
- 嵌入式综合实践:作为高校课程设计、毕业设计或课外科技活动的优秀课题,涵盖单片机、传感器、自动控制、机器视觉等多个知识点。
需要明确的使用边界:
- 非商用产品原型:此设计为竞赛作品,侧重于在规定时间内实现功能并稳定运行,在可靠性、鲁棒性、成本控制等方面与工业产品有差距。
- 依赖特定赛场环境:赛道材质(通常为白色KT板)、引导线宽度与颜色、灯光条件、病房标识规格都是确定的。方案需要针对这些条件进行校准和优化,换到差异大的环境可能失效。
- 知识集成而非原创理论:项目重点在于熟练应用成熟的技术模块(如PID、传感器驱动)并进行系统集成,而非发明新算法。
3. 环境准备与前置条件
在焊接第一块电路板之前,请确保你的软硬件环境已就绪。
硬件清单(基础版):
- 主控板:STM32最小系统板(如STM32F103C8T6“蓝色小板”或性能更强的F4系列)。
- 循迹模块:5-8路红外循迹模块或灰度传感器模块。
- 姿态传感器:MPU6050六轴陀螺仪加速度计模块。
- 测速模块:车轮编码器(推荐AB相增量式编码器)。
- 视觉模块(可选但推荐):OpenMV Cam H7 或 吴鉴鹰单片机摄像头模块,用于数字识别。
- 驱动模块:TB6612FNG双电机驱动模块(比L298N效率高、发热小)。
- 执行器:MG996R等大扭矩舵机(用于机械爪)、直流减速电机(带减速箱,扭力足)。
- 电源:12V锂电池、开关、降压模块(如LM2596可调降压模块)。
- 车体:亚克力板或铝合金小车底盘、万向轮、轮胎。
- 调试工具:USB-TTL串口模块、逻辑分析仪(用于分析PWM等信号)、万用表、示波器(理想情况)。
软件与环境:
- 开发IDE:Keil uVision5 (MDK-ARM) 或 STM32CubeIDE。建议新手使用CubeIDE,它集成了CubeMX图形化配置,能自动生成初始化代码。
- 单片机固件库:HAL库或标准库。HAL库抽象层次高,开发快;标准库更底层,控制精细。竞赛中HAL库更常用。
- 驱动安装:ST-Link/V2调试器驱动、串口芯片(如CH340)驱动。
- 辅助软件:串口调试助手(如SSCOM、XCOM)、OpenMV IDE(如果使用OpenMV)、绘图软件(如Visio,用于画流程图)。
4. 系统框架设计与模块连接
智能送药小车是一个典型的嵌入式闭环控制系统。其核心框架可以概括为“感知-决策-执行”。
硬件连接关键点(以STM32F103C8T6为例):
- 电机驱动:TB6612的PWMA/B接单片机PWM输出引脚(如TIM1_CH1, CH2),AIN1/AIN2, BIN1/BIN2接普通GPIO口控制方向,STBY接高电平。
- 编码器:编码器的A、B相接单片机的定时器编码器接口(如TIM2_CH1, CH2),这样可以硬件计数,非常准确。
- MPU6050:通过I2C接口连接(如PB6-SCL, PB7-SDA)。
- 红外循迹:每个传感器的DO输出口接一个单片机GPIO输入口。
- 舵机:信号线接单片机另一个定时器的PWM通道(如TIM3_CH1)。
- OpenMV:通过串口(UART)与STM32通信,发送识别到的数字结果。
电源管理警告:电机必须与单片机、传感器分开供电! 使用12V锂电池直接给电机驱动供电,同时通过降压模块降到5V给单片机和大部分传感器供电。数字地和电源地最终要共地,但功率路径要分开,避免电机启动时的电流冲击导致单片机复位。
5. 核心代码逻辑与功能实现
5.1 循迹PID控制
这是小车能走直线的关键。红外传感器返回的是二值信号(0或1,代表白或黑)。
调试要点:先调KP(比例),让小车能快速响应偏差但不振荡;再调KD(微分),抑制过冲和振荡;KI(积分)在循迹中通常很小,用于消除静态误差,但要注意积分饱和。
5.2 编码器与速度闭环
仅靠循迹无法保证速度稳定,尤其在转弯和启动时。编码器提供实时速度反馈。
5.3 陀螺仪数据融合(互补滤波)
MPU6050的原始数据噪声大且易漂移,需要融合加速度计和陀螺仪的数据来获得稳定的角度。
5.4 病房号识别与通信(OpenMV示例)
OpenMV端负责识别数字,并通过串口发送给STM32。
STM32端接收并解析数据:
5.5 主控状态机设计
小车的整个任务流程最适合用状态机(Finite State Machine)来管理,逻辑清晰,易于调试。
6. 系统调试与效果验证流程
电赛调试是“三分做,七分调”。必须有一套科学的验证流程。
6.1 分模块独立调试
- 电源与最小系统:先不接任何外设,确保单片机能够正常下载程序、运行流水灯测试。
- 电机驱动:编写测试程序,让两个电机分别正转、反转、停止。用逻辑分析仪或示波器查看PWM波形是否正常。
- 循迹模块:将小车抬起,用手在传感器下移动黑线,通过串口打印每个传感器的状态值,确保每个通道都能正确响应。
- 编码器:用手转动轮子,通过串口打印计数值,检查正反转计数是否准确增减。
- 陀螺仪:通过I2C读取MPU6050原始数据,计算静止时的角度,观察晃动时数据变化是否灵敏。
- 舵机:编写程序让舵机在0度、90度、180度几个位置转动,观察机械爪动作是否到位。
- 视觉模块:单独测试OpenMV,确保它能稳定识别出赛道上的数字,并通过串口助手查看发送的数据格式是否正确。
6.2 子系统联调
- 循迹走直线:只开启循迹PID,关闭速度环。将小车放在直道上,观察它能否沿直线行驶。重点调整
KP和KD。 - 速度闭环:开启编码器速度反馈。设定一个目标速度,观察实际速度能否快速跟随并保持稳定。调整速度环的PID参数。
- 转弯测试:在十字路口或弯道测试。可能需要根据弯道曲率动态调整基础速度或PID参数。
- 视觉-动作联动:模拟病房号出现,测试小车能否从“循迹状态”正确切换到“检测状态”并停下。
6.3 全系统集成测试
按照比赛任务书,进行端到端的完整流程测试:
- 任务开始:小车从起点出发。
- 循迹与识别:沿黑线行进,识别沿途病房号。
- 抓取动作:到达指定病房后,精准停车,机械臂完成抓取。验证点:停车位置是否精确(药品在爪心)?抓取是否牢固?
- 运送与投放:携带药品行驶至目标病房,再次精准停车,释放药品。验证点:药品是否准确投入目标区域?释放后机械臂是否复位,不影响返程?
- 返回与结束:返回起点或指定区域。验证点:全程用时?动作成功率(10次测试成功几次)?
记录每次测试的数据:如PID参数、识别成功率、停车误差、完成时间。这是优化和撰写报告的重要依据。
7. 资源占用与性能观察
对于STM32这类资源有限的微控制器,需要关注关键资源的使用情况。
- CPU负载:主循环周期(如10ms)是否稳定?中断服务程序(如编码器、串口)是否执行时间过长?避免在中断中进行复杂计算或
HAL_Delay。 - 内存(RAM):使用大的数组或缓冲区时(如图像缓冲区、串口接收缓冲),注意是否接近芯片极限。可以通过编译后的
.map文件查看。 - 定时器资源:
- 电机PWM:需要两个高级/通用定时器(如TIM1, TIM8)产生高频率PWM。
- 编码器接口:需要两个支持编码器模式的定时器(如TIM2, TIM3, TIM4)。
- 舵机PWM:需要一个通用定时器(如TIM3的另一通道或TIM5)。
- 系统滴答与延时:
HAL_Delay()依赖于SysTick。 - 超声波/其他传感器:可能还需要定时器做输入捕获。
- 规划:在CubeMX中初始化时就要统筹分配好,避免冲突。
- 外设接口:
- UART:至少两个,一个用于调试信息输出(接电脑),一个用于与OpenMV通信。
- I2C:用于连接MPU6050。
- SPI:可能用于连接某些显示屏或无线模块。
- ADC:可能用于检测电池电压。
优化建议:
- 将非实时任务(如调试信息格式化)放在主循环,而非中断中。
- 使用
DMA(直接存储器访问)来处理串口、ADC等数据搬运,解放CPU。 - 对于简单的状态标志位,使用位操作,节省内存。
8. 常见问题与排查方法
电赛调试中,90%的时间在解决问题。下表列出典型问题及排查思路:
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 单片机无法下载程序 | 1. boot引脚配置错误 2. 复位电路问题 3. ST-Link连接不良 4. 芯片锁死 |
1. 检查BOOT0/1电平 2. 按复位键 3. 重插ST-Link,换线 4. 尝试擦除芯片 |
1. BOOT0拉低,BOOT1随意 2. 检查复位电路电容、电阻 3. 使用FlyMcu等工具进行串口擦除 |
| 电机不转或只振动 | 1. 电源功率不足 2. PWM频率不对 3. 驱动模块使能端未拉高 4. 电机线虚焊 |
1. 测量电机供电电压带载时是否跌落 2. 用示波器看PWM波形 3. 检查驱动模块STBY引脚 4. 万用表测通断 |
1. 更换大容量电池,检查导线粗细 2. 电机PWM频率建议1k-10kHz 3. 将STBY接VCC或单片机高电平IO 4. 重新焊接 |
| 循迹不稳定,左右摇摆 | 1. PID参数不当 2. 传感器安装高度不一致 3. 传感器阈值未校准 4. 车体重心过高 |
1. 观察摆动周期和幅度 2. 测量各传感器距地面高度 3. 在赛道上实测黑白输出值 4. 观察小车是否容易侧倾 |
1. 减小KP或增大KD2. 调整传感器支架,确保平整 3. 根据实测值设置软件阈值 4. 降低重心,使用宽轮距 |
| 编码器计数不准 | 1. 接线错误(A/B相) 2. 定时器编码器模式配置错误 3. 机械抖动引起误计数 4. 计数溢出 |
1. 检查A、B相是否接反 2. 确认TIMx配置为Encoder Mode 3. 用手缓慢转动轮子观察计数 4. 检查计数器是否为32位 |
1. 交换A、B相接线 2. 使用CubeMX重新配置 3. 增加软件滤波或硬件RC滤波 4. 使用 int32_t类型存储计数值 |
| OpenMV识别不到数字 | 1. 光照条件变化 2. 摄像头焦距未调好 3. 识别区域ROI设置不对 4. 串口通信波特率不匹配 |
1. 在比赛现场灯光下重新测试 2. 手动调整镜头焦距直到清晰 3. 通过OpenMV IDE预览调整ROI 4. 核对双方波特率、停止位等 |
1. 增加图像预处理(如二值化自适应阈值) 2. 固定焦距后打胶防止松动 3. 根据色块动态确定ROI 4. 统一设置为115200, 8N1 |
| 小车在十字路口误判 | 1. 传感器数量少,路口特征判断逻辑简单 2. 速度过快,来不及处理 |
1. 打印所有传感器值,观察路口特征 2. 分析程序逻辑判断条件 |
1. 增加传感器数量(如8路) 2. 设计更鲁棒的路口判断算法(如连续多个中间传感器看到黑线) 3. 接近路口时减速 |
| 机械爪抓取失败 | 1. 舵机扭力不足 2. 抓取位置未对准 3. 机械结构卡顿 4. 舵机中位未校准 |
1. 空载测试舵机角度是否到位 2. 观察停车后药品与爪子的相对位置 3. 手动活动机械臂看是否顺畅 4. 上电初始化时舵机归位 |
1. 更换更大扭力舵机(如25kg) 2. 精确调整停车算法 3. 优化结构,加润滑油 4. 编写舵机校准程序,找到最佳抓取和释放角度 |
9. 竞赛实战技巧与备赛建议
- 模块化编程:将电机驱动、PID控制、传感器读取、状态机等写成独立的
.c/.h文件。方便调试和复用,也便于团队分工。 - 参数可配置:将PID参数、速度、延时时间等定义为宏或全局变量,并通过串口命令实时修改。这样可以在不重新烧录程序的情况下快速调整。
- 丰富的调试信息:利用串口打印关键变量(如传感器值、偏差、速度、状态)。前期可以频繁打印,后期优化时关闭或减少。
- 设计机械冗余:机械爪可以考虑双舵机联动增加抓力,车轮可以考虑使用防滑硅胶套。结构牢固是稳定性的基础。
- 电源管理:使用电量充足的电池,并在主循环中加入电池电压检测,电压过低时报警或停止运行,防止意外。
- 赛前模拟:尽可能在仿真的赛道上进行全流程、多轮次测试。记录每次的成功率、时间和异常情况。
- 报告与文档同步:在开发调试过程中,就同步撰写设计报告,截图保存调试波形、程序流程图、测试数据。最后关头再补报告会非常被动。
智能送药小车作为一个经典的电赛题目,其技术栈和问题具有普遍性。吃透这个项目,不仅能让你在比赛中更有竞争力,更能系统性地掌握嵌入式系统开发的精髓——从硬件选型、信号处理、控制算法到系统集成与调试。建议从最小系统开始,一个模块一个模块地攻克,最终将它们像拼图一样组合成一个稳定运行的智能体。这份经历,远比奖状本身更有价值。