1. 项目概述
这个项目让我想起了十年前第一次尝试做智能小车的经历。当时用红外传感器做的巡线小车就像个醉汉,走起路来歪歪扭扭。现在有了视觉导航,小车终于能像老司机一样稳稳当当地跑起来了。基于单片机的视觉导航小车,说白了就是给小车装上"眼睛"和"大脑",让它能看懂路、自己找方向。
这种小车在智能仓储、无人物流、室内巡检等领域特别有用。比如在仓库里,它可以自动识别货架位置;在医院里,能按照预定路线送药;在工厂里,可以巡检设备状态。相比传统的红外或超声波导航,视觉方案能获取更多环境信息,适应性更强,关键是成本还低——一个几十块钱的摄像头加上百元级的单片机就能搞定。
2. 核心硬件选型与设计
2.1 主控芯片的选择
选主控就像选电脑CPU,得看性能需求和钱包厚度。STM32F407是我的首选,原因很实在:
- 168MHz主频足够处理640x480分辨率的图像
- 自带DCMI接口直接接摄像头,省去额外转换芯片
- 512KB Flash完全够存图像处理算法
- 价格只要40多块钱,比树莓派便宜一半还多
注意:如果预算实在紧张,STM32F103C8T6(20块钱)也能凑合用,但要降低图像分辨率和算法复杂度。
2.2 视觉模块选型
OV2640摄像头模块是性价比之王:
- 200万像素,支持JPEG输出
- 30fps的帧率够用
- 自带FIFO缓存,减轻单片机压力
- 某宝25块钱包邮
实测中发现个坑:一定要买带FPC排线座的版本!直接焊线的那种,调试时能把人逼疯——我报废了三个模块才明白这个道理。
2.3 电机驱动方案
L298N模块是老朋友了,驱动两个直流电机妥妥的:
- 最大2A电流,带动小车足够
- 支持PWM调速
- 带光耦隔离,保护单片机
- 某宝12块钱
但要注意散热问题!长时间全速运行必须加散热片,我有次测试时没注意,模块直接冒烟了。
3. 软件架构设计
3.1 图像采集流程
c复制// 初始化DCMI接口
void DCMI_Init(void) {
// 配置GPIO、DCMI时钟等
// 设置JPEG模式
// 开启DMA传输
}
// 中断服务函数
void DCMI_IRQHandler(void) {
if(DCMI_GetITStatus(DCMI_IT_FRAME)) {
// 一帧图像采集完成
process_image();
}
}
这个流程看似简单,但调试时遇到两个典型问题:
- 图像撕裂:原因是DMA缓冲区太小,后来改成双缓冲解决
- 帧率不稳:把图像分辨率从800x600降到640x480后稳定在15fps
3.2 视觉算法实现
3.2.1 车道线识别
采用经典的二值化+边缘检测方案:
- RGB转灰度:Y = 0.299R + 0.587G + 0.114B
- 大津法自动阈值二值化
- Canny边缘检测
- Hough变换找直线
实测效果:在室内光照均匀时识别率95%以上,但遇到强光直射就歇菜。后来加了自动曝光控制才解决。
3.2.2 目标跟踪
对于二维码导航场景,用AprilTag算法:
- 预处理图像
- 检测四边形
- 解码标签ID
- 计算相对位姿
在STM32上跑AprilTag有点吃力,后来改用简化版的ARTag,识别距离能达到1.5米。
3.3 运动控制算法
PID控制器参数整定是个技术活:
- Kp=0.8:快速响应但会超调
- Ki=0.05:消除静差
- Kd=0.3:抑制震荡
调参心得:先调P,再调I,最后调D。用手机拍下小车运行视频,慢放分析超调量和稳定时间。
4. 机械结构设计
4.1 车体选型
淘宝上20块钱的亚克力底盘就够用,但要注意:
- 电机安装孔位要匹配
- 电池仓要够大(我用的18650x2)
- 留出摄像头支架安装孔
有个血泪教训:千万别买那种自带铜柱的版本!拧几次螺丝就滑牙,后来全部换成不锈钢柱。
4.2 摄像头安装
摄像头高度决定视野范围:
- 离地15cm:适合检测20cm宽的路径
- 倾斜15度:兼顾远近视野
用3D打印了个可调角度的支架,STL文件分享在GitHub上。没3D打印机的话,可以用乐高积木临时搭一个。
5. 系统集成与调试
5.1 电源管理
典型供电方案:
- 18650锂电池(7.4V)
- LM2596降压到5V给单片机
- AMS1117-3.3V给摄像头
实测整机功耗:
- 静止时:约200mA
- 运动时:峰值800mA
重要提示:一定要在电源输入端加个大电容(我用的470uF),否则电机启动时会导致单片机复位。
5.2 无线调试方案
用HC-05蓝牙模块实现:
- 配置为从机模式
- 波特率115200
- 通过串口发送调试图像
有个骚操作:把二值化后的图像用ASCII字符发送到电脑,在串口助手里就能看到实时路径识别效果。
6. 实测效果与优化
在3m×3m的场地上测试:
- 直线跟踪误差:±2cm
- 90度转弯成功率:98%
- 连续运行时间:约2小时
遇到的奇葩问题及解决方案:
- 反光地板误识别:调整二值化阈值
- 电机干扰摄像头:加磁环滤波
- 电池电量影响速度:加入电压补偿
7. 进阶改进方向
- 加入IMU进行传感器融合,解决摄像头帧率不足时的定位问题
- 移植到STM32H7系列,实现更复杂的SLAM算法
- 增加WiFi图传功能,方便调试
- 改用四轮差速结构,提升转向精度
最后分享一个省钱的技巧:去废品站淘旧玩具车,往往能拆到不错的电机和轮子,我50块钱收了5台遥控车,配件够用大半年。