两轮自平衡小车是嵌入式系统开发的经典练手项目,也是检验PID算法掌握程度的试金石。这个项目看似简单,实则涉及机械结构设计、传感器数据融合、实时控制算法、电源管理、无线通信等多个技术领域的交叉应用。我曾在2018年首次尝试制作这类小车,当时花了整整三周时间才让小车勉强站稳,期间烧毁了2块STM32开发板,撞坏了3组减速电机。现在回头看,这些教训反而成了最宝贵的经验。
这个项目的核心目标是通过STM32单片机实现小车的自主平衡。与四轮小车不同,两轮结构本质上是个倒立摆系统,具有天然的不稳定性。就像试图把扫帚直立在手心一样,需要持续不断的微小调整才能维持平衡。这种特性使得它成为验证控制算法的绝佳平台,也是为什么大疆的工程师面试时总爱问PID调参问题。
STM32F103C8T6是这个项目最经济实惠的选择,72MHz主频足够处理PID运算,内置的定时器可以生成精准的PWM信号控制电机。我对比过F1、F4和F7三个系列,发现F1系列在性价比上依然无敌。有个细节要注意:一定要选择LQFP48封装,而不是更小的LQFP32,因为后者缺少部分定时器外设,会影响电机控制。
重要提示:购买开发板时认准"蓝色板",这是正版ST芯片的标志。市面上有些廉价板使用GD32等兼容芯片,虽然能用但PWM输出稳定性较差。
MPU6050陀螺仪模块是平衡系统的"前庭器官",它能检测三个轴向的角速度和加速度。这个20元的小模块藏着大学问:
超声波模块的安装位置也有讲究。我建议采用"一高一低"的双探头布局:高位探头(离地30cm)检测障碍物,低位探头(离地10cm)识别台阶。这种配置成本增加不到20元,但防撞效果提升显著。
直流减速电机要选择带编码器的型号,虽然价格贵一倍(约60元/个),但转速反馈对闭环控制至关重要。驱动电路我推荐TB6612芯片,相比传统的L298N,它有三大优势:
电池选用2节18650锂电池串联(7.4V),容量建议2000mAh以上。这里有个血泪教训:千万别用劣质充电宝电芯!我曾因电池瞬间压降导致单片机复位,小车在演示时直接"卧倒"。
原始陀螺仪数据就像个醉汉的胡言乱语,需要卡尔曼滤波来"醒酒"。对于初学者,可以先用互补滤波过渡,下面是我调试过的参数组合:
c复制// 互补滤波系数
#define K 0.98
float angle = K*(angle + gyro*dt) + (1-K)*acc_angle;
这个简单的公式就能实现90%的滤波效果。dt取值很关键,建议通过定时器中断精确控制采样间隔(5ms最佳)。太短会导致运算负荷过大,太长会引入相位延迟。
PID参数整定是个耐心活,我的经验是先调P再调D最后调I:
实际代码中要注意积分抗饱和处理:
c复制// 带抗饱和的PID实现
if(abs(error) < threshold){
integral += error;
if(integral > limit) integral = limit;
else if(integral < -limit) integral = -limit;
}
output = Kp*error + Ki*integral + Kd*(error - last_error);
安卓APP通过蓝牙模块(HC-05)发送控制指令,我设计了一套简单的协议框架:
code复制[起始符][指令类型][数据长度][数据内容][校验和]
例如"前进"指令的十六进制表示为:0xAA 0x01 0x02 0x64 0x00 0x67
这种格式扩展性强,后续可以方便地添加新功能。在STM32端要用双缓冲接收,避免数据丢失。我遇到过最诡异的bug是手机APP在后台时蓝牙会偶发断连,后来发现是Android系统的省电策略导致的,需要在代码中设置高优先级保活。
车体重心高度直接影响控制难度,经验公式:
code复制最佳重心高度 = 轮径 × 0.7
比如使用6cm直径的轮子时,重心应该控制在4.2cm左右。可以通过移动电池位置来微调。有个取巧的方法:在底盘贴双面胶临时配重,调试完成后再固定。
| 故障现象 | 可能原因 | 解决方案 |
|---|---|---|
| 小车往一边偏 | 电机转速不一致 | 用示波器检查PWM占空比是否对称 |
| 突然失控倒地 | 电源电压跌落 | 检查电池接触,增加大电容缓冲 |
| 蓝牙连接不稳定 | 天线干扰 | 将模块远离电机,加装磁珠滤波 |
这是我调试成功的参数组合(供参考):
调试时有个小技巧:用纸板围个"安全区",这样小车振荡时不会跑远。记得给车轮套上橡胶套,否则地板很快就布满轮胎印——别问我怎么知道的。
基础版实现后,可以考虑以下升级:
我在第三代小车上尝试了图像识别,发现OV2640摄像头配合STM32F4的DCMI接口能实现10fps的简单颜色追踪。这个升级版成本增加约150元,但可玩性大幅提升。
最后分享一个省钱的秘诀:电机支架可以用3D打印件替代金属件,强度足够还减轻了重量。我设计的支架文件已经分享在开源平台,打印成本不到5元钱。记住调试时保持耐心,每个优秀工程师都经历过小车"跳舞"的阶段。当你第一次看到它稳稳立住时,那种成就感绝对值得所有付出。