
1. 项目概述从零到一的送药小车实战复盘最近刚带着团队完成了一个送药小车的集训项目从最初的方案构思到最后的场地调试整个过程可以说是既烧脑又充满成就感。这个项目听起来简单——不就是一个小车把药从A点送到B点吗但真正上手后你会发现它融合了机械结构、电子控制、嵌入式编程、传感器应用甚至简单的路径规划算法是一个典型的综合性创客或机器人入门项目。无论是用于高校的工程训练、科创比赛还是作为个人学习嵌入式系统和自动化的练手项目都非常有价值。它解决的问题很具体在模拟的医院病房、养老院或隔离区域实现无接触式的定点药品配送减少人员接触和交叉感染风险同时也能锻炼解决实际工程问题的能力。接下来我会把我们这次集训中趟过的路、踩过的坑以及最终验证可行的方案进行一次彻底的梳理和复盘。内容会涵盖从整体设计思路、核心硬件选型、软件框架搭建到具体的循迹、避障、抓取机构实现以及调试过程中那些让人头疼的常见问题和解决技巧。目标是让你看完后能自己动手复现一个基础功能完善的送药小车或者至少能对其中涉及的技术点有一个清晰、落地的认识。2. 整体设计与核心思路拆解2.1 需求分析与功能定义送药小车不是一个天马行空的概念它的设计必须围绕核心需求展开。我们首先明确了几个关键功能点自主移动这是基础。小车需要能在地面上稳定行走并具备基本的循迹或导航能力以沿着预设路径如地面上的黑线或通过坐标定位到达目标点。精准送达小车需要知道何时到达“发药点”和“送药点”并准确停下。这通常通过识别地面标记如十字线、AprilTag码或到达指定坐标来实现。药品载运与交接小车需要一个机构来携带药品模拟药盒并在目的地完成“交付”。这个交付可以是简单的倾倒、推出也可以是更复杂的机械臂抓取放置。环境感知与避障在实际环境中路径上可能出现临时障碍如行人、掉落的物品小车需要能检测并安全绕行避免碰撞。状态指示与交互最好能有简单的灯光或声音提示当前状态如运行中、已到达、故障方便观察。基于这些功能我们确定了以“巡线信标识别”为主、辅以超声波避障的方案。选择巡线是因为它在室内结构化环境中简单可靠成本极低信标如RFID卡或视觉标签用于精确标定发药点和病房点。这个方案在复杂度和可靠性之间取得了很好的平衡。2.2 硬件平台选型与考量硬件是小车的骨架选型直接决定了项目的上限和调试难度。我们对比了几种常见平台主控板Arduino Uno/Mega经典入门选择生态丰富库函数多对于新手极其友好。但处理复杂传感器融合或高级算法时性能稍显不足。对于基础巡线避障送药Uno足够。STM32系列性能强大外设丰富更贴近工业应用适合希望深入学习嵌入式实时系统的同学。但开发环境搭建和调试门槛比Arduino稍高。树莓派Raspberry Pi如果项目涉及复杂的图像识别如直接通过摄像头识别门牌号、Wi-Fi通信或上层决策算法树莓派是更好的选择。它可以运行完整的Linux系统但实时性控制不如单片机直接通常需要与Arduino或STM32结合使用树莓派做决策单片机做实时控制。我们的选择为了聚焦于移动机器人控制的核心逻辑并确保实时性和稳定性我们选择了**STM32F103C8T6蓝色药丸板**作为主控。它性能足够价格便宜并且可以通过PlatformIO或STM32CubeIDE进行开发既能享受现代开发工具的便利又能深入底层。电机与驱动电机类型普通直流减速电机即可满足移动需求。需要注意电机的转速和扭矩参数。转速太高小车会“飘”不易控制扭矩太小可能爬不了坡或带不动负载。驱动模块必须使用电机驱动模块如L298N、TB6612FNG来连接主控板和电机。主控板的IO口驱动能力太弱无法直接驱动电机。TB6612FNG比L298N效率更高发热更小体积也更小巧是我们推荐的选择。传感器套件循迹模块通常使用红外对管式传感器TCRT5000。它发射红外光并接收反射光根据地面颜色黑/白反射率不同输出数字信号。一般需要3-5个并排安装用于检测小车是否偏离黑线。避障模块超声波传感器HC-SR04最常用通过测量声波往返时间计算距离。用于检测前方障碍物。定位/识别模块用于精确站点识别。RFID读卡器MFRC522是一个低成本可靠方案在发药点和每个病房门口地面贴一个RFID卡小车读到特定卡号即停车。另一种方案是使用OpenMV或ESP32-CAM等摄像头模块识别AprilTag或ArUco码视觉方案更灵活但复杂度更高。电源务必重视电机启动瞬间电流很大会导致电压骤降可能引起主控板复位。建议使用独立的18650锂电池组两节串联7.4V为电机驱动供电并通过一个降压模块如LM2596稳定输出5V为控制板和传感器供电。电池容量建议在2000mAh以上。3. 机械结构与电路搭建实操3.1 车体组装与机构设计车体是基础稳定第一。你可以购买现成的智能小车底盘套件这能节省大量时间。如果自制需要注意重心电池、主控板等重物应尽量放在车体底部和中心位置降低重心防止急停或转弯时翻车。轮距与轴距合理的轮距左右轮距离和轴距前后轮距离影响转弯灵活性和直线稳定性。通常四轮小车采用后轮差分驱动两个主动轮独立控制前轮使用万向轮。药品载运机构我们设计了一个简单的“升降推杆”式机构。用一个舵机控制一个可以翻转或平移的托盘。当小车到达送药点时舵机旋转一定角度将托盘上的药盒“推”出去。舵机直接由主控板PWM信号控制选择扭矩足够如9g舵机以上的型号即可。固定舵机和托盘时要确保动作顺畅不卡顿。3.2 电路连接与布线规范电路连接是故障高发区务必仔细。电源分区如前所述电机电源与控制电源最好分开。TB6612FNG的VM电机电源接7.4V电池VCC逻辑电源接控制板的5V。控制板的5V再由电池通过降压模块提供。共地所有模块主控板、驱动板、传感器的GND必须连接在一起形成共同的参考零电位这是电路正常工作的基础。信号线连接TB6612FNG的AIN1/AIN2、BIN1/BIN2控制电机转向和PWMA/PWMB控制电机速度接STM32的普通IO口和PWM输出口。循迹模块的DO数字输出口接STM32的IO口并启用上拉或下拉电阻根据模块输出逻辑通常在代码中配置内部上拉即可。超声波传感器的Trig触发和Echo回响引脚接IO口。RFID模块的SPI接口SCK, MISO, MOSI, NSS接STM32对应的SPI引脚。布线技巧使用杜邦线时尽量用不同颜色区分电源红色5V/VCC、地线黑色GND和信号线黄、绿等。线不要太长避免缠绕必要时用扎带固定。混乱的布线是调试时的噩梦。实操心得上电前务必、务必、务必用万用表通断档检查所有电源线和地线连接确保没有短路特别是电池正负极直接相连。可以先不接电机只给控制部分上电测试所有传感器读数是否正常再连接电机进行调试。这个小习惯能避免至少50%的硬件损坏风险。4. 核心控制逻辑与软件实现4.1 开发环境与基础驱动我们使用PlatformIO STM32框架进行开发。首先需要为每个外设编写或移植基础驱动函数电机驱动函数封装一个Motor_SetSpeed(Motor_Left, speed)这样的函数内部实现将speed值正反转和速度转换为对TB6612FNG控制引脚和PWM占空比的设置。循迹传感器读取编写一个函数读取多个红外传感器的状态返回一个值或状态码例如0b00100表示中间传感器压线小车应直行0b00010表示略微右偏应向左微调。超声波测距函数编写触发和测量回声高电平时间的函数并换算为距离厘米。RFID读取函数初始化SPI调用MFRC522库函数循环读取卡号当读到预设卡号时返回成功。4.2 巡线算法PID的引入与调参最简单的巡线是“开关量控制”哪个传感器检测到黑线就向反方向打轮。但这样小车会剧烈摇摆速度也快不起来。要让小车平滑、快速巡线必须引入PID控制算法。 我们将多个循迹传感器的状态转化为一个“偏差值”。例如5个传感器从左到右编号为1-5。全部在白线上偏差为0最左边压线为-2最右边压线为2中间压线为0。这个偏差值就是PID的输入Process Variable。P比例与当前偏差成正比的控制量。偏差越大转弯力度越大。这是主要作用项。I积分累积历史偏差用于消除静态误差比如小车始终有微小的固定偏向。D微分根据偏差变化率进行控制能预测偏差趋势抑制振荡让响应更平稳。在STM32上实现一个离散PID并不难。核心是调参这是一个“玄学”过程但有一定章法先调P将I和D设为0。逐渐增大P直到小车能跟着线走但会在线左右频繁振荡。这个P值就是临界振荡点。再调D保持P为临界值的50%-70%逐渐加入D。D能有效抑制P引起的振荡。观察小车是否变得更平稳。D太大反而会引入高频抖动。最后调I如果小车在长直道上能走直但在弯道后出现稳态误差无法回到线中心可以加入一个很小的I值来消除它。I值一定要小否则容易积分饱和导致控制失控。注意事项PID计算输出的控制量最终要映射到左右电机的速度差上。例如speed_left base_speed output; speed_right base_speed - output;。base_speed是小车的基础速度output是PID计算出的修正值。务必对output进行限幅防止超过电机能接受的最大速度差。4.3 多任务状态机设计小车的行为不是单一的它需要根据环境变化在不同状态间切换。用一个状态机State Machine来管理是最清晰的方法。我们定义了以下几个核心状态typedef enum { STATE_IDLE, // 空闲待命 STATE_LINE_FOLLOWING, // 巡线中 STATE_OBSTACLE_AVOID, // 避障中 STATE_AT_STATION, // 到达站点识别到RFID STATE_DELIVERING, // 执行交付动作舵机动作 STATE_RETURNING // 返回起点 } SystemState_t;主循环中根据当前状态执行相应的函数并根据传感器输入进行状态转移。例如在STATE_LINE_FOLLOWING状态下持续运行PID巡线当超声波检测到障碍物时状态转移到STATE_OBSTACLE_AVOID执行绕障例程当RFID读到指定卡号状态转移到STATE_AT_STATION停车并准备交付。这种设计使得程序结构清晰易于调试和扩展。比如未来想增加一个“手动遥控”状态只需要新增一个状态和对应的处理函数即可。4.4 交付机构与精准停车控制交付动作的可靠性取决于停车精度。单纯靠RFID触发停车可能因为惯性滑过一点。我们采用了“RFID粗定位 巡线细调”的策略当RFID读到站点卡号时立即进入STATE_AT_STATION状态。在该状态下小车立即大幅减速但不是急停并切换到更灵敏的PID参数对地面上的“T”型或“十”字型停车线进行精确对中。当所有循迹传感器都检测到黑线表示车头完全对准停车线时才真正停止电机。延时稳定后控制舵机执行推药动作动作完成后等待2秒模拟交付完成然后舵机归位小车根据任务状态进入下一个状态如返回或前往下一站。舵机控制使用STM32的硬件PWM确保角度控制精准。注意在程序初始化时给舵机一个明确的初始位置。5. 系统集成调试与问题排查实录5.1 分模块调试流程不要试图一次性写好所有代码然后上电测试那会让人崩溃。必须分模块调试电机单独测试写一个简单程序让两个电机正转、反转、变速确认驱动板和接线正确电机转向是否符合预期如果转向反了交换电机线或修改程序逻辑。循迹模块测试将小车抬起用手移动让传感器划过黑线通过串口打印每个传感器的状态确认其响应灵敏度和阈值是否合适有些模块上有电位器可调灵敏度。超声波测试在障碍物前后移动打印测量距离确认数值是否连续、准确。注意避开强噪声环境。RFID测试分别读取不同地点的卡片打印卡号确保在有效距离通常1-5cm内能稳定读取。舵机测试编写程序让舵机在0度、90度、180度几个关键点转动观察实际角度与程序设定是否一致。每个模块都调通了再开始写集成逻辑。5.2 典型问题与解决方案速查表以下是我们在调试中遇到的最具代表性的问题及解决方法问题现象可能原因排查步骤与解决方案上电后主控板无反应或程序不运行1. 电源问题电压不足、接反2. Boot模式配置错误3. 晶振不起振1. 用万用表测量5V和3.3V电压是否正常。2. 检查STM32的BOOT0和BOOT1引脚电平通常都接地从主Flash启动。3. 检查外部晶振电路尝试使用内部晶振HSI启动测试。电机不转或只单向转动1. 电机驱动板供电不足2. 控制信号线连接错误或虚焊3. 程序PWM输出配置错误1. 测量驱动板VM端电压确保电池有电且连接牢固。2. 用逻辑分析仪或示波器检查STM32给驱动板的控制引脚是否有信号变化。3. 检查代码中对应GPIO和定时器PWM输出配置是否正确。巡线时小车剧烈摇摆或跑飞1. PID参数不当P太大D太小或为02. 传感器安装高度不一致或离地太远/太近3. 电机基础速度过高1. 重新校准PID遵循“先P后D再I”的原则适当降低P增益。2. 调整传感器支架确保所有探头离地高度一致通常3-10mm。3. 降低base_speed让小车慢下来先走稳。超声波读数不稳定或始终为01. 触发和回声信号线接反或接触不良2. 测量周期太短上次回声未结束就触发下一次3. 障碍物表面吸收声波如海绵1. 检查接线确保Trig和Echo没有接错。2. 在代码中增加两次测量之间的延时建议至少60ms。3. 更换为表面平整的障碍物测试。RFID偶尔读不到卡1. 读卡距离过远或卡片倾斜2. 电源干扰电机工作时拉低电压3. SPI通信速率过高1. 确保卡片平行贴近读卡器天线中心区域。2. 为读卡器模块的VCC增加一个100uF的电解电容进行滤波。3. 尝试降低SPI时钟频率。执行动作如舵机转动时主控复位大电流负载导致电源电压瞬间跌落1. 为舵机单独供电使用另一组电池或大电流BEC。2. 在控制板电源入口处增加大容量如1000uF电容储能。3. 在舵机电源线上加磁珠滤波。5.3 场地适应性与最后优化当小车在桌面上运行良好后转移到实际比赛或演示场地可能会遇到新问题地面反光光滑地面可能导致红外循迹误判。解决方法适当调低传感器灵敏度或者在传感器探头处加装遮光罩用热缩管或黑色电工胶带。光线干扰强烈的日光灯或太阳光可能含有红外成分干扰循迹模块。尝试使用调制型红外传感器如灰度传感器替代普通的数字式或者用摄像头进行灰度巡线。路径交叉口处理在十字路口小车需要判断直行还是转弯。这需要结合RFID或视觉标签或者在程序逻辑中做特殊处理例如检测到连续多个传感器压线超过一定时间则判定为十字路口根据任务列表执行转弯动作。电池电量监测长时间运行后电池电压下降电机乏力PID特性会变化。可以增加一个ADC读取电池电压的功能当电压低于阈值时让小车鸣笛或闪灯报警并自动返回充电点如果设计了的话。整个调试过程是对耐心和系统思维能力的极大考验。最有效的工具除了万用表、示波器就是串口调试助手。将关键变量如PID输出、传感器原始值、状态机当前状态实时打印出来是洞察小车“内心世界”的最佳窗口。6. 项目总结与进阶思考经过这次高强度的集训一个功能完整的送药小车从图纸变成了现实。回顾整个过程最重要的体会是“简单的事情系统化系统的事情模块化”。把一个复杂项目分解成感知、决策、执行、供电等独立模块逐一攻克最后进行系统集成和联调这个方法论适用于绝大多数嵌入式开发项目。对于想进一步深入的同学这个项目还有巨大的扩展空间上位机监控与调度通过蓝牙或Wi-Fi模块如ESP-01S或HC-05将小车状态实时发送到电脑或手机APP并可以远程下发任务指令。SLAM建图与自主导航升级为树莓派主控搭配激光雷达如RPLidar A1使用ROS机器人操作系统实现自主构建环境地图和路径规划彻底摆脱巡线。多车协同如果有两辆以上小车可以研究简单的任务调度和交通避让算法模拟更真实的物流场景。机械臂集成将固定的交付机构替换为多自由度机械臂实现更灵活、更拟人的抓取和放置动作。送药小车项目就像一把钥匙它为你打开了机器人技术和嵌入式系统的大门。里面涉及的每一个知识点——电路设计、微控制器编程、传感器应用、控制算法、机械结构——都值得深入钻研。希望这份总结能为你提供一张清晰的“地图”让你在动手实现自己小车的过程中少走一些我们曾经走过的弯路。