It's_me 发表于 2014-3-20 23:00:46

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

本帖最后由 It's_me 于 2020-6-17 17:20 编辑

基于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 + 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通信(由于版权问题,我不能公开传播,大家可以自己去下载)



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


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

在帖子上写文章限制太多,我近期将项目更详细的内容移植到我的博客上,欢迎大家前来光顾。
https://zenghongqing.top/archives/page/2/

It's_me 发表于 2020-6-17 17:16:53

贾夫洋 发表于 2020-2-15 16:48
减速电机必须要带码盘的吗

带码盘可以用来测速度

pockbo 发表于 2016-10-15 10:07:43

谢谢楼主分享

美男G 发表于 2014-3-20 23:09:51

用WIFI控制小车运动吗?

firewise 发表于 2014-3-21 01:05:34

期待分享。。。。。。

Cupid 发表于 2014-3-21 07:26:33

哇,占楼等更新,哈哈哈。

邵林寺 发表于 2014-3-21 08:24:18

你只要把元件清单和控制方法讲出来就行,哈哈,其他的自会有人搞定

4463424 发表于 2014-3-21 09:20:49

快快更新吧,楼主辛苦了,但愿陀螺仪是MPU6050.

It's_me 发表于 2014-3-21 10:27:19

美男G 发表于 2014-3-20 23:09 static/image/common/back.gif
用WIFI控制小车运动吗?

是的,用安卓手机控制小车

It's_me 发表于 2014-3-21 10:27:48

4463424 发表于 2014-3-21 09:20 static/image/common/back.gif
快快更新吧,楼主辛苦了,但愿陀螺仪是MPU6050.

角度传感器就是MPU6050啊,你在担心什么

swfzz 发表于 2014-3-21 10:38:05

正在准备小车制作之中,用的pro mini,然后GY-86,电机网上买的那种什么德国的减速电机,现在正在做电机座,底板,这不没有什么文化,真是不懂这个PID控制!

It's_me 发表于 2014-3-21 10:44:09

swfzz 发表于 2014-3-21 10:38 static/image/common/back.gif
正在准备小车制作之中,用的pro mini,然后GY-86,电机网上买的那种什么德国的减速电机,现在正在做电机座, ...

慢慢来,pid没什么难的,关于单片机的问题我之后详细说一下,mini 的中断好像不够。电机还是买好的吧。

swfzz 发表于 2014-3-21 13:54:22

本帖最后由 swfzz 于 2014-3-21 15:52 编辑

呵呵,现在说后悔的也没有用了,谁让当初不好好学习呢,单片机2560也有一块,不过正在用来做避障车加机械手了,然后看到有人用MINI做的平衡车,所以就买了块MINI(便宜啊) ,我觉得吧,还是实践才能学到东西,关于PID嘛,或许就是懂的人秒懂,不懂的看了就是符号罢!

你这个一共有用了几个中断啊?

Cupid 发表于 2014-3-21 17:36:17

楼主不上传点视频什么的?

Super169 发表于 2014-3-22 00:22:32

感謝分享, 我也想學做, 暫時還未看得懂當中的原理, 希望不久的將來我也可以做出一部 (可能只係仿製出來).

wisology 发表于 2014-3-22 11:09:42

PID同时实现了角度和速度的控制,这个挺有意思的,期待楼主详解,代码注释再清晰些,尤其是表示的是什么量,单位是什么,非常感谢:loveliness:

It's_me 发表于 2014-3-22 12:15:23

wisology 发表于 2014-3-22 11:09 static/image/common/back.gif
PID同时实现了角度和速度的控制,这个挺有意思的,期待楼主详解,代码注释再清晰些,尤其是表示的是什么量, ...

问题很好,是我的疏忽,我会再详细一点的。。。
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 基于Arduino+MPU6050+Tp-link 703n平衡车完美站立(部分代码上传)