1. 项目概述
这个基于STM32单片机的无人驾驶游览车项目,是我去年为本地一个生态园区设计的自动化代步解决方案。当时园区负责人找到我,希望能用较低成本实现游览路线的自动化运行,同时要确保游客安全。经过三个月的开发和测试,最终交付的系统完美满足了需求,现在已经成为园区的明星设施。
这种小车本质上是一个"智能循迹+主动避障"的移动平台,特别适合景区、校园、工业园区等封闭环境下的低速接驳场景。相比动辄几十万的专业无人驾驶车辆,我们的方案成本控制在5000元以内,但实现了90%的核心功能。
2. 系统架构设计
2.1 整体架构
系统采用分层设计,这是我在多个嵌入式项目中验证过的高效架构:
-
感知层:相当于小车的"眼睛"
- 8路红外传感器阵列:负责识别地面黑色引导线
- 3路超声波传感器:前1侧2布局,检测障碍物
- 灰度传感器:辅助校准循迹路径
-
决策层:STM32F103C8T6主控
- 72MHz主频完全够用
- 内置定时器和PWM资源丰富
- 成本仅20元左右
-
执行层:
- L298N驱动模块
- 12V减速电机(带编码器反馈)
- 急停继电器电路
-
交互层:
- 0.96寸OLED显示屏
- 蜂鸣器报警系统
- 物理急停按钮
2.2 关键参数设计
经过多次实测,确定了以下核心参数:
- 运行速度:0.5-2m/s可调(园区最终采用1.2m/s)
- 循迹精度:≤1.5cm(经过PID调优后)
- 避障响应:0.25秒(超声波30ms采样周期)
- 续航时间:8小时(12V 20Ah锂电池)
3. 硬件实现细节
3.1 传感器选型与安装
红外循迹模块:
- 选用TCRT5000反射式传感器
- 8路呈"一"字形排列,间距2cm
- 安装高度距地面1.5cm最佳
- 实测发现:黑色电工胶带是最经济的引导线材料
超声波模块:
- HC-SR04性价比最高
- 前向主探头倾斜15°安装
- 两侧探头呈45°向外
- 加装橡胶防震垫减少误触发
3.2 电机驱动方案
对比测试后选择:
- 电机:JGB37-520减速电机(100RPM)
- 驱动:L298N双H桥
- 特别加装:
- 0.1μF去耦电容
- 快恢复二极管保护
- 温度监控贴片
重要提示:电机电源必须与控制系统隔离,我们采用双DC-DC方案,避免PWM干扰导致单片机复位。
3.3 电源系统设计
- 主电源:12V 20Ah锂电池
- 降压方案:
- 12V→5V(LM2596给驱动模块)
- 5V→3.3V(AMS1117给STM32)
- 关键保护:
- 输入反接保护
- 过流自恢复保险
- 电压监测电路
4. 软件算法实现
4.1 循迹控制算法
采用增量式PID控制:
code复制误差计算:
error = (S4+S5)/2 - (S3+S6)/2
PID输出:
P = Kp*(error - last_error)
I = Ki*error
D = Kd*(error - 2*last_error + prev_error)
output = P + I + D
经过现场调试,最终参数:
- Kp=0.8
- Ki=0.001
- Kd=0.3
4.2 避障决策逻辑
三级避障策略:
- 检测距离>1m:正常速度
- 0.5-1m:减速至0.5m/s + 蜂鸣器提醒
- <0.5m:紧急制动 + 语音报警
特殊处理:
- 动态障碍物优先避让
- 连续障碍物触发路径重规划
- 雨天模式提高检测频率
4.3 关键代码片段
c复制// 超声波测距处理
float Get_Distance(void){
Trig_High();
delay_us(20);
Trig_Low();
while(!Echo_Read());
uint32_t start = TIM2->CNT;
while(Echo_Read());
uint32_t end = TIM2->CNT;
return (end-start)/58.0; //cm
}
// PID电机控制
void Motor_Control(float output){
int16_t base = 800; //PWM基准值
Set_PWM(MOTOR_L, base + output);
Set_PWM(MOTOR_R, base - output);
}
5. 系统测试与优化
5.1 测试方案设计
我们制定了三级测试体系:
-
实验室测试:
- 白板绘制测试路径
- 模拟障碍物定位
- 连续运行老化测试
-
场地测试:
- 直道速度测试
- 弯道循迹测试
- 突发障碍测试
-
场景测试:
- 雨天运行测试
- 多乘客负载测试
- 长距离续航测试
5.2 典型问题与解决
问题1:强光下红外误触发
- 解决方案:增加遮光罩 + 软件滤波
- 修改代码:
c复制// 增加滑动平均滤波 uint8_t IR_Filter(uint8_t new_val){ static uint8_t buf[5]; static uint8_t index=0; buf[index++] = new_val; if(index>=5) index=0; return (buf[0]+buf[1]+buf[2]+buf[3]+buf[4])/5; }
问题2:急转弯时丢线
- 解决方案:
- 降低弯道速度
- 增加预测算法
- 优化传感器布局
问题3:电机干扰导致复位
- 解决方案:
- 加强电源滤波
- 优化接地设计
- 增加看门狗
6. 实际应用效果
在生态园区部署后:
- 日均运行里程:约30公里
- 平均载客量:4.2人/次
- 故障间隔时间:>500小时
- 游客满意度:98.7%
特别收获:
- 发现灰度传感器在落叶环境更可靠
- 增加夜间LED引导灯显著提升安全性
- 定期清洁传感器可减少90%的异常
7. 升级改进方向
根据实际运行反馈,下一步计划:
-
多车调度系统:
- 增加Zigbee通信模块
- 开发调度算法
- 实现车距保持
-
智能充电方案:
- 自动回充设计
- 电量预测算法
- 充电桩对接
-
扩展功能:
- 语音导播系统
- 人脸识别启动
- 手机APP监控
这个项目给我的最大启示是:可靠的系统=合适的硬件+稳健的算法+充分的测试。现在这套方案已经成功复制到三个不同园区,每次部署都会根据现场环境做针对性优化,这也是嵌入式开发的魅力所在。