1. 项目概述
这个30元打造智能平衡车的项目,是我最近完成的一个低成本嵌入式开发实践。作为一名电子爱好者,我一直想尝试制作一个自平衡车,但市面上现成的套件价格动辄几百元,让我望而却步。经过反复研究和实践,我终于找到了一套成本极低但功能完整的解决方案。
这个平衡车采用STM32F103C8T6作为主控芯片,配合MPU6050姿态传感器和编码电机,实现了基本的自平衡功能。最令人惊喜的是,通过淘宝购物技巧和合理选型,整套硬件成本可以控制在30-75元之间。对于想入门嵌入式开发和自动控制的朋友来说,这绝对是一个性价比极高的学习项目。
2. 硬件设计与选型
2.1 核心硬件清单
这个项目的硬件配置经过精心挑选,在保证功能的前提下最大程度控制了成本:
- 主控单元:STM32F103C8T6最小系统板(约8-12元)
- 姿态传感器:MPU6050六轴传感器模块(约5-8元)
- 电机驱动:TB6612FNG或DRV8833驱动模块(约5-10元)
- 电机:6V霍尔编码电机带轮胎(25元/对)
- 底盘:双层平衡车底盘(25元)
- 电源:7.4V锂电池(可使用旧手机充电宝电芯)
- 其他:蓝牙模块HC-04(约5元)、0.96寸OLED显示屏(约5元)
提示:实际采购时,可以通过淘宝新用户优惠和支付宝首单减免,将总成本控制在30元左右。具体技巧将在后面章节详细介绍。
2.2 关键硬件选型解析
主控芯片选择:
STM32F103C8T6被称为"蓝色药丸",是性价比极高的ARM Cortex-M3内核单片机。选择它的原因主要有:
- 72MHz主频足够处理平衡控制算法
- 丰富的外设接口(PWM、定时器、I2C等)
- 广泛的社区支持和丰富的学习资源
- 价格低廉,最小系统板仅需10元左右
电机驱动选型:
TB6612FNG和DRV8833都是常见的直流电机驱动芯片,两者对比:
- TB6612FNG:最大电流1.2A,内置MOSFET,效率高
- DRV8833:最大电流1.5A,支持更宽的电压范围(2.7-10.8V)
- 本项目选择的是TB6612FNG,因其热性能更好,更适合持续工作
姿态传感器:
MPU6050集成了三轴陀螺仪和三轴加速度计,通过I2C接口与主控通信。选择它的原因:
- 成本低廉但性能足够
- 内置DMP(数字运动处理器)可减轻主控负担
- 成熟的算法支持和丰富的开发资料
3. 电路设计与优化
3.1 PCB设计要点
本项目采用自制PCB板,主要包含以下功能模块:
- STM32最小系统电路
- 电机驱动接口电路
- MPU6050传感器接口
- 编码器信号处理电路
- 蓝牙模块接口
- 电源管理电路
PCB布局时需要注意:
- 电机驱动部分要远离模拟信号区域
- MPU6050尽量远离电机和电源等干扰源
- 电源走线要足够宽,减少压降
- 为关键信号添加滤波电容
3.2 电源设计问题与优化
原始设计中存在一个明显的电源问题:电机额定电压为6V,但设计采用5V供电。这会导致:
- 电机转速降低,扭矩不足
- 工作电流增大,可能超出电源模块承载能力
- 系统稳定性下降
经过实测,面包板电源模块(最大输出700mA)确实无法满足电机满载需求。为此,我提出了三种优化方案:
方案一:Boost升压方案
- 保留现有电源模块
- 增加Boost电路将5V升压至7V供电机使用
- 优点:改动最小
- 缺点:效率较低,可能仍有电流限制
方案二:LDO降压方案
- 移除电源模块
- 增加DC接口和LDO降压模块
- 7V直接供电机,降压至3.3V供其他电路
- 优点:供电更稳定
- 缺点:LDO可能过热
方案三(推荐):DCDC+LDO两级降压
- 移除电源模块
- 增加DC接口、DCDC和LDO模块
- 7V直接供电机
- DCDC先将7V降至5V,再通过LDO降至3.3V
- 优点:效率高,发热小
- 缺点:成本略高,电路稍复杂
经过实际测试,方案三表现最佳,系统工作稳定,各芯片温度正常。
4. 控制算法实现
4.1 串级PID控制架构
本平衡车采用串级PID控制结构,主要包含三个控制环:
-
角度环(内环):
- 输入:MPU6050测量的车身倾角
- 输出:电机基础PWM值
- 作用:保持车身直立
-
速度环(中环):
- 输入:编码器测量的电机转速
- 输出:角度环的目标角度偏移量
- 作用:控制平衡车移动速度
-
转向环(外环):
- 输入:左右轮速差
- 输出:左右电机PWM差值
- 作用:控制平衡车转向
这种串级结构使得各个控制目标解耦,便于单独调试每个环路的参数。
4.2 姿态数据获取与处理
MPU6050提供两种姿态数据:
- 加速度计测量的静态角度(Angle_A)
- 陀螺仪测量的角速度积分得到的动态角度(Angle_G)
单独使用任一种数据都有缺陷:
- 加速度计数据受振动影响大,动态响应差
- 陀螺仪数据会随时间漂移
因此采用互补滤波算法融合两种数据:
code复制Angle = a * Angle_A + (1-a) * Angle_G
其中a是滤波系数,通常取0.01-0.05之间的小值。
4.3 PID参数整定技巧
PID参数的整定是平衡车调试中最关键的环节。经过多次实践,我总结出以下经验:
-
先调角度环:
- 将速度环和转向环的输出置零
- 只保留角度环工作
- 先增大Kp直到车体开始振荡,然后减小到振荡消失
- 然后加入少量Kd抑制振荡
- Ki通常可以设为0或很小值
-
再调速度环:
- 固定角度环参数
- 给一个小的速度目标值
- 调整Kp使车体能平稳移动
- 加入Ki消除稳态误差
-
最后调转向环:
- 固定前两个环参数
- 调整Kp和Ki使转向响应灵敏但不振荡
注意:实际调试时,可以通过蓝牙小程序实时调整参数并观察效果,极大提高了调试效率。
5. 软件架构与关键代码
5.1 主程序流程
主程序采用定时中断+前台循环的架构:
-
1ms定时中断处理:
- 按键扫描
- PID计算
- 电机控制
-
主循环处理:
- OLED显示刷新
- 蓝牙通信
- 状态监测
这种架构保证了控制算法的实时性,同时又能及时处理用户交互。
5.2 关键代码解析
PID算法实现:
c复制void PID_Update(PID_t *p) {
p->Error_Last = p->Error_Now;
p->Error_Now = p->Target - p->Actual;
// 输入死区
if(fabs(p->Error_Now) <= p->Error_Dead)
p->Out = 0;
if(p->Ki != 0) {
p->ErrorInt += p->Error_Now;
// 积分限幅
if(p->ErrorInt > p->ErrorMax) p->ErrorInt = p->ErrorMax;
else if(p->ErrorInt < p->ErrorMin) p->ErrorInt = p->ErrorMin;
} else {
p->ErrorInt = 0;
}
// 微分先行
p->Out = p->Kp*p->Error_Now + p->Ki*p->ErrorInt - p->Kd*(p->Actual-p->Actual1);
// 输出偏移
if(p->Out > 0) p->Out += p->OutOffset;
if(p->Out < 0) p->Out -= p->OutOffset;
if(p->Out > p->OutMax) p->Out = p->OutMax;
if(p->Out < p->OutMin) p->Out = p->OutMin;
p->Actual1 = p->Actual;
}
电机控制实现:
c复制void Motor_SetSpeed_Left(int8_t Speed) {
if(Speed >= 0) {
GPIO_SetBits(GPIOB, GPIO_Pin_12);
GPIO_ResetBits(GPIOB, GPIO_Pin_13);
PWM_SetCompare1(Speed);
} else {
GPIO_SetBits(GPIOB, GPIO_Pin_13);
GPIO_ResetBits(GPIOB, GPIO_Pin_12);
PWM_SetCompare1(-Speed);
}
}
5.3 蓝牙控制实现
通过HC-04蓝牙模块与手机小程序通信,实现:
- 运动控制(前进、后退、转向)
- PID参数实时调整
- 系统状态监控
通信协议采用简单的字符串格式,例如:
- 按键数据:"key,Speed_Add"
- 滑杆数据:"slider,AngleKp,0.5"
- 摇杆数据:"joystick,0,50,0,0"
这种设计使得无需专用APP,使用通用蓝牙串口小程序就能实现控制。
6. 成本控制技巧
6.1 淘宝购物攻略
通过以下技巧可以大幅降低硬件成本:
- 在同一店铺购买电机和底盘,通常可以享受包邮
- 使用长期未购物的淘宝账号,系统会自动发放10元无门槛券
- 支付宝首次支付可减免5元
- 分多个账号购买不同部件,最大化利用新用户优惠
实测采购清单:
- 带轮胎和支架的6V编码电机 ×2(25元/个)
- 双层平衡车底盘 ×1(25元)
使用优惠后实际支付:30元
6.2 替代方案建议
如果预算稍宽松(50-75元),可以考虑:
- 使用质量更好的电机(约15-20元/个)
- 选择集成度更高的驱动模块
- 增加NRF24L01+无线模块实现遥控功能
- 使用容量更大的锂电池
7. 调试经验与问题解决
7.1 常见问题排查
-
车体无法保持平衡:
- 检查MPU6050安装方向是否正确
- 确认角度环PID参数是否合理
- 检查电机接线是否正确(正反转)
-
车体向一侧偏转:
- 检查左右电机转速是否一致
- 调整转向环PID参数
- 检查轮胎是否打滑
-
蓝牙连接不稳定:
- 检查天线是否完好
- 确保供电电压稳定
- 避开2.4G频段干扰源
7.2 实测性能优化
经过多次调试,最终获得的较优PID参数:
- 角度环:Kp=4.5, Ki=0.1, Kd=3.0
- 速度环:Kp=3.0, Ki=0.09, Kd=0
- 转向环:Kp=4.0, Ki=4.0, Kd=0
这些参数在不同硬件配置上可能需要微调,建议通过蓝牙小程序实时调整找到最佳值。
8. 项目扩展与改进
8.1 功能扩展方向
-
遥控功能:
- 增加NRF24L01+模块
- 制作专用遥控器
- 实现更精准的运动控制
-
路径跟踪:
- 增加红外或摄像头传感器
- 实现自动循迹功能
- 加入避障算法
-
手机APP控制:
- 开发专用Android/iOS应用
- 实现更丰富的交互功能
- 加入数据记录和分析功能
8.2 算法优化建议
-
姿态估计改进:
- 使用卡尔曼滤波替代互补滤波
- 增加磁力计实现9轴融合
- 提高姿态估计精度和抗干扰能力
-
控制算法升级:
- 尝试模糊PID控制
- 实现自适应PID参数调整
- 加入前馈控制改善动态响应
-
运动规划:
- 实现定点平衡
- 加入路径规划算法
- 支持复杂运动模式
9. 学习收获与心得
通过这个项目,我深刻理解了:
- PID控制算法的实际应用技巧
- 嵌入式系统软硬件协同设计方法
- 传感器数据融合的基本原理
- 机电系统调试的实践经验
最令我自豪的是在极低成本下实现了完整的平衡车功能,这证明了嵌入式开发不一定需要昂贵设备,关键在于对原理的深入理解和解决问题的创造力。
对于想要复现这个项目的朋友,我的建议是:
- 先从理解原理入手,不要急于动手
- 分模块调试,确保每个部分正常工作
- PID调试需要耐心,记录每次参数调整的效果
- 电源设计很重要,不要忽视它的影响
这个项目还有很多改进空间,我计划后续加入遥控功能和更先进的控制算法。嵌入式开发就是这样,永远有新的挑战和乐趣等待探索。