做了一个小小的自平衡小车(更新完整版,附视频)

暑假有时间打算做个自平衡的小车,经过三个礼拜的研究查阅各种帖子和设计制作。。。这部迷你蛋黄号终于诞生了!!




1.jpg

2013-8-15 17:42 上传
(141.13 KB)






3.jpg

2013-8-15 17:42 上传
(146.2 KB)





刚做出来硬件的时候运行的并不顺利。。。初期碰到很多问题还烧坏了几块板子。。调参数花了两天时间,有的参数直到后来才想到要加上去的。。。

采用6050的dmp采集角度信息,pid角度闭环控制,遥控以及无线调试是用PS2的无线手柄(也就是小车的大头)

完整版视频,用AE和Vegas折腾了两天做的视频~~~~





后续:这是加上了摄像头的平衡车,带巡线功能





本人也是第一次制作小车,最开始的初衷是在淘宝上淘到一款很小的减速电机,减速比比较合适很适合做小车,更难能可贵的是它还带有跟电机转轴直连的码盘,配上光电对射管之后每秒能输出300左右的脉冲,于是决心想做一个小小的玩具,蛋黄的制作参考了WALL-E的很多元素。。。

说一下用到的元件清单:

1.减速电机两个,这个要求不高,减速比适合就行,太慢的来不及矫正角度,太快扭矩不够



2.MPU6050 三轴加速度 陀螺仪模块 ,用作角度采样的传感器,论坛里应该大部分人都是用这一款了,我没有采用融合加速度和陀螺仪的卡尔曼滤波,而是采用芯片的DMP功能,这个之后介绍



3.Arduino pro mini 的avr mega328p做主控,体积小巧io齐全,你值得拥有



4.msp430 g2231单片机,由于6050的dmp模式要占用一个中断口而328p一共只有两个外部中断,所以两个轮子的码盘中断不好分配,这里采用430采集码盘信息然后通过串口与arduino通信,如果是用卡尔曼滤波的话这个可以省略



5.3.7v锂电池,用作电源,各种废旧手机电池都能派上用场



5.ps2无线手柄,使用arduino的psx库可以方便得用ps手柄调试和操纵,手柄淘宝上大把,30块左右一个



6.L298n模块,电机驱动模块,省得自己焊板子了,买现成的也不贵,两路输出做小车必备



7.4.2v锂电池充电模块,这个是考虑到车做的比较小电池不好拆卸,要充电的话就麻烦了,所以直接把充电模块固定上去,很好用的模块还带满电指示灯,淘宝3元一个



8.蓝牙模块,用于跟安卓手机通讯,可以忽略



讲一下原理,这个很简单,论坛里很多大神都分析过,就是负反馈控制,由测量到的角度和自身平衡时的自然角度的差作为误差,控制pwm占空比输出,进而调节电机转速,往前倒就向前跑一点,反之亦然。PID算法是关键,参数的调节也是摸索了挺久才找到规律的,值得一提的是,我查阅到的大多数资料都是使用PD算法控制,也就是不加积分项I,我一开始也是按这个思路来调节,但是站立的效果很不好,一碰就倒。尝试过各种PD参数组合均没有明显改善的时候,我试着加入了I项参数,喜出望外效果相当拔群。。。后来自己分析过,由于只求站稳的时候是属于静态控制,因而积分项的引入能消除零差,效果就是,即使你把车往前推一下,它自己也会慢慢走回去保证误差近似为0。然而在动态控制中,积分项太大会引起严重的相位滞后,也就是对角度变化的不敏感,所以我们会看到在很多项目中包括飞思卡尔的自平衡小车都是采用PD控制角度,而在动态控制里面PD的效果也确实很好。所以综合考虑之后,在我这次的方案中,我选择采用两套PID参数来控制小车站立和运行。

关于PID更详细的讲解可以参考这个帖子http://www.geek-workshop.com/for ... thread&tid=1414



各模块的连接:



插arduino主板的小板子,用质量差点的洞洞板一剪成型,主要是方便拆下来用作其他用途下面那层固定的事6050的芯片

QQ截图20130825005051.png

2013-8-25 00:53 上传
(268.96 KB)





背面的样子

QQ截图20130825005100.png

2013-8-25 00:53 上传
(268.7 KB)





L298n模块,装好重心大概就在轮轴上,小东西发热不大其实散热片可以拆掉的。下面固定用的是一张塑料卡,加502

QQ截图20130825005107.png

2013-8-25 00:53 上传
(469.4 KB)





固定好之后的样子

QQ截图20130825005115.png

2013-8-25 00:53 上传
(248.54 KB)





这个点机其实是带码盘的

QQ截图20130825005136.png

2013-8-25 00:53 上传
(418.52 KB)





主控板加上去之后

QQ截图20130825005144.png

2013-8-25 00:53 上传
(289.7 KB)





那块薄薄的是锂电池,ps3手柄用的

QQ截图20130825005156.png

2013-8-25 00:53 上传
(295.02 KB)





装饰一下,用乐高积木做了铠甲

QQ截图20130825005208.png

2013-8-25 00:53 上传
(450.69 KB)




QQ截图20130825005217.png

2013-8-25 00:53 上传
(487.3 KB)




QQ截图20130825005224.png

2013-8-25 00:53 上传
(419.68 KB)





基本成型了,中间那个窗口塞了颗明亮的led进去,有呼吸灯效果哦

QQ截图20130825005242.png

2013-8-25 00:53 上传
(225.68 KB)





然后就是安装ps2手柄的接收器,在视频里有演示。说一下这个psx库的使用方法

接收器的引脚排列如图:

500_400-1336202435_9f75c2c2.jpg

2013-8-25 01:02 上传
(28.25 KB)





PS2X_lib库文件的zip文件在附件,打开实例,把引脚定义改成你自己的,就是data,command那几个,然后连好接收器,如果是3.3v可以直接连,5v的arduino最好加个ldo降压模块再连,不过我自己试过直接连上去也能用。按示例初始化之后,每次运行Psx.poll();函数会读取一次按键状态,也就是说如果你这时候是按下某个键,那么在下次刷新之前对应变量的那一位都是1,反之则为0,读取键值就是类似这样的 if (Psx.digital_buttons & psxR2) {你的代码},组合键的使用也很简单 if ((Psx.digital_buttons & psxR2)&&(Psx.digital_buttons & psxL2)) {你的代码}。



最后说一下6050dmp的使用方法,DMP即Digital Motion Processor,MPU6050里面的一个模块,可以对原始的加速度计和陀螺仪的数据进行融合之后输出。就不需要用户进行融合了,可以减轻主控芯片的负担。



库的下载及使用方法可以参考这个帖子http://www.geek-workshop.com/for ... thread&tid=2471



最后给出我的代码。。。由于大家可能用不上430单片机以及蓝牙,所以把那部分的代码去掉了,写的有点乱仅供参考。。。





直接运行代码就行,注意dmp中断模式下6050的中断脚要接arduino的数字2脚,在获取完ypr数组之后,直接调用这几个变量就行了,关于ypr的定义给张图:

via - 极客工坊

标签: Arduino教程