大连林海 发表于 2015-9-20 09:58:00

基于Arduino+MPU6050+Tp-link 703n平衡小车

基于Arduino+MPU6050+Tp-link 703n平衡小车

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

   
    【元件清单】

[*]    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 + Kad*w + Ksp*speeds_filter + Ksi*positions ;//PID控制器

注释:

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

【平衡车模型】
   
    现在必然有人问我难道我们要建模吗?我强烈推荐学过自控原理和现代控制理论的同学建模,但可喜的是不建模也可以做平衡车,只是理解的不深刻罢了。现在上一段pid控制代码://=========================================================   
//===                  PID_CONTROLLER                   ===
//=========================================================
//串级PID: 主调:角度
//         副调:速度
//先控制角度,后控制速度
//=========================================================
int Pwm_out = 0;
int Turn_Need = 0;
int Speed_Need = 0;
int speed_output_R , speed_output_L;
float speeds , speeds_filter, positions;
float diff_speeds,diff_speeds_all;
//========================
float Kap = 24.5;       //
float Kad = 10;         //
float Ksp = 2.8;      //
float Ksi = 0.11;       //
//========================
void PID_PWM()
{
speeds=(count_left + count_right)*0.5;

diff_speeds = count_left - count_right;
diff_speeds_all += diff_speeds;

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

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

Pwm_out = Kap*Angle + Kad*w + Ksp*speeds_filter + Ksi*positions ;//PID控制器
if(Turn_Need == 0)
{
    speed_output_R = int(Pwm_out - diff_speeds_all);
    speed_output_L = int(Pwm_out + diff_speeds_all);
}
speed_output_R = int(Pwm_out + Turn_Need);
speed_output_L = int(Pwm_out - Turn_Need);
Motor(speed_output_L , speed_output_R);
count_left = 0;
count_right = 0;

//Serial.print(Angle);      //主调被调量
//Serial.print(',');
//Serial.print(speeds_filter);//副调被调量
//Serial.print(',');
//Serial.println(Pwm_out);//输出量
}

http://v.youku.com/v_show/id_XNjg4Mzc4MDQ0.html

【关于MPU6050】
关于MPU6050有目前就应用方法有两种:


[*]直接采数据,然后Kalman滤波;卡尔曼滤波实现现在有两种方法,一种是用自己单片机处理,一种是硬件滤波串口方式输出(这个就是所谓的串口MPU6050,就是有商家自己已经给你做好卡尔曼滤波,你只需要接受他的数据)

[*]用MPU6050中的DMP,它也可以直接输出角度等值,但是由于它受温度,电压的干扰较大,一般不建议用。




手机的上位机——Wi-Fi通信(



电脑上位机



丄帝De咗臂 发表于 2015-9-20 13:36:12

平衡车,风火轮

发表于 2022-4-25 08:47:55

功能实现的(简直)完美,里头排线乱了。

驴友花雕 发表于 2024-7-2 10:57:51

学习了,争取有机会试试看......
页: [1]
查看完整版本: 基于Arduino+MPU6050+Tp-link 703n平衡小车