1. 项目背景与设计初衷
去年夏天带孩子去科技馆,看到平衡车体验区排起长队,突然萌生了自己动手做一个的念头。作为电子爱好者,我手头正好有ESP32开发板和MPU6050传感器,决定从零开始打造一辆属于"黄山派"的迷你平衡车。这个项目最吸引我的地方在于,它完美融合了PID控制算法、传感器数据处理和电机驱动这三个嵌入式开发的核心技能点。
市面上的平衡车成品价格从几百到几千不等,但自己动手的成本可以控制在200元以内。更重要的是,通过这个项目可以深入理解:
- 如何通过陀螺仪和加速度计获取姿态数据
- 卡尔曼滤波在传感器融合中的应用
- PID控制器各参数的实际调节方法
- 直流电机驱动与PWM控制技巧
2. 硬件选型与结构设计
2.1 核心组件清单
经过多次迭代测试,最终确定的硬件配置如下:
| 组件 | 型号 | 数量 | 单价 | 备注 |
|---|---|---|---|---|
| 主控板 | ESP32-WROOM-32 | 1 | 35元 | 双核240MHz,自带蓝牙/WiFi |
| 姿态传感器 | MPU6050 | 1 | 12元 | 6轴陀螺仪+加速度计 |
| 电机驱动 | TB6612FNG | 1 | 15元 | 双路H桥,最大1.2A |
| 直流电机 | N20减速电机 | 2 | 25元 | 6V 200转/分钟 |
| 电池 | 18650锂电池 | 2 | 10元 | 需配保护板 |
| 轮子 | 65mm橡胶轮 | 2 | 8元 | 带编码器槽 |
特别提醒:电机一定要选择带编码器的版本,这是实现闭环控制的关键。我最初用了普通电机,调试PID时简直是一场灾难。
2.2 机械结构设计
车身采用3D打印的ABS材质框架,主要考虑因素:
- 重心高度:经测试最佳高度在15-20cm之间
- 轮距宽度:建议保持与轮径相当(本方案65mm)
- 传感器安装:MPU6050必须与地面绝对平行固定
打印文件需要注意:
- 电机座要预留散热孔
- 电池仓设计防震结构
- 主控板位置远离电机避免干扰
3. 核心算法实现
3.1 传感器数据融合
MPU6050输出的原始数据需要经过三重处理:
cpp复制// 示例代码:卡尔曼滤波实现
void kalmanUpdate(float accAngle, float gyroRate) {
// 预测阶段
angle += (gyroRate - gyroBias) * dt;
P[0][0] += dt * (dt*P[1][1] - P[0][1] - P[1][0] + Q_angle);
P[0][1] -= dt * P[1][1];
P[1][0] -= dt * P[1][1];
P[1][1] += Q_gyro * dt;
// 更新阶段
float y = accAngle - angle;
float S = P[0][0] + R_angle;
float K[2];
K[0] = P[0][0] / S;
K[1] = P[1][0] / S;
angle += K[0] * y;
gyroBias += K[1] * y;
P[0][0] -= K[0] * P[0][0];
P[0][1] -= K[0] * P[0][1];
P[1][0] -= K[1] * P[0][0];
P[1][1] -= K[1] * P[0][1];
}
3.2 PID控制算法
采用位置式PID实现角度控制:
code复制目标角度 → 角度误差 → PID计算 → 电机PWM输出
↑ |
└───────编码器反馈
参数整定经验值(供参考):
- Kp=15.0 (比例项,响应速度)
- Ki=0.5 (积分项,消除静差)
- Kd=0.3 (微分项,抑制震荡)
调试技巧:先调Kp直到出现小幅震荡,然后加Kd抑制震荡,最后用Ki消除静差。每次调整幅度建议不超过20%。
4. 电路设计与安全防护
4.1 电源管理系统
采用双18650电池串联(7.4V)供电,通过三个稳压模块:
- LM2596降压至5V(电机驱动)
- AMS1117降压至3.3V(主控板)
- TP4056充电管理模块
重要保护措施:
- 电机电源与逻辑电源完全隔离
- 所有IO口串联220Ω电阻
- 紧急停止按钮直接切断电机供电
4.2 PCB布局要点
- 大电流走线宽度≥1mm
- 传感器远离电机和电源线
- 预留调试接口(SWD/UART)
- 接地采用星型连接
5. 调试过程与问题排查
5.1 典型故障现象与解决方案
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 车体剧烈抖动 | PID参数过大 | 逐步减小Kp和Kd |
| 向一侧倾斜 | 机械结构不对称 | 重新校准传感器零点 |
| 无法保持平衡 | 电机功率不足 | 更换更高扭矩电机 |
| 数据漂移严重 | 传感器受热 | 增加温度补偿算法 |
5.2 实测性能指标
经过两周调试,最终达到:
- 平衡维持时间:>30分钟
- 最大载重:3kg
- 响应时间:<0.1s
- 倾斜角范围:±15°
6. 功能扩展方向
当前雏形已实现基本平衡功能,后续可扩展:
- 通过手机蓝牙遥控(已预留ESP32蓝牙接口)
- 添加超声波避障模块
- 实现路径规划与自主导航
- 升级为两轮差速转向
这个项目最让我惊喜的是,原本以为高深的平衡控制算法,通过亲手实践发现其核心原理并不复杂。最难的部分其实是机械结构的稳定性和参数的耐心调试。建议有兴趣的朋友可以从简单的平衡杆开始练手,逐步过渡到两轮平衡车。