分享

基于Arduino+MPU6050+Tp

 quasiceo 2015-08-10
    基于工坊目前还没有一个帖子能很完整的介绍平衡小车的制作思路以及制作方案,借此机会我将制作成功后的经验分享给大家,由于该课题涉及到我们项目的部分,请允许我现在不能公开,但思路和方案我是可以告诉大家的。我希望能给一群爱学的同学们,钟爱电子制作的朋友们提供一点帮助,也算是我一年来在该论坛学到很多知识的回报吧。
    希望各位懂行的高手不要嘲笑我的无知,更希望你们看了以后,能够多给我提供一些建议和更好的思路,总之,但愿我们能共同进步,或是说能有机会合作,那是理想的状态了。其他的话我就不多说了,我先给大家上图片和视频。

最新版的平衡车
    马上熄灯了,持续更新中。。。。

    2014-3-21 星期五
    今天继续。。。
    应大家要求先介绍元件清单:
    【元件清单】
  •     1.串口MPU6050模块。(特别注意,是串口MPU6050模块,不是普通的6050,串口6050只是不需要你自己滤波了,如果你想尝试一下,也未必不可,但我不推荐新手尝试Kalman)
  •     2.Tp-link-wr703n(官方标配,刷进去Openwrt系统,同时可以无线更新程序,挂载摄像头等等)
  •     3.Arduino MEGA 2560 r3 (这个单片机做平衡车足矣,当时怀疑他不能胜任)
  •     4.L298n(最好是用带光耦的驱动,不带光耦也行,我的就没带光耦,害怕信号干扰就带上光耦)
  •     5.电机是直流减速电机带码盘(扭矩最好是能大一点,我推荐德国空心杯电机,当然我用的不是空心杯,下一版一定会用)
  •     6.OLED12864 LED屏幕(我就不多说了,等到车很平稳了,你爱怎么扩展都行)
  •     7.小车轮子(最好是大一点,轮子要用硬橡胶的,我现在这个轮胎是软的,摩擦力太大,下版本就换掉)
  •     8.电池3节18650,带上电池盒OK
  •     9.稳压模块(我个人认为不能把所有的需要5v供电的传感器都从单片机供电,单片机提供电流是有限的,可能会造成单片机死机的情况,因此我就外接一个稳压模块给这一群传感器供电,一定要注意稳压模块的输出的负极要和单片机共地。
  •     10.遥控器就是安卓手机了(这个就不多说了,有兴趣的我会发关于Openwrt的相关教程,这里说就有点跑题了)
    注释:元件就这么多了,其实也没有什么,重要的是控制思路,和控制算法。如果大家对硬件还有疑问就提出来,今天就讲到这里,学校的事情太多了,又要开会,各位不好意思。。。补充几句,一定要好好看我括号里面补充的内容,很重要,有可能就是由于这些问题导致你很久都不能把小车调起来的,再上一张图片。。。
没加路由器的图片,正在运动中画面不清晰,

    继续更新。。。
    【控制算法】
    1.PID(如此经典的算法,你能不用吗,尤其是学习自控原理的同学)
       Pwm_out = Kap*Angle[0] + Kad*w[0] + Ksp*speeds_filter + Ksi*positions ;  //PID控制器
  
注释:

  • Angle[0]表示x轴的角度量,单位是(角度);
  • w[0]表示x轴的角速度,单位是(角度/秒);
  • speeds_filter表示车轮速度,程序中以单位时间码盘的格数代替;
  • positions表示位置,是速度对时间的积分。
     角度用PD,位置用PI非常简单,双闭环控制,我的控制器就这么简单一句话,别以为算法是多么高深的东西,我给你说一下原理,看图:
QQ截图20140321100304.png
【平衡车模型】
    QQ截图20140322130627.png QQ截图20140322130640.png QQ截图20140322130858.png

    现在必然有人问我难道我们要建模吗?我强烈推荐学过自控原理和现代控制理论的同学建模,但可喜的是不建模也可以做平衡车,只是理解的不深刻罢了。现在上一段pid控制代码:
ARDUINO 代码复制打印下载
  1. //=========================================================   
  2. //===                  PID_CONTROLLER                   ===
  3. //=========================================================
  4. //串级PID: 主调:角度
  5. //         副调:速度
  6. //先控制角度,后控制速度
  7. //=========================================================
  8. int Pwm_out = 0;
  9. int Turn_Need = 0;
  10. int Speed_Need = 0;
  11. int speed_output_R , speed_output_L;
  12. float speeds , speeds_filter, positions;
  13. float diff_speeds,diff_speeds_all;
  14. //========================
  15. float Kap = 24.5;       //
  16. float Kad = 10;         //
  17. float Ksp = 2.8;        //
  18. float Ksi = 0.11;       //
  19. //========================
  20. void PID_PWM()
  21. {
  22.   speeds=(count_left + count_right)*0.5;

  23.   diff_speeds = count_left - count_right;
  24.   diff_speeds_all += diff_speeds;

  25.   speeds_filter *=0.85;  //一阶互补滤波
  26.   speeds_filter +=speeds*0.15;

  27.   positions += speeds_filter;
  28.   positions += Speed_Need;
  29.   positions = constrain(positions, -2300, 2300);//抗积分饱和

  30.   Pwm_out = Kap*Angle[0] + Kad*w[0] + Ksp*speeds_filter + Ksi*positions ;  //PID控制器
  31.   if(Turn_Need == 0)
  32.   {
  33.     speed_output_R = int(Pwm_out - diff_speeds_all);
  34.     speed_output_L = int(Pwm_out + diff_speeds_all);
  35.   }
  36.   speed_output_R = int(Pwm_out + Turn_Need);
  37.   speed_output_L = int(Pwm_out - Turn_Need);
  38.   Motor(speed_output_L , speed_output_R);
  39.   count_left = 0;
  40.   count_right = 0;

  41. //  Serial.print(Angle[0]);      //主调被调量
  42. //  Serial.print(',');
  43. //  Serial.print(speeds_filter);//副调被调量
  44. //  Serial.print(',');
  45. //  Serial.println(Pwm_out);  //输出量
  46. }


    今天就写到这里,等待你们的回复和提问,然后我在之后的更新中着重以答疑主,同时也能给我编辑帖子确定一个方向。依然在更新中。。。


   应有人要求,我先上个视频。。。
   【平衡车视频】
   


    更新中。。。

   【关于MPU6050】
    
关于MPU6050有目前就应用方法有两种:
  • 直接采数据,然后Kalman滤波;卡尔曼滤波实现现在有两种方法,一种是用自己单片机处理,一种是硬件滤波串口方式输出(这个就是所谓的串口MPU6050,就是有商家自己已经给你做好卡尔曼滤波,你只需要接受他的数据)
  • 用MPU6050中的DMP,它也可以直接输出角度等值,但是由于它受温度,电压的干扰较大,一般不建议用。
    QQ截图20140322124136.png QQ截图20140322124203.png
    今天就说到这里。。。
    现在,我仍然再调试,发现滤波参数,也是非常重要的。直接影响小车是否抖动。
    希望大家看后,积极回复,把帖子顶起来。。。。
    等我这几天忙完了,给大家上传一些传感器模块的程序,方便大家调试。。。
    今天给大家上传了两个测试代码,喜欢的同学自己下载。。。
    看到大家如此有热情,我再发几张图片,等之后有时间我再把帖子详细说明一下。

    手机的上位机——Wi-Fi通信(由于版权问题,我不能公开传播,大家可以自己去下载)
    图片1.png 图片2.png


    电脑上位机——蓝牙通信(我花了一个晚上搞得,做的不好,刚刚学LabView)

    QQ截图20140427194029.png
前几天有点事儿没时间给大家回帖,在此深表歉意,现在大家有问题尽管提出来,我会倾囊相助。。。

时间过的真快,已经过了大约一年的时间,看到大家很多都在做相关的项目我感到非常的高兴,应很多人的要求,我会在等些时日把所有的代码整理后全部发上来。同时在给大家分享一些我调试PID的上位机程序(我自己写的),方便大家更好的将平衡车完善。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多