1. 项目概述
这个基于STM32的智能小车项目是我在完成音乐喷泉后的又一力作。相比市面上单一的遥控或循迹小车,我设计的这款三合一功能小车在实用性上有了质的飞跃。核心功能包括:
- 自动循迹(可识别黑色轨迹自主行驶)
- 超声波避障(探测10-80cm范围内的障碍物)
- 蓝牙遥控(通过手机APP实现精准控制)
选择STM32F103C8T6作为主控是经过深思熟虑的。这款芯片具有72MHz主频、64KB Flash和20KB RAM,完全能满足多任务处理需求。更重要的是,它的外设资源丰富,有多个定时器和USART接口,可以轻松驱动电机、超声波模块和蓝牙模块。
2. 硬件设计与选型
2.1 核心部件清单
| 部件 | 型号 | 数量 | 备注 |
|---|---|---|---|
| 主控 | STM32F103C8T6 | 1 | 最小系统板 |
| 电机 | N20减速电机 | 2 | 6V/200rpm |
| 驱动 | L298N | 1 | 双H桥 |
| 传感器 | TCRT5000 | 4 | 循迹模块 |
| 测距 | HC-SR04 | 1 | 超声波 |
| 通信 | HC-05 | 1 | 蓝牙4.0 |
| 电源 | 18650电池 | 2 | 带保护板 |
2.2 PCB设计要点
在嘉立创EDA上设计PCB时特别注意了以下几点:
- 电机驱动部分要远离模拟信号线,避免电磁干扰
- 为每个模块预留测试点,方便调试时测量信号
- 电源走线宽度不小于1mm,确保大电流通过
- 所有接口采用防反插设计
实际布线时发现,将超声波模块的Trig和Echo信号线做等长处理能显著提高测距稳定性。建议这两根线长度差控制在5mm以内。
3. 软件架构解析
3.1 主程序流程图
c复制void main() {
hardware_init(); // 硬件初始化
while(1) {
switch(mode) {
case TRACING_MODE:
tracing_routine();
break;
case ULTRASONIC_MODE:
ultrasonic_routine();
break;
case BLUETOOTH_MODE:
bluetooth_routine();
break;
}
}
}
3.2 关键算法实现
循迹PID控制:
c复制void PID_Control() {
error = get_tracking_error(); // 获取偏离误差
integral += error;
derivative = error - last_error;
output = Kp*error + Ki*integral + Kd*derivative;
set_motor_speed(BASE_SPEED + output, BASE_SPEED - output);
last_error = error;
}
参数整定经验:
- Kp=0.8 提供快速响应
- Ki=0.01 消除静差
- Kd=0.3 抑制超调
4. 模式实现细节
4.1 循迹模式优化
使用4路TCRT5000传感器阵列,检测方案如下:
- 0001:轻微右偏 → 左轮提速15%
- 0011:中度右偏 → 左轮提速30%
- 0111:严重右偏 → 左轮停止,右轮全速
(左偏情况对称处理)
实测发现传感器安装高度距地面5-8mm时检测效果最佳。太高会导致灵敏度下降,太低容易刮擦地面。
4.2 超声波避障策略
采用分级避障机制:
- 距离>50cm:全速前进
- 30-50cm:减速至70%
- 10-30cm:转向探测
- <10cm:紧急停止
为了提高响应速度,超声波采样周期设置为100ms,通过定时器中断实现。
4.3 蓝牙协议设计
自定义的通信协议格式:
code复制[起始符][数据长度][指令类型][数据][校验和]
典型指令示例:
- A5 03 01 64 6C → 设置速度100(0x64)
- A5 03 02 01 B9 → 向右转
在手机端使用MIT App Inventor开发的控制界面,包含方向摇杆和速度滑块。
5. 调试经验分享
5.1 常见问题排查
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 电机不转 | L298N使能端未接高电平 | 检查ENA/ENB跳线帽 |
| 循迹抖动 | PID参数不合适 | 先用纯P调节,再逐步加入I/D |
| 蓝牙连接失败 | 模块未进入AT模式 | 按住按键上电,LED慢闪表示成功 |
| 超声波读数异常 | 电源纹波大 | 并联100uF电容 |
5.2 焊接注意事项
- 先焊高度低的元件(电阻、IC座)
- STM32芯片最后焊接,使用焊油辅助
- 电机接口用排针+排母组合,方便更换
- 所有接插件点胶固定,防止松动
6. 性能优化技巧
- 电源管理:
- 增加LC滤波电路(10uH电感+100uF电容)
- 为数字部分和模拟部分独立供电
- 蓝牙模块单独使用3.3V LDO
- 代码优化:
c复制// 使用寄存器操作替代库函数,提升IO控制速度
#define MOTOR1_SET() (GPIOA->BSRR = GPIO_Pin_1)
#define MOTOR1_CLR() (GPIOA->BRR = GPIO_Pin_1)
- 机械调整:
- 车轮加装O型硅胶圈增加摩擦力
- 底盘重心尽量压低
- 传感器支架用热熔胶做减震处理
这个项目最让我惊喜的是三种模式的无缝切换体验。通过一个拨码开关选择模式,系统会自动初始化相应的外设。比如切换到蓝牙模式时,会先关闭超声波的中断,释放定时器资源。这种设计思路在很多实际产品中都有应用价值。
