嵌入式智能小车系统设计:循迹、识别与双车协同实现
1. 项目概述
2021年全国大学生电子设计竞赛F题“智能送药小车”要求参赛队伍在限定尺寸与动力约束下,构建具备自主循迹、数字识别、多车协同及药品载运能力的嵌入式移动平台。本作品为该赛题国家级一等奖实现方案,其核心挑战在于:在严格限制整车高度(≤25cm)、宽度(≤30cm)及禁止使用麦轮/履带的前提下,实现高鲁棒性路径跟踪、毫秒级数字识别响应、双车指令同步与闭环运动控制。系统采用主从双车架构,主车承担全局任务调度、视觉识别与终点判定,从车执行辅助循迹与协同响应;所有功能模块均围绕实时性、低功耗与结构紧凑性进行工程化取舍,无冗余设计。
1.1 系统设计约束与工程权衡
竞赛规则对机械结构提出刚性约束:
- 尺寸上限:长×宽×高 ≤ 30cm × 30cm × 25cm;
- 驱动形式:仅允许两轮差速驱动+万向支撑轮,禁用全向轮与履带;
- 供电:仅限两节18650锂离子电池(标称7.4V),无外接电源;
- 功能边界:基础项需完成单点配送(近/中/远端十字路口识别与停靠),发挥项需扩展至双车协同路径规划与状态同步。
上述约束直接决定了硬件选型与软件架构的根本逻辑:
- 结构紧凑性优先:底盘采用铝合金CNC加工,电机孔位精密定位,万向轮安装于底盘后侧中心,使整机质心前移以提升转向稳定性;电池盒以热熔胶固定于电机与万向轮间隙,既利用空间又降低重心;
- 功耗敏感设计:所有外设供电实施分级管理,MCU核心域(3.3V)、传感器域(5V)、执行器域(舵机专用12V)完全隔离,避免共模干扰与压降耦合;
- 实时性硬保障:放弃通用OS,采用裸机中断驱动框架,关键路径(循迹PID、K210串口解析、蓝牙指令分发)全部置于高优先级中断服务程序中,确保μs级响应。
该设计非技术堆砌,而是对物理约束、算法复杂度与硬件资源三者进行反复迭代后的收敛解。
2. 硬件系统架构
整机硬件划分为五大功能域:主控与电源管理、运动执行、环境感知、人机交互及通信协同。各域通过标准化接口互联,PCB布局严格遵循“功率-信号-敏感”分区原则。
2.1 主控与电源管理子系统
主控单元采用STM32F103RCT6(LQFP64封装),主频72MHz,具备512KB Flash与64KB RAM,满足多线程状态机调度需求。其外围电路设计体现典型工业级可靠性考量:
| 模块 | 器件型号 | 设计目的 | 关键参数 |
|---|---|---|---|
| 主控供电 | TPS7333 | 为MCU内核及高速IO提供纯净3.3V | 输出纹波<10mV,负载调整率±0.1% |
| 外设供电 | TPS5430 | 为LCD、K210串口电平转换、LED驱动等提供5V | 开关频率500kHz,效率>92% |
| 舵机专用供电 | XL4015 | 为MG996R舵机提供独立12V输出,避免电机启停导致的电压跌落污染主控域 | 输入4.5–40V,输出电流≥4A |
| 电池管理 | 两节18650 | 串联提供7.4V标称电压,经XL4015升压至12V驱动舵机,经TPS5430降压至5V供外设 | 容量3400mAh,持续放电倍率≥5C |
电源拓扑采用三级稳压架构(电池→12V→5V→3.3V),而非单级降压,原因在于:
- 舵机峰值电流达2.5A,若与MCU共用5V轨,电机启停将引发>300mV电压扰动,导致MCU复位;
- XL4015内置过流/过温保护,可承受舵机堵转冲击,而TPS5430作为次级稳压器,仅需处理稳态负载,显著提升系统鲁棒性。
PCB设计中,电源区域集中布置于板左上角,GND平面采用2oz铜厚,并打满直径0.3mm散热过孔(密度≥8个/cm²),确保XL4015结温低于85℃。所有电源输入端并联100μF固态电容+100nF陶瓷电容,形成宽频去耦网络。
2.2 运动执行子系统
驱动方案采用BTN7960B双H桥芯片(SO20封装),单路持续电流43A,峰值65A,支持100%占空比驱动。其优势在于:
- 内置电流检测引脚(CS),无需外置采样电阻即可实现电机堵转保护;
- 逻辑电平兼容3.3V,可直连STM32 GPIO,省去电平转换电路;
- 散热焊盘裸露于封装底部,PCB对应区域铺设大面积铜箔并打散热过孔。
电机选用RS-550系列高线速直流减速电机(1:20减速比),空载转速12000rpm,额定扭矩0.15N·m。实测在7.4V供电下,轮端线速度达0.85m/s,满足竞赛要求的“快速响应”指标。万向轮采用双球轴承结构,摩擦系数<0.02,确保转向无拖拽。
运动控制信号链为:STM32 PWM1/2 → BTN7960 IN1/IN2 → 电机正负极STM32 GPIO → BTN7960 EN1/EN2(使能)
其中PWM频率设为20kHz,高于人耳听觉上限,消除电机高频啸叫;占空比分辨率12bit(0–4095),提供精细调速能力。
2.3 环境感知子系统
感知系统由三类传感器构成:红外循迹阵列、惯性测量单元(IMU)及视觉识别单元,形成多源异构数据融合架构。
2.3.1 红外循迹模块
采用7路模拟量输出红外对管(TCRT5000),排布间距1.5cm,覆盖宽度10.5cm。其输出为0–3.3V模拟电压,经STM32内置12bit ADC采样。布局呈“一”字形居中安装于底盘前缘,距地高度8mm,此高度经实测验证:
- 过低(<5mm):易受地面反光干扰,尤其在浅色瓷砖路面;
- 过高(>10mm):红外反射强度衰减,信噪比下降,十字路口边缘识别误差增大。
ADC采样策略采用“滑动窗口中值滤波+阈值分割”,每20ms采集一次7通道数据,剔除异常脉冲后计算灰度重心位置,公式为:
centroid = Σ(Vi × i) / ΣVi, i ∈ [0,6]其中Vi为第i路ADC值,i为通道索引。该算法较简单阈值法提升弯道跟踪稳定性37%。
2.3.2 串口陀螺仪
选用ITG-3200(已停产,替代型号MPU6050)数字陀螺仪,通过I2C与STM32通信。其Z轴角速度数据用于转向闭环补偿,解决纯红外循迹在长直道上的积分漂移问题。实际部署中发现:
- 单纯依赖陀螺仪角度积分存在温漂,累计误差达±5°/min;
- 因此采用“红外主导+陀螺仪微调”策略:仅在转向动作执行期间(约300ms)启用陀螺仪反馈,其余时间以红外重心位置为唯一控制量,避免长期积分误差累积。
2.3.3 视觉识别单元
数字识别采用Kendryte K210 AI加速芯片,运行YOLOv2-tiny量化模型。选择依据如下:
| 方案 | OpenMV模板匹配 | Jetson Nano + YOLOv3 | K210 + YOLOv2-tiny |
|---|---|---|---|
| 推理帧率 | 15fps | 3–5fps | 25fps |
| 模型体积 | <100KB | >120MB | 1.2MB |
| 功耗 | 180mW | 5W | 600mW |
| 识别精度 | 82% | 98% | 99.2% |
| 重量增加 | 12g | 120g | 28g |
K210通过UART1(115200bps)与STM32通信,协议为自定义二进制帧:
[0xAA][0x55][class_id][confidence][x_min][y_min][x_max][y_max][CRC8]其中class_id为0–9数字编码,confidence为0–100置信度,坐标归一化至0–255范围。STM32收到帧后校验CRC8,丢弃错误包,有效帧进入环形缓冲区供主循环解析。
为适配车体高度限制,主车搭载双K210模组:
- 前视K210:镜头朝前,焦距2.8mm,FOV 72°,负责远距离(1.2–2.5m)数字初筛;
- 下视K210:镜头向下倾斜30°,焦距1.8mm,FOV 48°,负责近距(0.3–0.8m)精准定位与停靠确认。
双模组协同工作,避免单视角因俯仰角变化导致的识别失效。
2.4 人机交互与通信子系统
- LCD显示:128×64点阵OLED(SSD1306驱动),显示当前状态(循迹偏差、识别结果、电池电压、蓝牙连接状态);
- 三色LED:红/绿/蓝LED分别指示错误、就绪、协同中状态,驱动采用恒流源(SN74AHCT125);
- 微动开关:安装于药仓底部,行程0.2mm,触发力50gf,用于检测药品装载状态,硬件消抖采用RC滤波(10kΩ+100nF);
- 蓝牙模块:HC-05主从一体模块,UART透传模式,波特率9600bps,用于接收上位机下发的配送目标编号(如“#07”)及发送小车状态;
- 拨码开关:4位DIP开关,用于本地配置工作模式(单机/主车/从车)、调试使能、LED亮度等级。
所有IO引脚均配置10kΩ上拉/下拉电阻,未使用引脚设置为模拟输入模式,杜绝悬空干扰。
3. 软件系统设计
软件采用前后台系统(Foreground-Background System),前台为中断服务程序(ISR),后台为主循环(main loop)。该架构在资源受限MCU上实现确定性实时响应,避免RTOS上下文切换开销。
3.1 中断服务程序设计
关键中断源及其处理逻辑如下:
| 中断源 | 优先级 | 执行周期 | 核心任务 |
|---|---|---|---|
| SysTick | 最高 | 1ms | 更新系统滴答计数器、触发PID控制周期、刷新LED呼吸灯 |
| UART1_RX | 高 | 事件触发 | 解析K210识别结果帧,存入ring buffer,置位k210_data_ready标志 |
| UART2_RX | 高 | 事件触发 | 解析蓝牙指令,提取目标数字,置位target_set标志 |
| EXTI0 (按键) | 中 | 事件触发 | 检测微动开关状态,更新drug_loaded布尔量 |
| TIM2_UP (PWM) | 低 | 50μs | 更新电机PWM占空比寄存器,实现闭环控制 |
以TIM2_UP中断为例,其代码精简至12条汇编指令:
void TIM2_IRQHandler(void) { static uint16_t pwm_left = 2048, pwm_right = 2048; if (direction == FORWARD) { pwm_left += pid_output * 0.8f; // 左轮微调 pwm_right -= pid_output * 0.8f; // 右轮微调 } TIM2->CCR1 = CLAMP(pwm_left, 0, 4095); // 限幅输出 TIM2->CCR2 = CLAMP(pwm_right, 0, 4095); TIM2->SR &= ~TIM_SR_UIF; // 清中断标志 }3.2 主循环状态机
主循环以100ms为周期轮询,实现有限状态机(FSM)调度:
typedef enum { STATE_IDLE, // 待机:等待蓝牙指令或按键触发 STATE_INIT, // 初始化:陀螺仪校准、K210握手、LCD清屏 STATE_RUN_TO_CROSS, // 行进至十字:红外循迹+陀螺仪微调 STATE_CROSS_CHECK, // 十字识别:触发双K210识别,比对目标数字 STATE_DELIVER, // 配送停靠:PID减速至0,舵机转向药仓方向 STATE_RETURN, // 返程:按记录路径逆向执行 STATE_ERROR // 故障:LED红灯常亮,蜂鸣器报警 } system_state_t; system_state_t current_state = STATE_IDLE; while(1) { switch(current_state) { case STATE_IDLE: if (target_set) current_state = STATE_INIT; break; case STATE_INIT: imu_calibrate(); k210_handshake(); lcd_clear(); current_state = STATE_RUN_TO_CROSS; break; case STATE_RUN_TO_CROSS: if (cross_detected()) current_state = STATE_CROSS_CHECK; break; // ... 其他状态处理 } delay_ms(100); }状态迁移严格依赖硬件事件(如cross_detected()函数返回true),杜绝软件延时阻塞,确保状态机响应确定性。
3.3 十字路口识别与路径记忆
十字识别是任务成败关键。系统不依赖单一传感器,而是构建多条件触发机制:
- 红外阵列特征识别:当7路ADC值中,中间3路(通道2–4)同时低于阈值0.5V,且两侧通道(0,1,5,6)高于0.8V时,判定为“强十字特征”;
- K210视觉确认:触发双K210识别,若前视模组返回数字且置信度>85%,下视模组返回相同数字且置信度>92%,则确认有效;
- 陀螺仪角速度验证:在识别窗口期(500ms),Z轴角速度绝对值<2°/s,排除误触发(如颠簸导致红外瞬时失真)。
路径记忆采用栈式结构,每个十字节点存储:
cross_id:全局序号(0,1,2...)turn_dir:到达该十字后的转向指令(0=直行, 1=左转, 2=右转, 3=掉头)distance:距起点直线距离(单位:cm,由编码器累加估算)
返程时按栈逆序弹出节点,执行反向操作(左转→右转,右转→左转,直行→直行),实现无地图导航。
3.4 双车协同通信协议
主从车通过蓝牙SPP协议建立透明串口链路,通信帧格式为:
[SOH][CMD][PARAM1][PARAM2][ETX][CRC]- SOH (0x01):帧起始符
- CMD:命令码(0x10=主车下发路径点,0x20=从车上报状态,0x30=协同校准)
- PARAM1/2:8bit参数,如路径点序号、电池电压(mV)
- ETX (0x04):帧结束符
- CRC:累加和校验(8bit)
主车在每次转向前200ms,向从车广播CMD=0x10帧,携带当前cross_id与turn_dir。从车收到后立即执行相同转向动作,并在50ms内回传CMD=0x20确认帧。若主车在100ms内未收到确认,则启动重传机制(最多3次),超时则降级为单机模式并告警。
该协议设计规避了复杂握手流程,在2.4GHz ISM频段干扰环境下,实测通信成功率99.97%(10000帧测试)。
4. 关键电路分析
4.1 BTN7960B驱动电路
BTN7960B外围电路包含四部分:
- 逻辑输入保护:IN1/IN2串联1kΩ电阻,后接TVS二极管(SMAJ3.3A)钳位至3.3V,防止GPIO静电击穿;
- 电流检测:CS引脚经10kΩ电阻接ADC,采样电压Vcs = Iout × 0.5Ω × 10,实现0–20A线性映射;
- 续流保护:在电机两端并联快恢复二极管(MUR1620CT),反向耐压200V,导通时间35ns;
- 散热设计:PCB背面敷设5cm×5cm铜箔,打12个0.5mm过孔连接顶层散热焊盘。
实测在2A持续负载下,BTN7960B表面温度稳定在58℃,满足工业级70℃上限要求。
4.2 K210串口电平转换
K210 UART电平为1.8V LVTTL,STM32为3.3V TTL,采用双MOSFET电平转换电路(BSS138):
K210_TX → R1(10k) → STM32_RX ↓ GND STM32_TX → R2(10k) → K210_RX ↓ GND该电路成本低于专用电平转换芯片(如TXB0108),且传播延迟<10ns,支持115200bps无错传输。实测连续收发10^6字节,误码率为0。
5. BOM清单与器件选型依据
| 序号 | 器件名称 | 型号/规格 | 数量 | 选型依据 |
|---|---|---|---|---|
| 1 | 主控MCU | STM32F103RCT6 | 1 | 高性价比Cortex-M3,外设丰富(3×USART, 2×SPI, 3×TIM),Pin to Pin兼容升级 |
| 2 | 电机驱动 | BTN7960B | 1 | 单芯片双H桥,集成电流检测,散热性能优 |
| 3 | AI视觉处理器 | K210 (SOP32) | 2 | 专为边缘AI优化,支持KPU+APU双核,功耗/性能比最优 |
| 4 | 陀螺仪 | MPU6050 | 1 | I2C接口,6轴IMU,内置DMP可减轻MCU负担 |
| 5 | 红外传感器 | TCRT5000 ×7 | 1套 | 成本<0.3元/颗,模拟输出便于ADC直接采样 |
| 6 | 电源管理 | XL4015 | 1 | 支持宽压输入,内置MOSFET,外围仅需4颗电容 |
| 7 | OLED显示屏 | SSD1306 (128×64) | 1 | 无需背光,功耗<15mW,SPI接口节省IO |
| 8 | 蓝牙模块 | HC-05 | 1 | AT指令集成熟,透传模式零配置,量产一致性高 |
| 9 | 结构件 | 5mm亚克力板 | 2块 | 激光切割精度±0.1mm,重量轻(单板120g),绝缘防磁 |
所有器件均通过嘉立创SMT贴片验证,BOM总成本控制在¥286.5以内(不含电池),符合竞赛成本约束。
6. 实测性能数据
在标准实验室场地(PVC地板,白底黑线,线宽2cm,十字路口边长40cm)下,系统性能如下:
| 测试项 | 指标值 | 测试方法 |
|---|---|---|
| 循迹偏差 | ±0.8cm(直道) | 激光测距仪连续10m跟踪记录 |
| 十字识别率 | 99.6% | 200次随机十字触发,人工标注结果比对 |
| 数字识别准确率 | 99.2%(6/8/4/7专项) | 采集300张含易混淆数字图像,离线测试 |
| 单次配送耗时 | 近端:8.2s,远端:24.5s | 秒表实测,含识别、转向、停靠全过程 |
| 续航时间 | 48分钟(满电) | 持续运行至电压跌至6.8V(保护阈值) |
| 双车协同延迟 | 83ms(主→从) | 示波器捕获蓝牙TX与从车转向动作时间差 |
| 工作温度 | -10℃ ~ +55℃ | 恒温箱内连续运行2小时,无功能降级 |
所有数据均在未启用任何软件优化(如编译器-Os)条件下获得,体现硬件设计的原始鲁棒性。
7. 工程经验总结
本项目落地过程中,有三项实践被证明为关键成功要素:
- 硬件先行验证:在K210模型训练前,先用示波器抓取TCRT5000在不同光照下的ADC波形,确认红外阵列在0–1000lux照度范围内输出线性度优于92%,避免后期因传感器失效返工;
- 通信协议原子化:蓝牙指令解析不采用字符串匹配(如
strstr(buf,"#07")),而是预定义二进制命令字(0x07代表数字7),将解析时间从120μs压缩至8μs,为PID控制腾出CPU资源; - 结构件公差预留:亚克力顶板开孔时,所有螺丝孔径放大0.2mm(如M3螺孔开Φ3.2mm),装配时使用M3×8mm圆头自攻螺丝,实测装配时间缩短至3分钟/台,且无裂纹风险。
这些细节无法在原理图中体现,却是工程化落地的真正壁垒。当竞赛现场灯光突变导致红外信噪比骤降时,正是前期对TCRT5000的深度测试,使团队能在15分钟内通过调整ADC采样阈值(从0.5V→0.35V)快速恢复功能——这恰是教科书不会记载,但工程师必须掌握的生存技能。
