找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11381|回复: 10
打印 上一主题 下一主题
收起左侧

低成本、低档自平衡小车历程(超声自平衡小车)

  [复制链接]
跳转到指定楼层
楼主
第二阶段目标:

如标题所述,真正的入门级平衡车,真的低成本,不用陀螺仪和加速度传感器,用超声波测距实现平衡的小车!!!
见 114# 介绍!!!

第一阶段总结:
1# 第一版详细资料。

42# MPU6050-DMP输出稳定性测试,DMP每次启动后均要20秒左右后角度输出才稳定,使用者要注意此问题!!!

43# 第二版小车,硬件做了块PCB底板,换了一个全光耦隔离的L298N模块,这个版本做两款软件:一是单侧码盘测速,另一是用PWM输出值取代测速码盘,效果也不错。

50# 蓝牙手机控制助手,编写了一个简单的安卓控制平衡小车的程序。

56# 自平衡小车参数整定方法,针对前面一些经验和教训,总结了参数调整中的一些问题。

63# 不用MPU6050的DMP输出,采用原始数据一阶互补滤波解算角度,也不用PID库,直接编写PID计算,效率更高,稳定性与控制效果也更好。

65# 第三版源代码,测试数据和最新视频效果。

2014.12.4

以下为原1#贴内容

一、基本材料
1、Arduino Pro Mini模块
2、CP2102模块
3、MPU6050模块
4、CH06蓝牙模块
5、L298N驱动模块
6、测速传感器模块
7、小车底盘


二、硬件设计
1、Arduino Pro Mini + MPU6050测试验证
Arduino Pro Mini模块与MPU6050模块的连线图见前面图片,即:SDA接A4,SCL接A5,VCC接VCC,GND接GND,INT接2。
下载:i2cdevlib-master(https://github.com/jrowberg/i2cdevlib
****MPU6050库的安装方法*************************
a. 下载arduino编译器,目前版本为1.0.5。
b. 下载MPU6050库。进入“https://github.com/jrowberg/i2cdevlib”,点击“zip”即可。
c. 安装。将上一步下载的“I2Cdev”、“MPU6050”两个文件夹拷贝到“arduino-1.0.5libraries”目录下。
运行arduino可以在例子中看到MPU6050。OK!

2、硬件原理图
Arduino-Pro-Mini-schematic.pdf (37.43 KB, 下载次数: 13)




其中D2S为外部中断0的接线选择:一种选择是MPU6050的DMP方式,这种方式就只能用一个测速码盘计数了;另一种选择是用两个测速码盘计数,但不能用MPU6050的DMP方式。

三、软件设计

1、源代码
WJY_DIY_v1_2.rar (3.23 KB, 下载次数: 28)

2、说明
此处虽然用了速度PID,但这个的输入是码盘计数值,这个值其实不是速度,而是速度的累加,也就是速度的积分,所以其Sd、Sp这两个参数分别对应于速度环的P系数和I系数,也就实现了速度环的比例和积分这两项。

PID调节公式:PWMOut = KAp*angle + KAd*angle_velocity + KSp*speed + KSi*position

四、参数整定
1、先将 kp、ki、 kd、 sp、 si、sd 均设置为0;
2、先设定一个电机的起步补偿值,因为这个之不同,就相当于使用了不同的电机,这个值的选择,是根据你自己搭建完平台后,通过测试左右电机的起步值和停止值,然后综合考虑设定的,也没什么理论指导,在起步和停止之间分别候选几个,然后根据不同的补偿值,在分别调整PID的系数,这样优选一组即可;
3、逐渐增大 kp 使得小车刚刚来回摆动;
4、再逐渐增大 kd 使得小车的摆动消失,再继续增大 kd 小车会出现抖动,适当减小 kd,使得小车相对平稳即可;
5、接下来调节 sd(注意不是 sp,理由见软件设计的说明部分),使得小车能够来回走动(不是摆动,也不是抖动);
6、最后逐渐增大 sp,使得小车能够相对稳定;
7、什么程度为好,自己花一定的时间慢慢摸索,就能逐渐体会到自己的一套“主观”标准了!
8、最后一个参数也要注意,就是“抗积分饱和”值,这个值的选择我感觉与 sp 的大小有关,自己摸索吧,这个值如果选择太大会出现往一边跑,最后跌倒在地;如果太小会很快倒地。

五、初步成果
1、静态照片


2、运行曲线图


3、视频




六、问题及解决方案
1、电机性能测试
小车平台装配完毕,应测试一下,两个电机的特性,测试程序如下:
WJY_DIY_test.rar (1.01 KB, 下载次数: 19)

用此程序分别测试两个电机的启动值和停止值,也可测量两个电机的速差。

2、电机干扰问题
电机一起动,Arduino + MPU6050就无法工作,这个问题,在各论坛中均有提及,我这里采取的措施是,电机单独用一块7.4V的锂电供电,并且L298N的所有控制线均用光耦隔离。

3、系统供电
除上述电机供电外,系统其他部分的供电绝不可仅用 Arduino Pro Mini 上的稳压电源给其他部分供电, Arduino Pro Mini 上的稳压电源输出所能提供的电流有限,我这里仅用他给 MPU6050 模块供电,蓝牙串口模块单独用一个低压差稳压模块给其供电。

七、参考资料
1、pz_cloud 的:做了一个小小的自平衡小车(更新完整版,附视频)
http://www.geek-workshop.com/thread-5688-1-1.html
2、匠人的百宝箱:《自平衡两轮车》讲义 http://bbs.21ic.com/blog-24110-84728.html
3、求助:用MPU6050,L298N控制的平衡小车,运行1分钟就死机,(含详细代码注释!已上...
http://www.geek-workshop.com/thread-1548-1-1.html
4、MPU6050库,https://github.com/jrowberg/i2cdevlib
i2cdevlib-master.zip (295.46 KB, 下载次数: 13)

5、PID库: PID_v1.zip (7.47 KB, 下载次数: 19)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:113207 发表于 2016-4-11 02:09 | 只看该作者
我测速模块烧了,今天修改了一下程序,用PWM的值取代测速码盘,效果也不错!
明天试另一方案:用6050模块的加速度积分取代测速信号检测,作为速度PID的输入,看看效果如何?如果成功,下次在用6050的方位角信息来控制小车的两轮均衡运转,或者控制小车的转向。
MPU6050-DMP输出稳定性测试
在以往调节平衡小车的过程中,发现小车的平衡角不断改变(不是物理的改变,而是测量结果的改变),造成的结果,就是小车往一边跑,如果不及时修正角度设定值,小车就自己倒下了。
上两张测试结果图


从测试结果来看,倾斜角大约需要20多秒才能稳定下来,方位角虽然在20秒左右稳定下来了,但输出始终在小幅漂移。

---------------------

新款的小车,做了块PCB底板,换了一个带六路光耦隔离的L298N模块,上两张图片

PCB底板上安装有:Arduino ProMini模块、MPU6050模块、蓝牙模块、低压差5V稳压、电池及充电线插座。

整机取消了测速码盘,下面安装了一组电池共底板上各部分供电,最上面的一组电池共L298N模块供电。




摆动是在平衡之前,也就是开始你的小车用手扶着,松开就倒,但你逐渐增大Kp后,再松开手,就会发现它来回摆动了,这时就已经初步成功站立了,然后再逐渐增大Kd……


给自己的小车编了个简单的安卓手机蓝牙控制程序,先上界面(本人水平有限仅能做这种特简单的界面):

再上源程序和APK安装程序
WJY_DIY_APK.rar (509.36 KB, 下载次数: 20)
开发工具软件是:RFO_BASIC!
也是小巧好玩的东西,可以在手机上直接编程并运行!
Basic.rar (417.95 KB, 下载次数: 10)

Builder_APK.rar (670.89 KB, 下载次数: 15)

1.rar (7.97 MB, 下载次数: 17)



回复

使用道具 举报

板凳
ID:113207 发表于 2016-4-11 02:50 | 只看该作者
自平衡小车参数整定方法

1、将Kp、Ki、Kd、Sp、Si、Sd均设为零。
2、用支架将自平衡小车支起,处于水平状态。
3、在程序每次输出小车实际角度的同时,输出Arduino的系统时间[用millis()函数],下载并运行程序用串口调试助手记录系统时间与MPU6050的角度输出,记录足够的数据后“保存窗口”数据,用Excel打开记录的数据文件,观察数据稳定时间。




4、确定完这个稳定时间后,将程序输出恢复到原来状态(去掉时间输出部分),重新下载,去掉小车支架并启动运行;将小车放置于一固角度位置,保持不动,观察角度输出数据是否稳定(这个时间必须大于第3步所测时间),待数据稳定后,用手扶着小车找其自然物理平衡角;通过串口工具输出“G”或“g”将平衡设定角“setp0”设置到与小车的自然物理平衡角相一致。
5、这此之后小车的整定过程中不要断电,始终保持运行状态,逐步增加Kp,观察小车的两轮是否有抵抗角度变化的力量,如果不仅不能抵抗角度的变化,而是顺着角度变化(增大角度的变化),则将顺其变化的控制电机接线反过来接,再继续下一步。
6、继续增大Kp,小车会出现来回摆动,增大或减小Kp,使其摆动的幅度不导致小车倾倒为原则。
7、增大Kd,小车的摆动会逐渐减小,如果继续增大Kd,小车会出现抖动现象,调节Kd,使其相对平稳(因为香蕉电机很难做到特别稳定)即可。
8、逐渐增加Sd(这里也要做个判断,用手平推小车,小车是否有抵抗行为,如果没有抵抗,而是顺其运行,说明速度环控制方向反了),使得小车来回走动(不是摆动),然后增加Sp,使其来回走动逐渐减小,达到比较满意即可。

注意:第四步必须做,否则小车往往就跑向一边了!!!
自平衡小车参数调整方法.rar (181.72 KB, 下载次数: 18)


------------------------------------------

今天参考了
Arduino 自平衡小车,制作经验记录与分享,愿有兴趣人士,一起学习探讨。
http://www.51hei.com/bbs/dpj-48041-1.html
的帖子,根据自己小车的实际情况做了一些调整,完成了第3版的平衡小车,没用使用MPU6050的DMP功能了,读取原始数据采用一阶互补滤波求角度,这样可以用两个中断测量左右轮的速度了。
这个效果感觉更好,几乎仅用一个Kp就能站立了,我测试了一下程序的整个运行周期,大概在3~4ms,这样调整速度更快了,所以感觉效果好多了。
另外,由于码盘一圈才20个孔,我才用电平变化测量方式,一圈也就计数40次,所以在一个周期这么短的时间内,速度计数几乎为0,所以我是200ms左右测量一次速度。
读取MPU6050的原始数据计算出来的角度几乎启动后就是稳定的数据,DMP方式要20秒左右才能稳定!!!



--------------------------------------------

第三版最新程序代码:
WJY_DIY_v1_4.rar (2.16 KB, 下载次数: 14)
程序中增加了一个两轮速度差修正系数Kdsp,由于我这个测速码盘只有20孔,所以速度差检测不太敏感,目前效果不明显,要么增大速度差的采样周期,但这样反应也就变得很慢,先天硬缺陷,没法与高端的相比。

测试记录数据(500ms一个点)见下图:

图中红色区域,可以看出,当小车实际角度偏离机械平衡点超过一定值(这个值由PID的调整输出与电机的启动阈限决定),由于快速的PID调整,即使是香蕉电机也能很快调整到新的平衡点。
详细数据如下:
SAVE2014-12-4_17-57-30.rar (10.73 KB, 下载次数: 15)

最新视频效果



WJY_DIY_v1_4_1.rar (2.2 KB, 下载次数: 15)

回复

使用道具 举报

地板
ID:127462 发表于 2016-6-20 20:01 | 只看该作者
学习,学习,学习谢谢
回复

使用道具 举报

5#
ID:136714 发表于 2016-8-14 07:36 | 只看该作者
学习,学习,学习谢谢
回复

使用道具 举报

6#
ID:140059 发表于 2016-9-21 18:18 | 只看该作者
学习,学习,学习谢谢
回复

使用道具 举报

7#
ID:140874 发表于 2016-9-29 14:18 | 只看该作者
给力啊   超赞
回复

使用道具 举报

8#
ID:79544 发表于 2016-11-21 15:52 | 只看该作者
51hei学习 发表于 2016-4-11 02:50
自平衡小车参数整定方法

1、将Kp、Ki、Kd、Sp、Si、Sd均设为零。

楼主。有51的就好啦。学习分享学习啦,再就是你的那个软件怎么安装和使用,谢谢!
回复

使用道具 举报

9#
ID:151483 发表于 2016-12-1 21:30 | 只看该作者
谢谢分享
回复

使用道具 举报

10#
ID:229378 发表于 2018-4-10 13:52 | 只看该作者
感谢楼主!!!!!!!!!!!!!!!!!!!
回复

使用道具 举报

11#
ID:1022278 发表于 2022-5-18 14:08 | 只看该作者
51hei学习 发表于 2016-4-11 02:09
我测速模块烧了,今天修改了一下程序,用PWM的值取代测速码盘,效果也不错!
明天试另一方案:用6050模块 ...

程序没有啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表