1. 项目概述:从零打造会"思考"的平衡车
第一次看到商场里那些稳稳站立的平衡车时,我就被它们的魔法般的平衡能力吸引了。作为理工男,这种"违反常识"的机械结构总能勾起我的探索欲。经过三个月的周末攻坚,我终于在自家阳台上攒出了一台能自主保持平衡的智能小车。别看它现在只有巴掌大,从电机选型到PID调参,每个环节都藏着大学问。
这台小车的核心秘密在于它的"电子脊柱"——由MPU6050六轴传感器构成的姿态感知系统。就像人类的内耳前庭器官,它能以每秒1000次的频率检测车身倾斜角度,再通过STM32主控芯片的实时计算,驱动减速电机进行反向补偿。最让我自豪的是加入了超声波壁障模块,让小车在保持平衡的同时还能智能避障,这比市面多数平衡车玩具多了层"大脑"。
2. 硬件架构深度解析
2.1 核心部件选型对比
在零件堆里摸爬滚打多年,我总结出DIY项目的黄金定律:80%的性能问题源于硬件选型不当。为此我对比了四种主流方案:
| 部件类型 | 候选方案 | 最终选择理由 |
|---|---|---|
| 主控芯片 | Arduino UNO vs STM32F103 | STM32的32位ARM内核满足实时计算需求 |
| 姿态传感器 | MPU6050 vs BMI160 | MPU6050性价比高且资料丰富 |
| 电机驱动 | L298N vs TB6612FNG | TB6612FNG发热量更低效率更高 |
| 电源管理 | 18650电池组 vs 锂聚合物 | 锂聚合物电池更轻且放电稳定 |
特别要提的是TB6612FNG驱动芯片,这个指甲盖大小的模块能同时驱动两个直流电机,最大1.2A持续电流完全够用。相比传统L298N,它的效率提升30%以上,连续工作半小时也只是微温。
2.2 机械结构设计要点
车身框架我选用3mm航空铝板激光切割,这种"日"字形结构在保证强度的同时将重量控制在200g以内。关键有三处设计细节:
- 电机轴与轮毂采用紧配合+螺丝胶固定,避免高速旋转时打滑
- 电池仓设计在底盘正下方,降低整体重心
- 传感器安装板与主框架间加装硅胶减震垫,防止电机振动干扰
重要提示:MPU6050必须与主控板保持刚性连接,任何微小的相对位移都会导致姿态数据失真。我用3D打印了个带卡扣的固定座,效果比胶粘更可靠。
3. 核心算法实现揭秘
3.1 姿态解算的数学魔法
MPU6050输出的原始数据是三轴加速度和三轴角速度,需要经过卡尔曼滤波才能得到可信的倾斜角。算法核心是这两个方程:
code复制状态预测:
x_k = A·x_{k-1} + B·u_k + w_k
测量更新:
K_k = P_k·H^T/(H·P_k·H^T + R)
实际编程时我做了简化,采用互补滤波替代卡尔曼滤波。下面这段代码展示了如何融合加速度计和陀螺仪数据:
c复制float complementaryFilter(float accelAngle, float gyroRate, float dt) {
const float alpha = 0.98; // 滤波系数
static float angle = 0;
angle = alpha*(angle + gyroRate*dt) + (1-alpha)*accelAngle;
return angle;
}
参数alpha需要根据实际抖动情况调整,我的经验值是0.95-0.98之间。太接近1会导致响应迟钝,太小又容易受振动干扰。
3.2 PID控制的调参艺术
平衡控制本质上是个倒立摆问题,PID参数直接决定小车是"稳如老狗"还是"摇头晃脑"。经过数十次试错,我总结出这样的调参顺序:
- 先设I=D=0,逐渐增大P直到小车出现高频振荡
- 增加D值抑制振荡,注意过大的D会导致响应延迟
- 最后加入少量I消除静态误差,但要防止积分饱和
我的最终参数:
c复制float Kp=12.0, Ki=0.5, Kd=2.3; // 适用于500g车重
调参技巧:用蓝牙模块实时输出角度和PWM数据到手机APP,比盲目尝试效率高十倍。我用的Serial Bluetooth Terminal能直接绘制曲线图。
4. 避障功能的智能升级
4.1 多传感器数据融合
基础版平衡车只能原地站立,我给它加装了HC-SR04超声波模块实现移动避障。这里遇到的关键挑战是:如何让小车在保持平衡的同时处理障碍物信息?
解决方案是采用状态机架构:
mermaid复制[状态转移图已移除,改用文字描述]
1. 平衡模式:优先级最高,50Hz循环执行PID控制
2. 巡线模式:通过红外传感器跟踪地面标记
3. 避障模式:当超声波检测到30cm内障碍物时触发
三个模式通过信号量同步,确保任何时候平衡控制都不会被阻塞。具体实现上,我用了FreeRTOS创建两个任务:
- 高优先级任务(1ms周期):姿态检测+PID计算
- 低优先级任务(10ms周期):传感器扫描+决策逻辑
4.2 运动控制优化
传统平衡车只能前后移动,我的版本通过差速转向实现了灵活避障。核心算法是:
c复制void setMotorSpeed(int left, int right) {
// 左电机PWM输出
pwm1 = balancePWM + left - right;
// 右电机PWM输出
pwm2 = balancePWM - left + right;
// 限幅保护
pwm1 = constrain(pwm1, -255, 255);
pwm2 = constrain(pwm2, -255, 255);
}
当右侧超声波检测到障碍物时,会给left参数赋正值,使小车向左偏转。配合0.5秒的延时,形成流畅的避障动作。
5. 常见问题与进阶改造
5.1 新手常踩的坑
-
电机选型不足:
- 症状:小车突然倾倒后无法恢复
- 对策:电机扭矩≥0.3N·m,减速比建议1:30以上
-
电源干扰问题:
- 症状:传感器数据随机跳变
- 对策:给MPU6050单独加LC滤波电路,我用的是10μH电感+100μF电容
-
机械共振:
- 症状:特定角度出现异常抖动
- 对策:在电机支架粘贴配重块改变固有频率
5.2 性能提升方案
想让你的平衡车更上一层楼?试试这些升级:
- 更换ESP32主控,通过WiFi实现手机遥控
- 加装TOF激光测距模块,提升避障精度
- 改用FOC无刷电机,运行更安静平稳
- 引入MPU9250,增加地磁导航功能
我最近正在尝试用神经网络替代PID控制,采集了2000组跌倒数据训练模型。虽然目前响应速度还不如传统算法,但在复杂地形表现更鲁棒。