最近制作的平衡小车(金属轮毂)
最近比较闲,于是开始研究平衡小车,零件都是以前买的。新买了一块陀螺仪+加速度传感器,开始鼓捣,配置如下:主控:Arduino Atmega168
电机驱动:L298N+自己焊接的光耦
电机:Namiki空心杯行星减速电机,12v 120转/分
轮子:橡胶圈+金属轮毂
电池:11.1v 20c锂聚合物电池
传感器:IDG300+ADXL325
上图:
发个视频,初次站立,但是不能稳定。
注意视频最后几秒,当把限位拿掉时,小车就向前冲,最后跌倒。大侠帮忙分析一下原因。
轮子小了?电机速度不够?还是参数没调好?
http://v.youku.com/v_show/id_XMzkxODI4NDE2.html 没见着他倒啊 没人顶?还请大侠们帮分析一下站不住的原因{:dizzy:}。参数调整了两天,K值高了又会发抖,低了站不住。现在觉得是不是电机速度太慢了?跟不上小车倒地的速度,所以冲一段就倒下了。 {:biggrin:}现在小车像喝醉酒一样,有时能立住几秒,然后前后摇摆跑几下,最后倒地。什么原因? {:sad:}求帮助! 小机器人站起来了,不会倒了。但是还不稳。整整调试了3天参数啊!!{:cry:} 晚点发视频 基本不会倒了,晚点再调试参数,改善一下稳定性
调试过程中,多少个日日夜夜碰到棘手的问题,几乎没人愿意解答。一个个调整参数,再一次次看到小机器人边抽筋边摔倒,真是痛苦。但是现在想想,其实也有好处,碰到很多问题自己先琢磨,然后查资料,最后加以解决,每一个原理你都能理解了,那是有莫大快乐的!现在把我的制作以及调试经历发出来,供大家参考,争取初学者都能顺利的做出来。
先简单说一下原理:平衡小车目标就是在运动中不断地找到自己的平衡点,使自己保持站立。当车身往一边倾斜时,处理器能快速采样到加速度传感器给出的当前加速度,以及陀螺仪给出的当前角速度,并进行数据融合,(这里采用卡尔曼滤波),然后运算出真实角度和角速度。最后采用PID算法算出对应电机pwm值,驱动轮子进行倾斜纠正。
几个遇到的问题:
一、传感器的选择。
刚开始我也琢磨不定,要采取3轴加速度还是2轴?3轴陀螺仪还是2轴陀螺仪?事实是,一轴陀螺仪和一轴加速度即可。当前采集到的加速度Ax=g*sin(a),可以用反正弦推导出当前角度a,g为重力加速度。这里说明一下:如果小车前进后退产生的加速度会干扰码?我的理解,答案是会。怎么解决?卡尔曼滤波器可以解决此干扰。其次,注意传感器的安装位置。比如选择X轴输出,X轴一般指向小车前方,水平安放。
我使用IDG300陀螺仪和ADXL320加速度传感器。关于采集的数据转换这里说明一下:
-------------------------------------------------------------------------------------------------------------------
ADXL320数据转换说明:
灵敏度:174mv/g
1g加速度=?v 转换后AD值=343 本机姿态:垂直静止(前俯)
-1g加速度=?v 转换后AD值=271 本机姿态:垂直静止(后仰)
0加速度=1.5v 转换后AD值=307 本机姿态:水平
推导:当前加速度Ax=g*sin(a) (a为当前倾角,站立时为0°前俯为正,后仰为负,g为重力加速度。)
a=arcsin(Ax/g)
而AD分辨率为1024对应0-5v
每读数为5/1024=0.0048v=4.8mv
又 ADXL320读数为174mv/g
=> Ax=((AD-307)*4.8)/174
=>当前角度a=arcsin( ( (AD-307) *48/1740 ) / 0.98)
简化为: a=arcsin(0.028*AD-8.596)
Arduino代码实现注意事项:1.a必须定义为float,否则运算结果为0。
2.a反正弦asin()计算出来为弧度,要乘以57.3之后为角度。
---------------------------------------------------------------------------------------------------------------------
IDG300数据转换说明
灵敏度:2.0
0角速度:1.5v 转换后AD值308 状态:静止
当前角速度:angle_rate=(AD值-308)*(5v/1024)/2.0mv °/s
即 angle_rate=(IDGval-308)*2.4°/s;
----------------------------------------------------------------------------------------------------------------------
二、需要电机有码盘吗?小车速度如何计算?
小车如果只是站立,是不需要码盘的,直接用PWM值乘以一个系数来代替车速,至于这个系数如何得出,不好计算。pwm值和电机速度不是线性关系的,需要数据采样和函数拟合,非常麻烦。这里采用笨方法,先把系数设为1,然后0.1递加或递减来观察。
三、电机驱动问题,光耦隔离电路
电机驱动采用L298N成品板。开工前在论坛潜水,发现电机驱动需要光耦隔离,否则小车平衡时快速正反切换,电机产生的反电动势会造成单片机死机。我的L298N成品板没有光耦隔离,于是另外焊接了光耦隔离电路。建议大家直接买带有隔离的成品。
关于光耦隔离电路,做几点说明:
1.采用TLP521-4芯片
2.没有隔离开电源,直接共地。似乎也没影响。
3.限流电阻采用200Ω,电阻太大板子不工作。
四、主控的选择
Arduino 成品板。搭载Atmega168
五、电机和轮子的匹配问题
刚开始小车总往一边跑,以为是轮子小了,或电机速度不够。后来耐心地调对了参数,小车就立起来了。但是看了很多平衡小车,包括Segway,发现更大的轮子似乎更稳定。电机速度慢了轮子要大些,否则跟不上纠正速度。电机速度快了轮子要小些,否则扭矩可能不够。
六、卡尔曼滤波参数要自己整吗?
关于卡尔曼滤波,还在研究,很多问题尚不清楚,我是用现成的。直接输入角度和角速度,然后函数输出最优角度和角速度。这个滤波器很强大,大幅度震动基本都没有影响。
七、关于参数调整的几个现象以及可能原因
1、在中点震荡
可能角度K值偏大,可适度调小(K值即PID系数)
2、小车来回跑动,幅度越来越大,发散不能收敛
可能速度限制不够,pwm值系数要上调,角速度K值适度下调。
3、往固定一边倒
硬件方面:轮子小了或电机速度过慢
重心偏差过大
软件方面:采集的角度中点差值要调整。加上或减去一个偏差。这个需要摸索。不过很好调整的。
角度K值上调或pwm系数调大
4.腿软立不住
角度K值上调
这是我调试小机器人的一点体会,打字辛苦,各位看官觉得好顺手就顶一下吧!哪里有错误请指正!
恭喜lz! 站立视频 http://v.youku.com/v_show/id_XMzkzNTQxMDgw.html 视频效果很不错啊~~
总往一边偏的问题目测是重心的问题..不知LZ的角度是怎么标定的?能不能人先把小车扶起来,然后启动系统,这时候读进来的角度标定为0°,之后以这个角度为基准来控制?感觉这样的话改一改程序就行了,硬件上不用大改。
另外不知道LZ的传递函数是什么,中点抖动也有可能是穿越频率选的太小(还是太大???),不过好像改了穿越频率之后增益也要变化,效果也不一定改善= =|||如果能在手推一下之后记录一段时间小车的角度值画个曲线出来可能会看的比较清楚到底是哪个参数的问题。
其实没做过自平衡小车= =||,上面也是照着倒立摆的软仿真猜的,不一定对,LZ自己拿主意吧~~ {:smile:}感谢楼主的经验总结 gyth_lx 发表于 2012-5-9 14:01 static/image/common/back.gif
视频效果很不错啊~~
总往一边偏的问题目测是重心的问题..不知LZ的角度是怎么标定的?能不能人先把小车扶起 ...
角度是输入卡尔曼滤波前减去一个差值,这个差值依靠小车姿态判断,如果老往一边倒,差值就减去多一些,如果往另一边倒,就加上多一些,如此反复调整。这个状态刚开始比较稳定,可能是电源问题(我使用5v手机充电器给板子供电),导致陀螺参考电压漂移,造成小车有点漂的感觉。至于“穿越频率”,将角度K值调低就可以减小中点抖动。还有我是单纯使用PWM值乘以一个系数代替速度,没有滤波,可能会有稍许误差,这也是可能偶尔抖动的原因。 kent.c 发表于 2012-5-10 08:09
角度是输入卡尔曼滤波前减去一个差值,这个差值依靠小车姿态判断,如果老往一边倒,差值就减去多一 ...
之前只用过数字陀螺仪-.-刚才刚看懂角度怎么取…能不能先不用加速度计,直接默认上电瞬间角度为零?用陀螺仪输出的角速度积分获得角度。陀螺仪有零漂的话随着积分应该角度偏差越来越大,如果始终稳定一个角度偏差的话有可能跟零漂关系不大了。另外还想问下pid控制器的实现方法~ LZ那些材料是一整套购买的么,哪里有卖配件? kent.c 发表于 2012-5-8 13:17 static/image/common/back.gif
基本不会倒了,晚点再调试参数,改善一下稳定性
调试过程中,多少个日日夜夜碰到棘手的问题,几 ...
LZ好厉害的说,以后有关这方面的问题还望指教哈! syuan163 发表于 2012-5-10 09:22 static/image/common/back.gif
LZ那些材料是一整套购买的么,哪里有卖配件?
不是整套买的,零件箱翻出来的旧物,以前淘宝淘的。就是新买了一块加速度&陀螺仪传感器。机身是自己设计,亚克力材料激光切割的。 想购买零件就照着我一楼列出的清单淘宝搜索,除了轮子,其他都有的 楼主,请问多长时间去控制一次电机啊? 楼主可以看一下飞思卡尔智能车官网,今年电磁车要站立,给了很多教程,有参考价值~
来自:amoBBS 阿莫电子论坛 Android客户端 楼主可以看一下飞思卡尔智能车官网,今年电磁车要站立,给了很多教程,有参考价值~
来自:amoBBS 阿莫电子论坛 Android客户端 楼主可以看一下飞思卡尔智能车官网,今年电磁车要站立,给了很多教程,有参考价值~
来自:amoBBS 阿莫电子论坛 Android客户端 sincelh 发表于 2012-5-11 00:22 static/image/common/back.gif
楼主,请问多长时间去控制一次电机啊?
10ms产生一次中断,进行AD读取,卡尔曼滤波和PID计算 论坛下不了附件,代码详见http://bbs.roboticfan.com/showtopic-10901.aspx 我也调试了很久,小车跟LZ的一样,一开始能站立,然后像喝醉了酒一样前后跑到,最后就倒下了,有的时候站着就也会突然倒下,所以我以为是卡尔曼做的不好,反复修改卡尔曼那几个参数,现在越调越烂,焦躁中了好些天了。挺佩服LZ的,一个人不厌其烦的调试,看来这几天我还得按你的方法继续调试,谢谢LZ了。 卡尔曼滤波我是原封不动的直接使用,主要是PID参数,小小的变化对整个车的姿态都会有影响,有时候能不能站稳就是小数位的一点变化。看来数学建模还是很重要的,不然弯路太多了{:biggrin:} 坚决顶一下,楼主,我是学机电的,最近学了stm32,也想做点东西,你能否给点建议,我以前也没有做过什么东西,就是有点51的基础,但没有真正的用过,望指教。 kent.c 发表于 2012-5-10 11:20 static/image/common/back.gif
想购买零件就照着我一楼列出的清单淘宝搜索,除了轮子,其他都有的
恩,那制作这个难度大不大,我看一般都不用51单片机来做,是做不了么,还是你们都是用高级的芯片控制? 不错,想要一个硬件的平台,主要是轮子齿轮什么的很难弄啊。 顶lz 加油! 技术含量很高
祝贺~~~~~~~~~~~~~ 楼主,为何我的车总往一边加速跑,直到倒下?调了很久 菜鸟stm32 发表于 2012-5-12 11:48 static/image/common/back.gif
坚决顶一下,楼主,我是学机电的,最近学了stm32,也想做点东西,你能否给点建议,我以前也没有做过什么东 ...
那就先把stm32l例程都做一遍,熟悉一下外设。然后根据自己的爱好和想法去实现一点东西。祝成功 syuan163 发表于 2012-5-12 12:14 static/image/common/back.gif
恩,那制作这个难度大不大,我看一般都不用51单片机来做,是做不了么,还是你们都是用高级的芯片控制? ...
没用51做过,不过听说51卡尔曼滤波速度较慢,会有滞后现象。可能要互补滤波才行。 sincelh 发表于 2012-5-12 20:33 static/image/common/back.gif
楼主,为何我的车总往一边加速跑,直到倒下?调了很久
恩,我的车刚开始也是这样,有几个原因
第一,主要原因,还是PID系数不对,还需调整。尝试将速度系数调大。
第二,可能电机速度不够或轮子太小。换快一些的电机或轮子试试。不过可能性较小
第三,将车身重心上移试试。重心离轮子越远,矫正扭力越小,电机越有力。修正需要的行程越小,试联想我们用手指立一个筷子,大小端哪个好立?
试试这几点改进,祝成功!主要参数还是要耐心调试,根据一些改进后的姿态去修正参数。 kent.c 发表于 2012-5-12 23:06 static/image/common/back.gif
恩,我的车刚开始也是这样,有几个原因
第一,主要原因,还是PID系数不对,还需调整。尝试将速度系数调大 ...
嗯,谢谢。那请问加速度计应该放在重心处,还是放在底部? 有空也做一个! kent.c 发表于 2012-5-11 18:59 static/image/common/back.gif
卡尔曼滤波我是原封不动的直接使用,主要是PID参数,小小的变化对整个车的姿态都会有影响,有时候能不能站 ...
LZ卡尔曼滤波程序哪里找的,可否共享之? sincelh 发表于 2012-5-13 00:26 static/image/common/back.gif
嗯,谢谢。那请问加速度计应该放在重心处,还是放在底部?
放在底部误差较小,但是卡尔曼滤波后效果差不多,我是放中间。 syuan163 发表于 2012-5-13 14:52 static/image/common/back.gif
LZ卡尔曼滤波程序哪里找的,可否共享之?
详见24楼,代码里有。就是zstone帖子里那个原封不动。 还有一事请教,如果我轻抚着车顶部,车就会很缓慢的来回摆动(大约正负几度),请问这是为何? kent.c 发表于 2012-5-13 19:14 static/image/common/back.gif
详见24楼,代码里有。就是zstone帖子里那个原封不动。
对不同单片机都是通用的吗?只要是C语言的? sincelh 发表于 2012-5-13 22:52 static/image/common/back.gif
还有一事请教,如果我轻抚着车顶部,车就会很缓慢的来回摆动(大约正负几度),请问这是为何? ...
你的小车不让你抚摸,在“抵抗“{:titter:} syuan163 发表于 2012-5-13 23:56 static/image/common/back.gif
对不同单片机都是通用的吗?只要是C语言的?
对的,输入采集的角度,角速度,输出滤波后的角度,角速度 kent.c 发表于 2012-5-12 22:55 static/image/common/back.gif
那就先把stm32l例程都做一遍,熟悉一下外设。然后根据自己的爱好和想法去实现一点东西。祝成功 ...
谢谢啊{:biggrin:} 今天的毕业设计就着玩意~做出来了~精简修改feng741的程序,帖子地址http://www.ourdev.cn/thread-4506043-1-1.html。
今天换了电机,换了外接的12v驱动电源~比电池给力~吼吼~能站蛮久的~就是最终会倒下~再修改修改,等成熟了,全部开源放出来,最少的钱,最精简的程序给大家做参考~吼吼~嘿嘿~先借楼主打个广告~就不上图了~ culapple 发表于 2012-5-17 00:49 static/image/common/back.gif
今天的毕业设计就着玩意~做出来了~精简修改feng741的程序,帖子地址http://www.ourdev.cn/thread-4506043-1 ...
不错。期待你的作品 楼主,控速有何思路没? 几天不见有很多进展么 辛苦diy,顶!
culapple 发表于 2012-5-17 00:49 static/image/common/back.gif
今天的毕业设计就着玩意~做出来了~精简修改feng741的程序,帖子地址http://www.ourdev.cn/thread-4506043-1 ...
你做出来了没呀,在坛子里看其他人的大多数资料都不能下载了,期待你的哈。还有就是有一点我不明白:陀螺仪和加速度传感器通过AD转换后怎么经过卡尔曼滤波将得到的数据来控制电机,可否告知一二? syuan163 发表于 2012-5-21 19:00 static/image/common/back.gif
你做出来了没呀,在坛子里看其他人的大多数资料都不能下载了,期待你的哈。还有就是有一点我不明白:陀螺 ...
做出来了~改良了,去掉了速度传感器~直接角度控制的~这几天准备考试~没时间整理。
关于角度传感器和陀螺仪的数据融合,直接用的卡尔曼模块~把角度和陀螺仪的值经AD转换后,再转换成角度值和角加速度值,作为卡尔曼的输入,输出就是一个很稳定的角度,
任何给这个角度X一个系数P,角加速度x系数D,基本就能站立了~等我整理好,开个帖子吧~我是偷师学艺哈~见笑~~嘿嘿 culapple 发表于 2012-5-22 11:40 static/image/common/back.gif
做出来了~改良了,去掉了速度传感器~直接角度控制的~这几天准备考试~没时间整理。
关于角度传感器和陀螺 ...
呵呵,那也要有能力才行哈,那期待你早日出帖哈,嘻嘻,我也想偷师学艺哈! culapple 发表于 2012-5-22 11:40 static/image/common/back.gif
做出来了~改良了,去掉了速度传感器~直接角度控制的~这几天准备考试~没时间整理。
关于角度传感器和陀螺 ...
这个车既好玩又能学技术,期待你早日发帖共享资料。 楼主是美女啊 {:titter:} 学习 mark,我也准备自己做个,正在选材料。 gongnn 发表于 2012-5-22 16:03 static/image/common/back.gif
楼主是美女啊
抠脚老汉 发一个改进的
MARK 楼主的帖子我收下了····很宝贵的经验,等我下学期做的时候我参照你的来做了········ 看来现在自平衡小车很火,有制作的冲动 牛人…… 做平衡车的人还是蛮多的{:lol:} 标记下. 新手路过支持 楼主厉害,,,,,留着以后参考 LZ应该将 重心压低,这样才能使得平衡的效果更好。 经验之谈
LZ牛人
mark 车子蛮漂亮的 感谢楼主!!!!! 请问lz你的激光切割是找谁做的? xtian 发表于 2012-7-4 19:32 static/image/common/back.gif
请问lz你的激光切割是找谁做的?
淘宝搜 亚克力加工 有很多 kent.c 发表于 2012-7-5 08:34 static/image/common/back.gif
淘宝搜 亚克力加工 有很多
可否推荐一家?我没有发私信的权限,可以的话发信息给我吧,谢谢! 顶楼主!!!马上要动手做了,谢宝贵的经验 我现在做一个载人的自平衡电动车,正在写程序,原理跟楼主的一样,以后多跟楼主交流。 咋都是你自己一个人在那顶啊。。。。哈哈哈 我这个是控制板
下面这个是6轴陀螺仪
现在这些控制都有了 就是连接电脑没反应哦 自己画的板子还是买的? 不错,学习了 mark。。。 mark.......................... 谢谢楼主分享! kent.c 发表于 2012-5-8 13:17 static/image/common/back.gif
基本不会倒了,晚点再调试参数,改善一下稳定性
调试过程中,多少个日日夜夜碰到棘手的问题,几 ...
我也在弄车,目前在开始在调PID,我用的是互补滤波,感觉出来的波形还不错,我感觉我的电机线性度非常差,而且扭矩不大,所以轮子用的直径4.5cm的(电机的轴和其他大轮子不好配套),感觉轮子有点小,占空比30%是电机几乎还是不转的,而且两个电机的阻力差别还是很明显的,把Kp值调高,角度偏一点PWM就饱和了,电机几乎控制不了,加了微分还是不行,我不知道什么原因,我的驱动没有光耦,车也太重,电池也在上面,我现在只让它可以站起来,请问我是不是忽略了什么东西,这是互补处理的波形。。。。 你电机速度是多少的?轮径4.5CM的话,最好120转以上电机比较好,而且根据经验,控制最好要加编码器,可以更加稳定。最后,建议还是耐心调整PID,可以加两个电位器来调节,慢慢耐心调 kent.c 发表于 2012-11-5 10:59
你电机速度是多少的?轮径4.5CM的话,最好120转以上电机比较好,而且根据经验,控制最好要加编码器,可以更 ...
电机的转速我也没有具体测过,编码器这个电机是肯定装不上了,暂时还不想买电机,先弄着,我用的c8051f310单片机,内部自带10位AD,我也用的电位器调的,但是感觉也不是太好调,现在车子会在中点震荡,只能稳定几秒,然后倒下。如果用手扶着它向一边歪的话,它会向这边加速,但是还是不能调整过来,会倒下 嗯,先调积分环节,调整到在前后振荡就差不多了,然后调微分环节,直到振荡减小,这是差不多就可以稳定了。耐心调整,如果还是不稳,考虑换两颗速度稍快的电机吧,可能是电机修正速度跟不上 很好的经验,收藏 怎么添加速度环 dmjkun 发表于 2012-11-9 02:01 static/image/common/back.gif
怎么添加速度环
有编码器用编码器,没编码器用输出pwm近似 学习楼主。 菜鸟stm32 发表于 2012-5-12 11:48 static/image/common/back.gif
坚决顶一下,楼主,我是学机电的,最近学了stm32,也想做点东西,你能否给点建议,我以前也没有做过什么东 ...
还是买块开发板,做几个东西,找找感觉和经验。没实际用过,就不叫有基础。 kent.c 发表于 2012-5-11 07:12 static/image/common/back.gif
10ms产生一次中断,进行AD读取,卡尔曼滤波和PID计算 论坛下不了附件,代码详见http://bbs.roboticfan.co ...
lz,你的代码不能下啊~~~ 收藏一下,谢谢! kent.c 发表于 2012-11-10 12:46 static/image/common/back.gif
有编码器用编码器,没编码器用输出pwm近似
你的车轮、电机在哪里买的?求链接?谢谢。 redworlf 发表于 2013-2-28 19:35 static/image/common/back.gif
你的车轮、电机在哪里买的?求链接?谢谢。
轮子两年前淘宝的,现在找不到了。电机很多,namiki 淘宝搜一下 能再发下代码不,24楼那个看不了,我也在搞这个,楼主还有整参时的波形图不?发来参考参考 重新传了代码 楼主请教下你那卡尔曼的参数是怎么调的 kent.c 发表于 2013-3-1 10:22 static/image/common/back.gif
轮子两年前淘宝的,现在找不到了。电机很多,namiki 淘宝搜一下
好的,谢谢哦。 kent.c 发表于 2012-5-6 10:13 static/image/common/back.gif
没人顶?还请大侠们帮分析一下站不住的原因。参数调整了两天,K值高了又会发抖,低了站不住。现在 ...
我的k值不管是高或者低 就是站不稳
页:
[1]
2