1. 项目概述:自平衡小车的魅力与挑战
第一次看到自平衡小车在桌面上稳稳立住时,那种反直觉的平衡感让人着迷。这种利用惯性测量单元(IMU)和电机反馈实现动态平衡的装置,本质上是个"倒立摆"控制系统。我在三年前制作第一台原型车时,整整两周都在和PID参数较劲——要么反应迟钝像喝醉的酒鬼,要么高频抖动如触电的青蛙。经过十几个版本的迭代,终于总结出一套稳定可靠的搭建方案。
这个项目最吸引工程师的地方在于:它完美融合了机械结构设计、电子电路调试和控制系统算法三大领域。从采购零件到焊接组装,从传感器校准到参数整定,每个环节都充满实践乐趣。完成后的作品不仅能作为STEM教具,还能扩展为智能搬运平台或移动机器人底盘。下面分享的这套方案,成本控制在300元以内,所有零件均可在主流电商平台购得,特别适合有一定动手能力的创客爱好者。
2. 核心组件选型与原理剖析
2.1 主控板的选择困境与破局
早期版本我尝试过Arduino Uno+电机驱动扩展板的方案,但8位MCU的运算能力在处理互补滤波和PID运算时捉襟见肘。现在更推荐使用STM32F103C8T6(蓝色药丸板),其Cortex-M3内核72MHz主频能流畅运行浮点运算。关键优势在于:
- 硬件PWM输出确保电机控制时序精确
- 充足的外设接口方便扩展超声波或蓝牙模块
- 3.3V逻辑电平与多数传感器直接兼容
注意:购买时认准正版ST芯片,市面上有些仿制品ADC精度不达标会导致传感器读数漂移
2.2 姿态传感器的玄学调试
MPU6050作为性价比之王,其DMP(数字运动处理器)功能可直接输出融合后的欧拉角,省去自己实现Mahony滤波的麻烦。但要注意几个魔鬼细节:
- 安装位置应尽量靠近车辆重心,减少机械振动干扰
- 上电后必须水平静置2秒完成陀螺仪零偏校准
- 通过I2C读取数据时建议添加10ms延时防止总线阻塞
实测发现,用3M双面胶固定传感器比螺丝锁紧更能抑制高频振动。附上我的初始化代码片段:
cpp复制Wire.begin();
mpu.initialize();
delay(500);
mpu.dmpInitialize();
mpu.setDMPEnabled(true);
2.3 动力系统的黄金搭配
经过五种电机对比测试,最终选定N20减速电机(减速比1:30)配合TB6612驱动芯片的方案。这个组合的妙处在于:
- 电机空载转速150RPM刚好满足响应速度需求
- 金属齿轮箱比塑料款寿命提升5倍以上
- TB6612的1.2A持续电流足够驱动双电机
特别提醒:电机一定要成对购买并测试转速一致性!我曾因两个电机转速差超过5%导致小车持续偏航。简单的测试方法是用手机慢动作视频记录转10圈的用时差异。
3. 机械结构设计与装配技巧
3.1 车体框架的轻量化之道
用CAD设计激光切割亚克力底盘时,要注意三个力学要点:
- 电池仓应置于电机轴下方形成钟摆效应
- 轮径建议选择65mm-70mm,过大会降低扭矩响应
- 两层结构中间加装橡胶垫片能有效吸收振动
我的第五代设计采用镂空结构,在保证强度前提下将重量控制在180g以内。关键尺寸如下表:
| 部件 | 尺寸(mm) | 材质 | 数量 |
|---|---|---|---|
| 主底板 | 120×80×3 | 亚克力 | 1 |
| 电机支架 | 40×25×2 | 铝合金 | 2 |
| 轮毂 | Φ65×12 | PLA打印 | 2 |
3.2 令人抓狂的配平艺术
装配完成后必须进行静态配平,这是很多教程忽略的关键步骤。我的独门方法是:
- 用橡皮泥临时固定各部件
- 将小车放在平衡棱上(可用尺子边缘代替)
- 移动电池位置直到能自然保持水平
- 用热熔胶最终固定所有元件
曾因偷懒跳过这步,结果PID参数调到头秃才发现是重心偏移3mm导致的。配平后的小车站立电流能从200mA降至80mA,续航直接翻倍。
4. 控制算法的实战心得
4.1 PID参数整定的野路子
教科书上的齐格勒-尼科尔斯法在实操中往往不好用,我总结的"土法"调参更有效:
- 先设I=D=0,增大P直到出现等幅振荡
- 记录振荡周期T,设P为当前值60%
- I值设为2P/T,D值设为P*T/8
- 微调时每次改动不超过10%
典型参数范围参考:
- 角度环P=25~35,I=0.5~1.5,D=12~18
- 速度环P=10~15,I=0.1~0.3,D=5~8
4.2 互补滤波的魔改方案
标准的互补滤波公式是:
code复制angle = 0.98*(angle + gyro*dt) + 0.02*acc
但在小车突然加减速时会出现俯仰角误差。我的改进方案是:
- 当加速度计读数变化率超过阈值时,动态调整权重系数
- 加入移动平均滤波处理原始陀螺仪数据
- 通过串口绘图实时监控各传感器数据
这个方案将静态误差控制在±0.5°以内,动态响应延迟<50ms。具体实现见GitHub仓库的Filter.cpp文件。
5. 常见故障排查指南
5.1 死亡摇摆现象分析
症状:小车能短暂平衡但很快开始剧烈左右摆动
可能原因及对策:
- 电机极性接反 → 交换任意一侧电机线序
- D值过大引发高频振荡 → 逐步减小D参数
- 轮胎抓地力不足 → 用砂纸打磨轮胎或缠橡皮筋
5.2 神秘的单边倾斜
症状:静止时总向固定方向缓慢倾斜
排查步骤:
- 用手机水平仪检查MPU6050安装是否歪斜
- 断开电机用手转动检查两侧阻力是否一致
- 测量两个电机在相同PWM下的空载转速
去年帮网友debug时发现,竟是TB6612芯片某个引脚虚焊导致输出占空比不对称。这类问题用示波器查电机两端电压最直观。
6. 进阶改造方向
完成基础版后,可以尝试这些升级:
- 增加HC-05蓝牙模块用手机APP控制
- 加装超声波模块实现避障巡航
- 改用ESP32主控接入WiFi做远程监控
- 设计3D打印外壳提升美观度
我的实验品现在能顶着矿泉水瓶完成8字轨迹行驶,关键是在速度环外又加了位置环PID。最近正在尝试用MPU6050的DMP输出直接驱动步进电机,或许能实现更精准的姿态控制。
