老魏 发表于 2015-6-8 10:14:49

STC12做的平衡车,使用mpu6050DMP,开源。

本帖最后由 老魏 于 2015-6-8 10:20 编辑

    13年就想做平衡车,拖延症的毛病,让我拖到了今天。这个周末调整的总算是能前行,后退,转弯了。行进中依然有不稳的情况,先共享出来吧!大家指导一下。本人是业余爱好,PID这块始终是没搞太懂,感觉很多时候都是无从下手。说一下小车的配置。电机使用的是Namiki直流减速电机,12v 80:1减速 输出120转。电机自带带码盘,一个码盘两个光电管,每转2个脉冲,用码盘就能判断电机转动的方向。
    单片机用stc12c5608,传感器用MPU6050,分别尝试了两种方法,1:读取一个轴的角速度,和一个轴的加速度,依赖重力计算与水平面的夹角,使用互补滤波方法滤波。2:直接使用DMP方式读取,采用pitch角,然后再读取角速度,不用滤波。两个的效果相差不大。
       
        电路图。

    在网上找到的DMP的例子多数是STM32的,51的很少,能用的就更少了,这里代码开源,希望更多人使用,也能帮忙指出程序中的问题。程序自认为写的算工整的。各个模块也做了分离。有很好的移植性。

    通讯使用24L01,使用2节18650电池,用3r33升压到12v。自己在嘉立创打的板,板上有MPU6050的焊盘,但是在测试过程中烧掉了,焊接技术不好,再焊上去的总是不能正常读写。所以使用了外接的模块。

    电机驱动用L298N。
   
   电机,联轴器,轮子。这个电机的轴太长,联轴器的螺丝没法落在轴的缺口上,所以自己在螺丝位置磨了个缺口。

码盘用LM339获得标准的0、1送给单片机。


不用速度环能够很稳定的站立。
http://www.tudou.com/programs/view/zJsoOGWNUw8/

用了速度环,控制前进后退,就不是太稳定。很羡慕那些能满世界飞跑的平衡车。
http://www.tudou.com/programs/view/ZQeRhoAt0BI/


附上程序。


怎么贴视频啊?为什么我的都是链接呢?

suebillt 发表于 2015-6-8 10:50:17

{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}

liang_work 发表于 2015-6-8 11:35:56

顶,支持一下。

STCunio 发表于 2015-6-8 12:10:42

不错不错,赞一个

qrytian 发表于 2015-6-13 09:36:34

之前也做过平衡车,尝试移植dmp库到51失败,用的滤波,看你这个效果不错,赞一个,

wkman 发表于 2015-6-13 09:57:50

{:victory:}{:lol:}{:z支持!y:}

xurenhui 发表于 2015-6-13 10:07:54

谢谢分享

ZJetWay 发表于 2015-7-27 21:54:58

已经很不错了.顶一个.

lyg407 发表于 2015-7-27 22:08:37

支持楼主。

阿伟 发表于 2015-7-27 22:19:36

应该让楼主女儿也上个镜。

xiaoseaip 发表于 2015-7-28 15:51:11

mpu6050要用到PID算法吗

爱新觉罗_极刚霸 发表于 2015-7-30 11:29:02

//转换成四元数
    quartf = (float)(((long)dmpdatas << 24) | ((long)dmpdatas << 16) | ((long)dmpdatas << 8) | dmpdatas)/1073741824.0f;
    quartf = (float)(((long)dmpdatas << 24) | ((long)dmpdatas << 16) | ((long)dmpdatas << 8) | dmpdatas)/1073741824.0f;
    quartf = (float)(((long)dmpdatas << 24) | ((long)dmpdatas << 16) | ((long)dmpdatas << 8) | dmpdatas)/1073741824.0f;
    quartf = (float)(((long)dmpdatas << 24) | ((long)dmpdatas << 16) | ((long)dmpdatas << 8) | dmpdatas)/1073741824.0f;
    quar_add=quartf*quartf+quartf*quartf+quartf*quartf+quartf*quartf;
    if(quar_add<0.99 || quar_add>1.01 ) return;
    *pangel=asin(-2 * quartf * quartf + 2 * quartf* quartf)* 57.3/2.4;
    I2C_reads(GYRO_YOUT_H        ,7,&gyroxh);
    I2C_reads(GYRO_YOUT_H        ,7,&gyroxl);
    gyrox=((int)gyroxh<<8|gyroxl);
    *pgyrox=(float)(gyrox/16.384);

楼主你好,首先多谢你的DMP移植程序!但我有一点不明白 *pangel=asin(-2 * quartf * quartf + 2 * quartf* quartf)* 57.3/2.4;为什么要再除2.4,2.4是什么含义???

老魏 发表于 2015-7-30 11:52:37

爱新觉罗_极刚霸 发表于 2015-7-30 11:29
//转换成四元数
    quartf = (float)(((long)dmpdatas

看了一遍,真没留意到这里为什么多了个/2.4,看了一下自己的程序,不知什么时间多的这个部分,可以确认是错误的。应该删去。

boss2013 发表于 2015-7-30 17:55:59

赞楼主专研并分享的精神!

爱新觉罗_极刚霸 发表于 2015-7-30 19:54:49

老魏 发表于 2015-7-30 11:52
看了一遍,真没留意到这里为什么多了个/2.4,看了一下自己的程序,不知什么时间多的这个部分,可以确认是 ...

多谢啦~楼主很厉害!51的DMP移植找了好久!!

bmelz 发表于 2015-7-31 08:36:53

LZ你好~我上次看到网上STC12c5a60s2的DMP移植,现在看到你的,发现不错,程序相差不大==可为什么 用到我的stc12c5a60S2 单片 就不行了~加载到运动裤配置出不来,而且6050的灯也灭了!!可能是什么原因~

老魏 发表于 2015-7-31 09:18:51

"6050的灯也灭了"?? 6050的灯是怎么回事?如果是6050的模块,那个灯应该是电源指示灯啊!如果灯灭了那就意味着断电了!感觉你应该是接错线了。反正4条线,两条电源 + -,两条IIC信号线。6050似乎没想出那个地方合适控制LED的。所以还是检查一下接线吧!

bmelz 发表于 2015-7-31 20:59:26

老魏 发表于 2015-7-31 09:18
"6050的灯也灭了"?? 6050的灯是怎么回事?如果是6050的模块,那个灯应该是电源指示灯啊!如果灯灭了那就意 ...

实在感谢 楼主,问题老师帮我已经解决了~~~我把2.4 去掉 不过 也只能读到 80度 。往后面好像就不行了~~~不知道 能不能改进~~万分 感谢楼主的分享~~~~

justdomyself 发表于 2015-8-2 03:02:59

参数整定有什么技巧么??

jorry 发表于 2015-8-2 06:54:01

顶,赞赞赞!

涵潇舒雅 发表于 2015-8-13 08:26:27

楼主,我想请教一个问题,我移植DMP读取数据是没问题的,但是每次重启之后,不管怎么放置都默认是水平的,是不是我哪里配置的问题!!!!!

老魏 发表于 2015-8-13 14:28:19

涵潇舒雅 发表于 2015-8-13 08:26
楼主,我想请教一个问题,我移植DMP读取数据是没问题的,但是每次重启之后,不管怎么放置都默认是水平的, ...

嗯,我回去再试着读一下数据。我的系统没有做复位的功能,所以每次都是重上电,感觉无论开始是什么角度,都能正确识别出水平面,但是在上电开始的几十秒内,读数会偏大一些。

涵潇舒雅 发表于 2015-8-13 15:42:03

老魏 发表于 2015-8-13 14:28
嗯,我回去再试着读一下数据。我的系统没有做复位的功能,所以每次都是重上电,感觉无论开始是什么角度, ...

我上传一下我的工程,

sailing8 发表于 2015-9-11 09:36:24

赞楼主专研并分享的精神!已经很不错了

nydxsydt0 发表于 2015-9-11 15:55:49

不错不错,赞一个

liaihua1997 发表于 2015-9-11 21:58:51

{:smile:},楼主弄稳定了,我做一个小车上班用,

weijie1993 发表于 2015-9-11 22:47:07

不错,不错,改天做个玩玩{:smile:}

hygrwyh 发表于 2015-9-22 21:44:52

楼主 留个方式呗,我也在做程序遇到了点问题

阿伟 发表于 2015-10-13 09:20:36

我是个单片机新手,这两天在论坛上看到好多帖子都提到DMP,我我想知道这是什么东西?是官方库一类的吗?还是开源代码管理软件之类的?

老魏 发表于 2015-10-13 15:17:18

阿伟 发表于 2015-10-13 09:20
我是个单片机新手,这两天在论坛上看到好多帖子都提到DMP,我我想知道这是什么东西?是官方库一类的吗?还 ...

算是个官方库吧,有了dmp,芯片就自带处理功能了。

阿伟 发表于 2015-10-13 15:40:22

老魏 发表于 2015-10-13 15:17
算是个官方库吧,有了dmp,芯片就自带处理功能了。

那请问我在哪里能下再到芯片对应的DMP呢?

老魏 发表于 2015-10-13 15:46:05

似乎是下载不到,官方没有开放使用。现在大家在用的DMP都是别人从成品中读取出来的内容,所以在程序中都是一大堆数字。

zxs0226 发表于 2015-10-29 09:00:24

研究下,我也想做一个

rundream 发表于 2015-10-31 21:05:05

酷,楼主做了很多人想做而做不了的事。

liujunseu 发表于 2015-11-4 23:16:59

学习学习~~~

sml009 发表于 2015-11-12 16:31:00

很好的大盆友的玩具,学习了

qrytian 发表于 2015-11-13 13:23:09

读DMP不是上电的时候确定为0角度嘛,那岂不是要先把车摆在平衡位置再上电?

老魏 发表于 2015-11-13 16:01:53

qrytian 发表于 2015-11-13 13:23
读DMP不是上电的时候确定为0角度嘛,那岂不是要先把车摆在平衡位置再上电? ...

不是,DMP怎么找0的我不是很明白,但是上电后 能自动检测到水平的。至于为啥,我也不懂,猜测是用重力校正的。

知识阅览者 发表于 2015-11-21 12:40:11

顶贴,在下只是调试过姿态传感器,还真没去做过平衡类的实验,试试!!!!
页: [1]
查看完整版本: STC12做的平衡车,使用mpu6050DMP,开源。