- A+
基于Arduino(单片机)+MPU6050(陀螺仪)+ TB6612FNG(电机控制)平衡车
网络上虽然有很多教程,非专业人士很难通过支离破碎的教程独立完成一个平衡小车的制作。特制作此教程简单科普一下平衡车。
材料及成本:
1. Arduino 25元
2. MPU6050 10元
3. TB6612FNG 8元
4. 带轮子电机2个 10元
5. 固定3MM横梁2个 3元
6. 洞洞板4 5元
7. 电池盒 1元
8. 18650电池3 节 24元
9. 5V稳压电源 3元
10. 电源插头,铜柱16个,杜邦线若干,开关,单排排母若干,单排排针若干,m3螺丝螺母若干 7元
合计:96元(不包括邮费)
我用的ArduinoUNO R3很早以前买的才17元 虽然理论贵的与便宜的没有区别,但在实际应用中稍微贵点的电源稳压输出稍微好一点 。
MPU6050,TB6612FNG种类很多,请自选,基本差不多。
带轮子电机2个,在选择电机上耽误很长时间,理论山应该选择扭矩大的直流电机,为节约成本选择次点击很便宜,我7元搞定。
此电机有缺陷,在平衡车静止时有1度左右的偏差,导致平衡车稳定性差。横梁没花钱从废光驱上拆下来的,也可以使用做车模的3mm钢轴。
洞洞板尽量要平整的,同时要考虑电池盒的大小,18650电池我从废笔记本电池拆解的,笔记本电池报废后,
仍然可以用于手电遥控车,只是笔记本使用时供电不足。杜邦线尽量质量好些,否则会出现莫名奇妙错误。
其他随意
工具:
电烙铁,焊锡,电钻,m3钻头,电脑,胶枪,螺丝刀,双面胶,数据线
基本概念:
1. PID
PID控制有专业书籍讲解,本人仅讲述自己通俗理解,欢迎指正。
上图就是PID算法原理图。
P=比例,I=积分,D=微分
简单都说从设定点输入——经过PID计算——输出——返回设置点在计算,如此循环下去,直至有跳出或终止命令。
用人话说就是我设定需要20度温度,温度计显示10度,差值10度经过PID计算输出个值,这个值用来控制加热功率大小,
然后继续测量温度与标准值的差别,再经过PID计算,输出个值控制加热功率大小,不断重复重复,直到温度计与设定值一致,输出数值停止加热。
P的作用用来控制精度,比如设定值为20度,温度计为19.99度,只有0.01差值,P可以设置为100,先当于100*0.01=1,
把误差值扩大100倍,也可以1000*0.01=10,把误差值扩大1000倍。(P过高,系统容易超调,可以根据误差大小随时设定P值)
I有两种积分,位置积分和增量积分,我的平衡车仅使用增量积分。增量积分主要作用时消除静态误差。
当P值可以基本稳定平衡车时,你会发现,小车会有抖动,I就时消除这部分静态误差的。增量积分误差仅与当前、前一次和前前次误差误差相关。
D是误差变化率,它预测下次误差多少,容易引起震荡反正我没用。
输出值=P*误差值+I*近三次误差+D*预测误差值
PID参数值在矛盾中寻求平衡值。
2. 卡尔曼滤波
理解不深,借用网络答案。
通俗的来说,卡尔曼滤波就是平均的一种更优算法(我们知道求平均是一种比较简单的滤波)。
例如,对于x_{k} 和x_{k-1} 2个时刻的状态,我们可以用其平均来进行初步滤波,即
{x_{k}} = 0.5*x_{k} + 0.5*x_{k-1} 这其中0.5是一种很简单的权值,平等的考虑了x_{k} 和x_{k-1} 2个状态的值。
但卡尔曼滤波的权值是根据系统状态和噪音计算出的最优权值K:
{x_{k}} = K*x_{k} + \tilde{x_{k-1}} 所以用其滤波,在线性系统中是最优的。
3. 电机反馈
这个我没做,仅有个码盘,后期可以通过码盘测量小车速度。仅应友人做直立平衡即可。测速很简单如有需要后期可以加入。
调试过程:
调试过程很简单,只需要确定P值。需要注意的是,直流电机在不同电压输出功率不同,建议电机与电源之间加入稳压模块,
否则会因为电池工作电压下降造成P值的变化。
电机控制是0-255之间的数值,程序中有串口输出,需要连接电脑查看输出参数及平衡车反馈,
来决定P值大小(每辆车重心和精度不一样需要耐心调节)。我设定平衡车偏移10度,就停止调控,
也就是说0-10度的便宜,对应0-255的数值比例。
基本都可以调平衡,只是不是太稳定,调平稳简单的说就是没10毫秒测一下X角度,控制一下电机转动,
如果没变化就是电机输出力度小,把p调高,如果X轴一下由负变正那就是P值太大,在某一区间调整即可。
P值调整后就可以同理调I值。
D值我没调。
因为我平衡车有1度左右的框量,很不精确,所以当X轴基本能维持平衡时,就放弃调整,基本可以满足在某一秒可以保持平衡。
最佳方案小车在不加电时,能稳定的直立。这样就可以保持长时间甚至一直直立。
我所用的这个库有专业的自动调节库,我没有使用请自行搜索。
代码模块化:
为方便调节pid值,主循环已加入可以调节pid值的函数。主循环就一个判断偏移角度是否大于10度没做函数化。
可选择改进:
关于轮胎双面胶,因为电机+轮胎才3.5元,轮胎是塑料的软胎,车体也不是很重(重了电机又带不动),
就相当于塑料可乐瓶在瓷砖上打滑,基本没有摩擦力,只能上双面胶,据说硬的实心橡胶轮胎效果很好,可自己买的轱辘怎样也得用上。
关于重心问题,以前看过一篇文章(可惜找不到了),并不是重心低就容易平衡,重心相对的上移,可以加长控制力矩。
做个不恰当的比喻口红你很难让它直立于手指上,但你把口红重量的木棍或没有口红重的筷子直立于指尖相对容易,因为控制力矩长了。(请指正)
直流电机换步进电机电机问题,步进电机很多优点,扭矩大,精准,就一个缺点贵。不适合我那个在校小同学,我主要是告诉他原理。
我倒是用步进电机做了个激光雕刻机。主要科普,懂了原理,换伺服电机效果会更好。
关于最小系统,arduino是开源硬件,只需要芯片+晶振+电容就可以做最小系统(以后可以做)。
我推荐先用现成开发板,第一很便宜20元左右,第二有串口芯片,可以方便与电脑通信,
第三UNO板子仅仅有电源稳压和焊接好的引脚+Arduino最小系统,网上还有电路图,
对于新手这板子足以(我雕刻机也是这个板子做的,可以重复利用)。单独arduino芯片有的没有引导,对于新手越简单越好。
推荐课程:
仅推荐入门课程,专业的太高深。
某工坊网站有arduino精华控制实例,都很简单,代码注释全面,学会里面40个实例,基本算是半只脚踏入单片机大门。
想精进请系统学习单片机专业课程。
还有个建议,就拿PID算法来说,其实运放+电容+电阻就可以实现,就是说硬件也可以完美的实现这个算法,
就是制作成本高,改动麻烦,一般人很难有条件。所以我觉得会单片机编程仅能算程序员,还有种高大上的职业,电气工程师。
TB6612FNG(因为去广告只能显示部分图片)
5V稳压
MPU6050
硬件组装:
软件:
请搜索arduino上传数据方法。(附源代码)
总结:
1. 本电机轱辘摩擦力不够一定一定将轱辘粘贴双面胶然后测试,本人因此耽误了1个星期,始终不能保持平衡,
做了大量跟踪最终搞明白是摩擦力不足。
2. PID算法很简单,基本就是测定现在状态,和你给出的平衡值比较,然后按公式计算出应当输出的值,
输出给电机,然后重复重复再重复。PID分位置积分和增量积分,平衡车一般使用增量积分。请自行搜索区别,还是很大的。
3. 每一个小车因制作水平不同,重心及平衡点不一样,请慢慢调试。基本都可以站立,本人制作大概用了2星期,包括买零件,调试,很简单。
4. MPU6050输出使用卡尔曼滤波,对比二阶滤波相差不太大。简单的说MPU6050输出很不稳定有噪声干扰,
滤波就是让MPU6050输出看起来像是线性输出,输出结果波动尽量小。
5. 所用的库都可以搜索。
6. 平衡车相对简单,国内有比赛,不过成本费用太高大概1000元左右。后期可以加入摄像头或红外寻迹,也可以尝试diy4轴无人机。