找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于Arduino+MPU6050+Tp-link 703n平衡车完美站立(部分代码上传)

  [复制链接]
跳转到指定楼层
楼主
基于Arduino+MPU6050+Tp-link 703n平衡小车现已完美站立,分享一下制作经验和方法


    希望版主申精。。。可以引起大家注意。。。

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

    马上熄灯了,持续更新中。。。。

    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非常简单,双闭环控制,我的控制器就这么简单一句话,别以为算法是多么高深的东西,我给你说一下原理,看图:

【平衡车模型】
   

    现在必然有人问我难道我们要建模吗?我强烈推荐学过自控原理和现代控制理论的同学建模,但可喜的是不建模也可以做平衡车,只是理解的不深刻罢了。现在上一段pid控制代码:
  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.      
  24.       diff_speeds = count_left - count_right;
  25.       diff_speeds_all += diff_speeds;
  26.      
  27.       speeds_filter *=0.85;  //一阶互补滤波
  28.       speeds_filter +=speeds*0.15;
  29.      
  30.       positions += speeds_filter;
  31.       positions += Speed_Need;
  32.       positions = constrain(positions, -2300, 2300);//抗积分饱和
  33.      
  34.       Pwm_out = Kap*Angle[0] + Kad*w[0] + Ksp*speeds_filter + Ksi*positions ;  //PID控制器
  35.       if(Turn_Need == 0)
  36.       {
  37.         speed_output_R = int(Pwm_out - diff_speeds_all);
  38.         speed_output_L = int(Pwm_out + diff_speeds_all);
  39.       }
  40.       speed_output_R = int(Pwm_out + Turn_Need);
  41.       speed_output_L = int(Pwm_out - Turn_Need);
  42.       Motor(speed_output_L , speed_output_R);
  43.       count_left = 0;
  44.       count_right = 0;
  45.      
  46.     //  Serial.print(Angle[0]);      //主调被调量
  47.     //  Serial.print(',');
  48.     //  Serial.print(speeds_filter);//副调被调量
  49.     //  Serial.print(',');
  50.     //  Serial.println(Pwm_out);  //输出量
  51.     }
复制代码

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


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


    更新中。。。

   【关于MPU6050】
    
关于MPU6050有目前就应用方法有两种:
  • 直接采数据,然后Kalman滤波;卡尔曼滤波实现现在有两种方法,一种是用自己单片机处理,一种是硬件滤波串口方式输出(这个就是所谓的串口MPU6050,就是有商家自己已经给你做好卡尔曼滤波,你只需要接受他的数据)
  • 用MPU6050中的DMP,它也可以直接输出角度等值,但是由于它受温度,电压的干扰较大,一般不建议用。

    今天就说到这里。。。
    现在,我仍然再调试,发现滤波参数,也是非常重要的。直接影响小车是否抖动。
    希望大家看后,积极回复,把帖子顶起来。。。。
    等我这几天忙完了,给大家上传一些传感器模块的程序,方便大家调试。。。
    今天给大家上传了两个测试代码,喜欢的同学自己下载。。。
    看到大家如此有热情,我再发几张图片,等之后有时间我再把帖子详细说明一下。

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



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


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

补充楼主展示的仿真建模代码下载地址:http://www.mathworks.com/matlabc ... --controller-design

评分

参与人数 1黑币 +5 收起 理由
赤炎木 + 5 很给力!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏10 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:130679 发表于 2016-7-21 09:11 | 只看该作者
最近在做小车,学习学习
回复

使用道具 举报

板凳
ID:138313 发表于 2016-11-27 00:55 | 只看该作者
折腾平衡车一周了,PID算是有了点觉悟,然而小车一脱离实验桌就站不稳
回复

使用道具 举报

地板
ID:155077 发表于 2016-12-15 20:13 | 只看该作者
新手来学习了,哈哈哈
回复

使用道具 举报

5#
ID:165861 发表于 2017-2-21 23:19 | 只看该作者
久违u 发表于 2016-12-15 20:13
新手来学习了,哈哈哈

没有看到代码呀
回复

使用道具 举报

6#
ID:187533 发表于 2017-4-20 22:27 | 只看该作者
请楼主分享一下电路图吧。
回复

使用道具 举报

7#
ID:183134 发表于 2017-4-20 22:42 | 只看该作者
谢谢分享
回复

使用道具 举报

8#
ID:227864 发表于 2017-10-17 14:58 | 只看该作者
这么高深的东西,顶楼主
回复

使用道具 举报

9#
ID:243555 发表于 2017-10-27 21:56 | 只看该作者
点赞,点赞,谢谢分析
回复

使用道具 举报

10#
ID:667116 发表于 2020-1-3 12:54 | 只看该作者
什么是串口MPU6050
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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