I2C 我首先从I2C开始讲起,其实I2C折腾得还挺快的,因为资料很多,那我就在这里告诉大家怎么去下手就好了。你可以去看一些I2C的书籍,例如野火的书,先学会从EEPROM里面写入和读取数据,因为EEPROM写入和读取数据也是根据I2C协议来的。I2C最好的教程我个人觉得是李想的视频,贴上地址:http://v.ku6.com/show/1ZJL4OnYQVq6XAw_ycXvBQ...html,百度一下,很多的。看完之后你绝对懂很多。 I2C有分软件和硬件,软件就你通过对I2C的时钟线和数据线,可能你不知道时钟线和数据线,那还是先去学I2C的基础教程吧,然后再继续看。 还有一个方式可以用I2C读写数据,就是硬件I2C,硬件I2C就是单片机内部的电路,可以将I2C的时序用硬件电路搞出来,这样子你读写数据就方便很多了。STM32就有硬件I2C,52单片机部分型号应该也有,可以自己去找下,没有试过。STM32硬件I2C可以去看野火的教程。 读取MPU6050原始数据 我学MPU6050的过程受到了论坛上的生来孤独的帮助。他的两篇MPU6050的帖子也很有代表性,静下心来慢慢看吧。其中他的一个很重要的思路就是一步一步,确保每步都对之后就很容易读出正确的数据。 MPU6050读取原始数据: http://www.amobbs.com/forum.php?mod=viewthread&tid=5574011&highlight=%E6%BA%90%E7%A0%81%2BMPU6050 DMP解析原始数据: http://www.amobbs.com/thread-5576939-1-1.html 我们对MPU6050进行读写传感器数据就是对MPU6050的寄存器用I2C进行读写。 我们先来认识下MPU6050的硬件吧。 这是MPU6050模块的图片,注意是模块,中间那个才是MPU6050,只有MPU6050是不够的,还要有一些外围电路才行,这就跟52芯片跟最小系统的区别一样。 具体的电路我没有怎么了解。我只知道AD0决定MPU6050的地址,学过I2C的人都知道I2C通讯中从机是要有地址的,以区别多个从机。当AD0管脚接低电平的时候,从机地址是0x68。这里地址我当初还遇到了一个问题,可以看下我当初发的帖子看你会不会也错在这里:http://www.amobbs.com/thread-5580466-1-1.html 我们还要了解下MPU6050的寄存器,这个过程跟学习52单片机没有什么区别,就是配置寄存器,读取数据。 这个是一个51单片机获取数据后在LCD上显示出来的程序:http://yunpan.cn/Qi3Izk9NWTikv (提取码:5815) 这是一个用野火STM32板子的程序,接线:IIC_SDA.PB11 IIC_SCL.PB10:http://yunpan.cn/Qi3NW9wdZtn7t (提取码:1f0e) 还要两个文档,一个英文,一个中文是关于MPU6050整体的介绍。
在写之前我们先要读懂上面两个工程部分内容。怎么阅读呢?举个例子。 看下下面的函数,这个函数是初始化MPU6050。
下面这句为什么可以解除休眠状态呢?至于为什么要接触休眠状态就要看MPU6050的datasheet,其实也可以看别人的程序怎么写就可以。
首先Single_WriteI2C();是给MPU6050寄存器写入数据的一个函数,需要有寄存器的地址,关于寄存器的描述,下面上次两个文档。一个是中文版,一个是英文版,中文版看得不是很明白,可能翻译得不好,英语可以的可以看下英文版本的。慢慢学着配合有道词典读下英文版的也好。
首先找到PWR_MGMT_1是某个寄存器的地址,其值如下
如果整个过程顺利的话,你可以用串口获得类似下面的数据。怎么检验这些数据是不是对的,我直接将手放在MPU6050上面,可以看到温度稍微会升高,而且我移动MPU6050的时候,数据会变化。初步证明数据是对的。
MPU6050原始数据分析 我有看过几次在论坛上面有人获取原始数据后不知道这些代表什么,甚至不知道为什么要获取这些数据。为什么要获取这些数据呢?看完下一个小节你就会明白。 下面我们来分析下这些数据代表什么。大家可以去看一个第七实验室的文档: 我们配置MPU6050的函数:
查英文寄存器的手册可以知道我配置的陀螺仪的量程是±2000°/s,再查可知灵敏度是16.4LSB°/s。这里还要知道量程越大,测量精度越低。LSB的意思是最小有效位,为数字输出方式下使用;一般我们可以用mg/LSB来表示灵敏度,例如:mpu6050输出的位数为16位(2的16次方共65536个LSB)对应满量程,当量程为±8g时对应灵敏度就为16g/65536LSB=0.244140625mv/g,取倒数为4096LSB/g,因为mpu6050只能16位输出,所以测量范围越大,对应精度就越低。 根据第七实验室的描述一除可以知道我的陀螺仪绕3个轴的角速度最小是不够1°/s,最多是6°/s左右。当时我是保持静止测得的,不知道MPU6050这样子的结果大家是否满意,不知道大神们是否有办法让这几个值接近0呢??
接下来是加速度的分析,同样查英文寄存器手册可以知道我设置的加速度例程是±2g,灵敏度是16384LSB/g,这样子下来加速度在y轴上面是1g,这个是重力加速度,说明我放的时候是y轴在竖直方向上的,其他的两周加速度是接近于0,说明我放得很垂直啊,你也可以换其他的轴在竖直方向上,看那个轴显示出来的值是否是16384左右,我试了,结果是。更加说明我们的结果很对啦。 DMP移植 趁现在有空,先上传个视频让大家一睹为快。 http://v.youku.com/v_show/id_XNzEyNjQ3ODEy.html 你如果是初学者,只是获取了原始数据,那只能告诉你,其实原始数据没有处理没有多大的用处。我们还需要找将那些数据根据数学方面的东西转化为姿态有关的四元数和欧拉角,可以搜下融合算法。我顺便上传个文档,是关于这方面的,不过我还没有看。
接下来按照我的理解解释先怎么转化这个过程和转化后的四元数和欧拉角大概是什么,个人理解,不准确的话大神们帮忙指导下。 这个过程有两种办法,一种你可以去学下数学,然后编程把我们上面获取的原始数据转化为四元数和欧拉角;另一种是直接用MPU6050内部的DMP。前者我还没有学,到时可能要学下。DMP是什么呢?我学的时候也是一头雾水,老是看见别人在说DMP,好像很厉害的样子。看下面的解释,是我找的。DMP的概念: 四元数和欧拉角是什么?我简单理解,简单解释。标准的自己去查下概念。四元数就是4个数,经过 DMP 或 数学+软件 你就可以得到四元数,四元数就是4个数,可以表征姿态,经过几个数学公式(下面编程会展示这几个公式)之后就可以的出姿态,姿态包括pitch,roll,yaw。这几个上传几张图片大家就知道是什么了。 摘自:http://blog.163.com/vipwdp@126/blog/static/150224366201281935518196/ Z轴正方向为前进方向 pitch():俯仰,将物体绕X轴旋转(localRotationX)
下面一段又是别人的解释。 “方向余弦,欧拉角,四元数东西太多,这里只简单说一下四元数,其他的自己找本惯性技术慢慢看吧。四元数是由一个实数单位和三个虚数单位i,j,k组成并具有实元的数,即q(p0,p1,p2,p3)=p0+p1i+p2j+p3k,其中三个虚实单位i,j,k可看做三维空间的单位向量在导航中,一般用的四元数均为特征四元数,形式如下,q=cosθ/2+nsinθ/2=cosθ/2+sin(θ/2)cosαi+sin(θ/2)cosβj+sin(θ/2)cosγk,n为转轴方向单位矢量,第二个等号后面的形式即为特征四元数,其中标量部分cosθ/2表示转角一半的余弦值,矢量部分表示了转角方向,即以原点为旋转中心,旋转的轴是(α, β, γ),( α^2 + β^2 + γ^2 = 1), 转θ角的旋转,用四元数表示就是,Q = (cos(θ/2); α sin(θ/2), β sin(θ/2), γ sin(θ/2)) 。” MPU移植指的是要使用DMP功能官方已经给出移植的文档和移植的c文件、h文件等下面先上资料: 。。。。。。。。。。。。。。。。。。 匿名上位机显示姿态 从上面的视频可以看到我用的上位机是匿名最新版本的,痛心的是匿名的前一版本的上位机不知道为什么在我的电脑上面老是出错,不能打开,搞了我半天多,后来下了新版本的就好了。 错误如下图所示,如果有网友跟我一样的话,自己上百度找办法啊。 看完了之后,你就大概可以看得懂为什么在我的过程中有这么一个函数了。我就不讲解了。我自己也是自己根据他协议写的。
姿态静止的波形:
扰动的姿态波形 |