MPU6050 DMP 树莓派驱动
本帖最后由 jytong 于 2014-1-13 20:09 编辑经朋友介绍发现了树莓派,觉得挺好玩,想用它做个自平衡小车玩,可又什么都不懂,
只能慢慢学习,比较了一气看大家都介绍 MPU6050 不错,各种搜索发现没有树莓派上的
驱动库,好在自己稍微懂一点编程,就动手从 Embedded MotionDriver 5.1 移植
了一份过来,加了个 C++ 的简单接口,感觉用起来挺方便,原有的 C 接口也保留了。
由于是门外汉,基本概念都是刚学习的还模糊不清,还请各位朋友多多指正。
下一步开始调怎么能平衡,好多都不懂,随时来请教。
这个库我也很会继续维护尽点微薄之力,链接:https://github.com/jytong/mpu6050Pi
随时更新,需要的请去 githu 下载吧,上面的地址。 这个要顶下,不知道LZ是否在RPI上实际测试过呢? 呵呵,试了一下。包里面example目录下是个测试,可以直接编译了跑。
cd example
./configure
make
sudo ./dmptest
楼主好厉害,不知道楼主哪里参考的手册用c++写的驱动库和接口,求指教...... 本帖最后由 jytong 于 2014-1-12 17:58 编辑
我主要是看的这几个:
http://www.invensense.com/developers/index.php?_r=downloads&ajax=dlfile&file=Embedded_MotionDriver_v5.1.zip
http://invensense.com/mems/gyro/documents/RM-MPU-6000A.pdf
http://www.invensense.com/mems/gyro/documents/PS-MPU-6000A-00v3.4.pdf
我这里面主要包括两部分,
1.把 Embedded_MotionDriver_v5.1 移植到树莓派上。
这是它目前的最新版本了,本来以为能直接用,下载下来一看是用在 msp430 上的,我也不知道是个什么玩意,
树莓派上I2C接口是i2c-dev库,所以只能移植了,用 __MOTION_DRIVER_TARGET_RASPBERRY_PI 宏括住的都是
移植的代码,挺繁琐。还有一点点自己测试需要用到的小扩展。
2.增加C++接口。
这部分是完全自己做的。原驱动是用C语言开发的,C语言面向过程,写起复杂的逻辑太累了,而且要使用者实时
处理。而我想搞的系统还要做许多其他的事情,比如测距、语音识别、图像识别、网络交互、控制其他的东西等,
而且还可能有耦合,所以要各个模块都要有足够的自决能力,超出一定的阀值、或者突发事件、或者需要交互,才
要控制模块调度处理。原驱动接口不适用,需要更高级的接口,所以只能自己搞一个,由于目前需求不明确(还都
是瞎想),需要定义尽量宽泛,适用各种需求,所以这个接口做了三个模式:
Push、Pull、Realtime:
Push是驱动模块向注册的回调函数实时推送采集的数据,通过对回调函数的扩展,可以进行一定的统计、自决和
事件定义、上报。
Pull 是拉模式,主程序根据需要随机时从驱动拉当前数据,得到的一定是当前最新数据。
Realtime 是直接从设备拉数据了,不过必须实时的拉数据,慢了得到的数据可能就不是最新的了,而且太慢了还会
使设备FIFO溢出,目前还只有测试使用这个模式。
前两种模式都需要驱动有自己的线程,但是数据交换需要互斥锁,高频率的系统锁在树莓派这种小玩意上代价太大
了,何况 MPU6050 只是系统中的一个小模块,所以想到用三个数据槽,既可以避免互斥锁的使用还可以保证数据
的实时性。就是代码中的 class __DataSwap 这个玩意,代码里画了个简单的图说明数据流转流程。
3.里面有个测试,在 example 目录下,是我测试用的,也扔在里面了。
大概测了一下,100Hz采样率接口的消耗大概是 2% CPU,感觉可以接受,目前暂时这样,开始考虑玩其他的东西
了,比如调速什么的,随着需求的增加和发现问题,再不断的维护这个接口。
这个非常有参考价值,
忙过这段,趁春节放假要好好研究下 楼主好人,这个帮我大忙了。发现在我的树莓上面跑不起来,mpu_set_lpf failed 设置低通滤失败,楼主帮忙查下什么原因,十分感谢。 好,多谢分享啦
页:
[1]