
基于 STM32 的避障循迹小车设计与实现一、系统功能总览二、核心模块选型对比2.1 主控模块选型2.2 循迹模块选型2.3 避障模块选型2.4 电机驱动模块选型2.5 无线通信模块选型三、系统接线总表四、系统软件设计4.1 主程序流程设计4.2 循迹控制流程设计4.3 避障控制流程设计4.4 电机驱动程序设计4.5 蓝牙遥控程序设计五、系统实现与测试5.1 硬件焊接与调试5.2 软件调试5.3 功能测试结果六、总结基于 STM32 的避障循迹小车设计与实现避障与循迹是智能小车自主导航的两项基础能力避障让小车实时检测并规避前方障碍物循迹让小车沿预定路径行驶。本文基于 STM32F103C8T6 单片机设计了一款三模式智能小车TCRT5000 红外对管完成黑线循迹HC-SR04 超声波测距完成避障JDY-31 蓝牙模块配合手机 APP 实现无线遥控三种模式可通过按键或 APP 一键切换。文章完整给出模块选型论证、硬件电路设计、软件流程与调试过程可直接作为智能小车类毕业设计的参考方案。一、系统功能总览功能编号功能名称功能说明F1黑线循迹左右双 TCRT5000 检测地面黑线自动修正行驶方向F2超声波避障HC-SR04 实时测距低于阈值时左转绕行规避障碍F3蓝牙遥控JDY-31 连接手机 APP实现前进/后退/左转/右转/停车F4模式切换按键或蓝牙指令切换循迹/避障/遥控三种工作模式F5电机驱动L298N 双通道驱动两路直流电机支持方向与 PWM 调速控制二、核心模块选型对比2.1 主控模块选型对比项方案1STM32F103C8T6方案2ESP32-WROOM-32内核ARM Cortex-M3主频 72 MHz双核 Xtensa LX6主频 240 MHz存储64 KB Flash 20 KB SRAM4 MB Flash 520 KB SRAM无线能力无需外接蓝牙模块内置 Wi-Fi 蓝牙双模开发生态工具链成熟社区资源广泛生态较新本系统的核心是多传感器数据采集与电机时序控制无线通信仅承担少量指令传输且已由独立蓝牙模块完成。STM32F103C8T6 处理能力充足、功耗低、性价比高长期稳定性与广泛的应用基础为项目提供了额外保障。选择方案1STM32F103C8T62.2 循迹模块选型对比项方案1红外对管 TCRT5000方案2激光反射式 LIDAR-Lite v3检测方式950 nm 红外反射识别黑线/白线激光反射精度高、抗光扰强复杂度与成本价格经济易于安装使用成本高集成复杂适用场景预算有限、场景简单的循迹任务高精度、复杂光照环境循迹任务只需判断小车下方是否存在黑线红外对管以较低的价格提供了足够的性能且易于集成和维护是性价比高、易于实施的方案。选择方案1红外对管 TCRT50002.3 避障模块选型对比项方案1HC-SR04方案2GROVE - Ultrasonic Ranger测距范围2400 cm40 kHz3500 cm探测角度较小更宽抗噪能力常规改进信号处理抗噪更强成本与资料低廉教程与示例代码丰富较高HC-SR04 性价比优良、接口简单、社区资料丰富其测距能力满足小车避障的基本需求是入门与中等复杂度项目的实用选择。选择方案1HC-SR042.4 电机驱动模块选型对比项方案1L298N方案2TB6600类型双通道全桥支持双直流电机步进电机驱动微步进技术驱动能力最大 46 V双电机同时驱动最高 4.5 A适合高功率电机效率与散热大电流下需注意散热低损耗、低发热成本与接口低成本、接口直观较高小车采用双直流电机差速转向L298N 双通道输出正好一一对应接口简单、成本效益高在适当散热措施下完全满足需求。选择方案1L298N2.5 无线通信模块选型对比项方案1JDY-31蓝牙 4.0方案2NRF24L012.4 GHz 射频传输距离1020 m100 m 以上速率与功耗1 Mbps低功耗2 Mbps功耗较高兼容性与主流智能设备无缝配对AT 命令调试需成对使用配置复杂小车遥控的数据量小、通信距离要求不高JDY-31 低功耗、配置简单、与手机直连的兼容性使其成为理想选择。选择方案1JDY-31三、系统接线总表系统以 STM32F103C8T6 最小系统8 MHz 晶振 复位电路 3.3 V 供电为核心各模块通过 GPIO 连接模块模块引脚单片机引脚说明TCRT5000 循迹左OUTPA1数字输入检测黑线电平TCRT5000 循迹右OUTPA2数字输入检测黑线电平HC-SR04 超声波TrigPA3数字输出10 µs 触发脉冲EchoPA4数字输入定时器测量高电平时间L298N 电机驱动IN1IN4PB0PB3电机方向控制信号ENA / ENBPA6 / PA7PWM使能端接 PWM 引脚调节电机速度OUT1/OUT2、OUT3/OUT4电机 A / 电机 B电机输出端子VCC / GND12V / 共地驱动电源须与单片机共地JDY-31 蓝牙TXDPA10USART1_RX与单片机 RX 交叉连接RXDPA9USART1_TX与单片机 TX 交叉连接VCC / GND3.3V / GND模块供电模式切换按键信号端PA0一端接 I/O另一端接地按下为低电平四、系统软件设计4.1 主程序流程设计系统上电后初始化 GPIO 与 UART 串口随后进入主循环持续读取左右红外对管的循迹状态与超声波测距的障碍物距离扫描按键标志位判断当前模式同时通过串口接收蓝牙模块上传的控制指令。当检测到避障按键按下或收到蓝牙避障指令时进入避障模式检测到循迹按键按下或循迹指令时进入循迹模式收到运动控制指令时执行遥控动作前进/后退/左转/右转/停车。int main(void) { System_Init(); // GPIO / UART / 定时器初始化 while (1) { mode Key_Scan() | BT_GetCmd(); // 按键 蓝牙指令共同决定模式 switch (mode) { case MODE_TRACK: Track_Run(); break; // 循迹模式 case MODE_AVOID: Avoid_Run(); break; // 避障模式 case MODE_REMOTE: Remote_Run(); break; // 蓝牙遥控模式 default: Motor_Stop(); break; // 停车 } } }4.2 循迹控制流程设计循迹程序定期读取左右 TCRT5000 的 OUT 引脚电平根据状态组合修正行驶方向左传感器右传感器判断动作黑线黑线小车位于线上保持前进无黑线小车向左偏离加速右侧电机、减速左侧电机向左修正黑线无小车向右偏离加速左侧电机、减速右侧电机向右修正无无脱离路径停车避免失控void Track_Run(void) { u8 L GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1); u8 R GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2); if (L LINE R LINE) Motor_Forward(); // 双管压线直行 else if (R LINE) Motor_TurnLeft(); // 仅右管见线向左修正 else if (L LINE) Motor_TurnRight(); // 仅左管见线向右修正 else Motor_Stop(); // 双管脱线停止 }4.3 避障控制流程设计避障程序的核心是超声波测距与绕障策略配置 Trig 为输出、Echo 为输入设置定时器用于测量 Echo 高电平持续时间在 Trig 引脚生成 10 µs 高电平脉冲触发 HC-SR04 发射超声波Echo 引脚在接收到反射波后变为高电平定时器测量其持续时长即声波往返时间按声速 340 m/s 计算距离距离 高电平持续时间 × 340 / 2当距离小于设定阈值时执行避障动作左转直行一段距离再右转直行回到原定路线完成绕障。float Get_Distance(void) { Trig_High_10us(); // 触发超声波 while (Echo_Low()); // 等待 Echo 拉高 t TIM_GetCounter(); // 测量高电平时间 return t * 340.0f / 2.0f; // 换算距离 } void Avoid_Run(void) { if (Get_Distance() THRESHOLD) // 前方障碍低于阈值 { Motor_TurnLeft(); Delay(); // 左转直行一段距离 Motor_TurnRight(); Delay(); // 右转直行回到原路线 } else Motor_Forward(); // 前方无障碍继续前进 }4.4 电机驱动程序设计初始化时将 IN1IN4 对应 GPIO 配置为推挽输出50 MHz并将全部控制引脚置低电平让电机停止。各运动指令的引脚逻辑如下动作IN1IN2IN3IN4效果前进高低高低两电机正转小车前移后退低高低高两电机反转小车倒退左转高低低高左电机正转、右电机反转小车左转右转低高高低左电机反转、右电机正转小车右转停止低低低低电机停止运转ENA/ENB 接 PWM 引脚通过调节占空比实现电机调速配合方向引脚完成差速修正。void Motor_Forward(void) { GPIO_SetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_2); // IN1、IN3 高 GPIO_ResetBits(GPIOB, GPIO_Pin_1 | GPIO_Pin_3); // IN2、IN4 低 TIM_SetCompare1(TIM3, SPEED); // ENA 输出 PWM TIM_SetCompare2(TIM3, SPEED); // ENB 输出 PWM }4.5 蓝牙遥控程序设计蓝牙遥控基于 USART1 串口通信实现配置与 JDY-31 相连的 GPIO——TX 引脚推挽输出、RX 引脚浮空输入使能串口时钟设置串口参数波特率、8 位数据位、停止位、校验位本系统为无校验开启接收中断并使能串口通过发送函数发送单字节或字符串中断服务程序中接收数据并按协议解析——区分模式切换指令与运动控制指令前进/后退/左转/右转/停车执行相应操作。void USART1_IRQHandler(void) { if (USART_GetITStatus(USART1, USART_IT_RXNE)) { u8 cmd USART_ReceiveData(USART1); switch (cmd) // 解析蓝牙指令 { case CMD_FWD: Motor_Forward(); break; case CMD_BACK: Motor_Backward(); break; case CMD_LEFT: Motor_TurnLeft(); break; case CMD_RIGHT: Motor_TurnRight(); break; case CMD_STOP: Motor_Stop(); break; case CMD_MODE_TRACK: mode MODE_TRACK; break; case CMD_MODE_AVOID: mode MODE_AVOID; break; } } }五、系统实现与测试5.1 硬件焊接与调试按电路图依次焊接各模块主控模块重点确认晶振、复位与供电电路循迹模块确认 VCC/GND/OUT 连接正确超声波模块连接好 Trig 与 Echo 并保证供电一致L298N 确认电源、控制引脚与电机输出端连接无误最后焊接 JDY-31将其 TXD/RXD 与单片机串口引脚交叉相连。焊接完成后首次上电检查各模块供电情况确保无短路或过载现象。5.2 软件调试使用 Keil 开发环境创建工程并选择 STM32F103C8T6 为目标芯片加入必要的库文件后编译根据提示修正错误与警告。通过 ST-Link 连接开发板 SWD 接口下载程序启动调试模式设置断点、逐行执行、观察变量实时监控传感器读取与电机控制的逻辑及时修正输入输出信号处理中的问题。5.3 功能测试结果测试项目测试方法测试结果循迹功能小车在设定黑线轨迹上行驶串口输出实时传感器数据左偏/右偏均能正确修正小车流畅沿黑线行驶循迹稳定避障功能设置不同距离阈值观察小车接近障碍物时的反应距离小于阈值时正确执行左转绕行再右转回线避障可靠遥控功能手机 APP 蓝牙发送前进/后退/左转/右转指令各指令响应正确、执行稳定远程控制可靠模式切换按键与蓝牙指令分别切换三种模式模式切换响应正常各模式独立运行六、总结本文设计并实现了一款基于 STM32F103C8T6 的三模式智能小车TCRT5000 红外对管实现黑线循迹HC-SR04 超声波测距实现障碍规避L298N 驱动双电机完成差速转向与 PWM 调速JDY-31 蓝牙模块配合手机 APP 实现无线遥控三种模式经按键或蓝牙指令灵活切换。系统实现过程中的难点集中在传感器状态的精确识别与电机转向的及时调整、超声波信号处理的实时性与精度以及串口通信的稳定性——经过反复调试三大核心功能均稳定达成。未来可进一步扩展传感器种类提升环境感知能力并将运行数据上传云端优化控制算法使小车在智能交通、仓储物流等场景中发挥更大价值。七、资料内容完整工程资料原理图、PCB、代码、元件清单八、资料获取方式