极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 181864|回复: 290

arduino学习笔记37 - Arduino Uno + MPU6050首例整合性6轴演示实验

  [复制链接]
发表于 2012-5-24 12:02:41 | 显示全部楼层 |阅读模式
本帖最后由 Randy 于 2012-9-27 23:05 编辑

经过和lucsong 一起学习了几天时间,慢慢的有些了解MPU6050这个6轴的姿态模块,现在决定整理一下这个模块与Arduino的结合使用方法!(如有错误麻烦请指出,谢谢!)
Mpu6050为全球首例整合3轴陀螺仪、3轴加速器、含9轴融合演
MPU-6000为全球首例整合性6轴运动处理组件,相较于多组件方案,免除了组合陀螺仪与加速器时之轴间差的问题,减少了大量的包装空间。MPU-6000整合了3轴陀螺仪、3轴加速器,并含可藉由第二个I2C端口连接其他厂牌之加速器、磁力传感器、或其他传感器的数位运动处理(DMP: Digital Motion Processor)硬件加速引擎,由主要I2C端口以单一数据流的形式,向应用端输出完整的9轴融合演算技术
InvenSense的运动处理资料库,可处理运动感测的复杂数据,降低了运动处理运算对操作系统的负荷,并为应用开发提供架构化的API。
MPU-6000的角速度全格感测范围为±250、±500、±1000与±2000°/sec (dps),可准确追緃快速与慢速动作,并且,用户可程式控制的加速器全格感测范围为±2g、±4g±8g与±16g。产品传输可透过最高至400kHz的I2C或最高达20MHz的SPI。
MPU-6000可在不同电压下工作,VDD供电电压介为2.5V±5%、3.0V±5%或3.3V±5%,逻辑接口VVDIO供电为1.8V± 5%。MPU-6000的包装尺寸4x4x0.9mm(QFN),在业界是革命性的尺寸。其他的特征包含内建的温度感测器、包含在运作环境中仅有±1%变动的振荡器。


应用
运动感测游戏
现实增强
电子稳像 (EIS: Electronic Image Stabilization)
光学稳像(OIS: Optical Image Stabilization)
行人导航器
“零触控”手势用户接口
姿势快捷方式

认证市场
智能型手机
平板装置设备
手持型游戏产品
游戏机
3D遥控器
可携式导航设备

特征
1、以数字输出6轴或9轴的旋转矩阵、四元数(quaternion)、欧拉角格式(Euler Angle forma)的融合演算数据。
2、具有131 LSBs/°/sec 敏感度与全格感测范围为±250、±500、±1000与±2000°/sec 的3轴角速度感测器(陀螺仪)。
3、可程式控制,且程式控制范围为±2g、±4g、±8g和±16g的3轴加速器。
4、移除加速器与陀螺仪轴间敏感度,降低设定给予的影响与感测器的飘移。
5、数字运动处理(DMP: Digital Motion Processing)引擎可减少复杂的融合演算数据、感测器同步化、姿势感应等的负荷。
6、运动处理数据库支持Android、Linux与Windows
7、内建之运作时间偏差与磁力感测器校正演算技术,免除了客户须另外进行校正的需求。
8、以数位输出的温度传感器
9、以数位输入的同步引脚(Sync pin)支援视频电子影相稳定技术与GPS
10、可程式控制的中断(interrupt)支援姿势识别、摇摄、画面放大缩小、滚动、快速下降中断、high-G中断、零动作感应、触击感应、摇动感应功能。
11、VDD供电电压为2.5V±5%、3.0V±5%、3.3V±5%;VDDIO为1.8V± 5%
12、陀螺仪运作电流:5mA,陀螺仪待命电流:8A;加速器运作电流:8A,加速器省电模式电流: 8A@10Hz
13、高达400kHz快速模式的I2C,或最高至20MHz的SPI串行主机接口(serial host interface)
14、内建频率产生器在所有温度范围(full temperature range)仅有±1%频率变化。
15、使用者亲自测试
16、10,000 g 碰撞容忍度
17、为可携式产品量身订作的最小最薄包装 (4x4x0.9mm QFN)
18、符合RoHS及环境标准MPU-6000为全球首例整合性6轴运动处理组件,相较于多组件方案,免除了组合陀螺仪与加速器时之轴间差的问题,减少了大量的包装空间。MPU-6000整合了3轴陀螺仪、3轴加速器,并含可藉由第二个I2C端口连接其他厂牌之加速器、磁力传感器、或其他传感器的数位运动处理(DMP: Digital Motion Processor)硬件加速引擎,由主要I2C端口以单一数据流的形式,向应用端输出完整的9轴融合演算技术
InvenSense的运动处理资料库,可处理运动感测的复杂数据,降低了运动处理运算对操作系统的负荷,并为应用开发提供架构化的API。

MPU-6000的角速度全格感测范围为±250、±500、±1000与±2000°/sec (dps),可准确追緃快速与慢速动作,并且,用户可程式控制的加速器全格感测范围为±2g、±4g±8g与±16g。产品传输可透过最高至400kHz的I2C或最高达20MHz的SPI。
MPU-6000可在不同电压下工作,VDD供电电压介为2.5V±5%、3.0V±5%或3.3V±5%,逻辑接口VVDIO供电为1.8V± 5%。MPU-6000的包装尺寸4x4x0.9mm(QFN),在业界是革命性的尺寸。其他的特征包含内建的温度感测器、包含在运作环境中仅有±1%变动的振荡器。

从MPU6050的技术文档里我们可以看得出来一些重要参数出来!如果比例数是多少,芯片的特性都是可以看得出来的!

下面可以看一下以下几个图片,这样你也许会了解一些!

第一张是MPU6000与MPU6050芯片的比较!


6050芯片图.jpg


第二张是MPU6000与MPU6050芯片的最小驱动电路的连接!

6050连线图.jpg

第三张是陀螺仪的设计规范表格!

比例数6050.jpg

第四张是加速度的设计规范表格!

ACC 比例数.jpg

如果您需要更多的知识,请翻看MPU6050的英文技术文档,里面已经写的很清楚了,还有中文文档,最近在准备进行翻译,稍后有中午的话也会给大家贴出!

下面是arduino与MPU6050的小模块的连线图:

硬件连接图.jpg

IMG_2149.jpg

A4接SDA     A5接SCL   vcc接3v3商家说可以接5v但是保守起见还是接了3.3v   GND接GND
不过mpu受温度的影响精度相差比较大!


注意:本模块采用的是IIC通信方式,所以我们只需要连接四跟线就可以完成电路的连接,简单方便!
接着就是提供一下测试代码给大家玩玩,方便测试!
  1. // Arduino Wire library is required if I2Cdev I2CDEV_ARDUINO_WIRE implementation
  2. // is used in I2Cdev.h
  3. #include "Wire.h"

  4. // I2Cdev and MPU6050 must be installed as libraries, or else the .cpp/.h files
  5. // for both classes must be in the include path of your project
  6. #include "I2Cdev.h"
  7. #include "MPU6050.h"

  8. // class default I2C address is 0x68
  9. // specific I2C addresses may be passed as a parameter here
  10. // AD0 low = 0x68 (default for InvenSense evaluation board)
  11. // AD0 high = 0x69
  12. MPU6050 accelgyro;

  13. int16_t ax, ay, az;
  14. int16_t gx, gy, gz;

  15. #define LED_PIN 13
  16. bool blinkState = false;

  17. void setup() {
  18.   // join I2C bus (I2Cdev library doesn't do this automatically)
  19.   Wire.begin();

  20.   // initialize serial communication
  21.   // (38400 chosen because it works as well at 8MHz as it does at 16MHz, but
  22.   // it's really up to you depending on your project)
  23.   Serial.begin(38400);

  24.   // initialize device
  25.   Serial.println("Initializing I2C devices...");
  26.   accelgyro.initialize();

  27.   // verify connection
  28.   Serial.println("Testing device connections...");
  29.   Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");

  30.   // configure Arduino LED for
  31.   pinMode(LED_PIN, OUTPUT);
  32. }

  33. void loop() {
  34.   // read raw accel/gyro measurements from device
  35.   accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);

  36.   // these methods (and a few others) are also available
  37.   //accelgyro.getAcceleration(&ax, &ay, &az);
  38.   //accelgyro.getRotation(&gx, &gy, &gz);

  39.   // display tab-separated accel/gyro x/y/z values
  40.   Serial.print("a/g:\t");
  41.   Serial.print(ax);
  42.   Serial.print("\t");
  43.   Serial.print(ay);
  44.   Serial.print("\t");
  45.   Serial.print(az);
  46.   Serial.print("\t");
  47.   Serial.print(gx);
  48.   Serial.print("\t");
  49.   Serial.print(gy);
  50.   Serial.print("\t");
  51.   Serial.println(gz);

  52.   // blink LED to indicate activity
  53.   blinkState = !blinkState;
  54.   digitalWrite(LED_PIN, blinkState);
  55. }
复制代码


以上这个代码是没有添加算法的,所以显示的是只是原始数据!
我们可以通过串口监视串口可以看到这样的结果!


MPU6050的水平原始数据.jpg

第二个测试代码是加了简简单单的算法之后的!其实很简单,看技术文档就可以了!

  1. #include "Wire.h"
  2. #include "I2Cdev.h"
  3. #include "MPU6050.h"
  4. MPU6050 accelgyro;

  5. int16_t ax, ay, az;
  6. int16_t gx, gy, gz;

  7. bool blinkState = false;

  8. void setup() {

  9.     Wire.begin();
  10.     Serial.begin(38400);

  11.     accelgyro.initialize();
  12. }
  13. void loop() {

  14.     accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
  15.     Serial.print("a/g:\t");
  16.     Serial.print(ax/16384); Serial.print("\t");
  17.     Serial.print(ay/16384); Serial.print("\t");
  18.     Serial.print(az/16384); Serial.print("\t");
  19.     Serial.print(gx/131); Serial.print("\t");
  20.     Serial.print(gy/131); Serial.print("\t");
  21.     Serial.println(gz/131);
  22.     blinkState = !blinkState;

  23. }
复制代码
校正后的数据.jpg
以上的结果有些偏差,原因是没有经过校正的,这个只是给大家提供参考,希望对您有所帮助谢谢!

另外有什么问题,也可以去翻看lucsong的,关于MPU6050的调试帖子,里面还是有些重要的东西哦!
下面是MPU6050的因为文档,中文还在找时间翻译。

不经过同意,请勿转载,谢谢!
添加实验时的文件相关库: I2Cdev.zip (10.85 KB, 下载次数: 6975)

PS-MPU-6000A[1].pdf

1.6 MB, 下载次数: 7320

回复

使用道具 举报

发表于 2012-12-28 17:52:10 | 显示全部楼层
夏异 发表于 2012-11-17 23:55
为什么A4接SDA,A5接SCL?搞不懂

如果是Uno板子,A4,A5就是被定义为SDA和SCL。请看手册http://arduino.cc/en/Reference/Wire
注意如果是leonardo或其他板子,可就不是A4,A5了。
回复 支持 1 反对 0

使用道具 举报

发表于 2013-2-28 18:53:34 | 显示全部楼层
Serial.print(ax/16384); Serial.print("\t");
    Serial.print(ay/16384); Serial.print("\t");
    Serial.print(az/16384); Serial.print("\t");
数字16384要写为16384.0,要不然就是整除。
回复 支持 1 反对 0

使用道具 举报

发表于 2012-10-26 12:09:22 | 显示全部楼层
有个小bug哦
角度直接除以16384得到0了,要除以16384.0再输出

点评

正纳闷怎么都是0的时候,看见Malc的回复了。  发表于 2014-4-25 14:56
回复 支持 1 反对 0

使用道具 举报

发表于 2012-5-24 13:38:39 | 显示全部楼层
太好了,我已经收藏你的这个帖子了,随时关注。
回复 支持 1 反对 0

使用道具 举报

发表于 2012-5-24 12:17:22 | 显示全部楼层
楼主厉害,对了上面你发的图,可以测出XYZ三个平移量,是吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-5-24 12:19:13 | 显示全部楼层
GeMarK 发表于 2012-5-24 12:17
楼主厉害,对了上面你发的图,可以测出XYZ三个平移量,是吗?

可以的。具体深入的知识还有待提供,一起努力吧!
回复 支持 反对

使用道具 举报

发表于 2012-5-24 21:15:00 | 显示全部楼层
一定要顶,randy文笔真好,希望快点翻译出来,加油
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-5-24 21:20:03 | 显示全部楼层
lucsong 发表于 2012-5-24 21:15
一定要顶,randy文笔真好,希望快点翻译出来,加油

好,见笑了,我的文笔不好,读书时语文作文常常不懂写!悲催!嗯,抓时间出来才行。最近时间也紧,很多东西要学习,呵呵!
回复 支持 反对

使用道具 举报

发表于 2012-5-25 12:04:41 | 显示全部楼层
淘宝上看到的成品单6050模块 只要50块钱了。芯片30 性价比还是很高的,加一个磁定向做四轴的传感就完全够了(目前四轴的传感最多的就是4个模块  三轴陀螺 加速计 磁定向 气压,其中气压实际上可有可无)
三轴陀螺加上加速度可以有效的解决长时间使用三轴陀螺的数据偏差(可以理解为转长了,芯片晕了)。美好啊~~~~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-5-25 13:04:09 | 显示全部楼层
darkorigin 发表于 2012-5-25 12:04
淘宝上看到的成品单6050模块 只要50块钱了。芯片30 性价比还是很高的,加一个磁定向做四轴的传感就完全够了 ...

是的,单个芯片那么贵,一个模块也就50元,这是市场所逼的结果,气压计我也觉得要不要无所谓,我比较同意你后面的那句话!
回复 支持 反对

使用道具 举报

发表于 2012-5-25 15:46:26 | 显示全部楼层
Randy 发表于 2012-5-25 13:04
是的,单个芯片那么贵,一个模块也就50元,这是市场所逼的结果,气压计我也觉得要不要无所谓,我比较同意 ...

气压计主要是用来辅助计算所在海拔的(气压和海拔有对应关系),但是物理学基本常识告诉我们,这些都是相对的。因为天气对气压也有影响的。所以测得的其他和海拔的关系还要做修正。何况我们又不搞测绘。要啥子海拔嘛。如果要搞自动点对点飞行,直接上GPS就好了嘛,海拔更清晰。
回复 支持 反对

使用道具 举报

发表于 2012-5-26 13:25:44 | 显示全部楼层
这个我做了,但不是在Ardunio上面的,我是用STM32做的,几周前的了,今天刚刚买了个ardunio玩玩~
回复 支持 反对

使用道具 举报

发表于 2012-5-26 13:52:46 | 显示全部楼层
玩飞参的肯定要气压计。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-5-26 14:22:46 | 显示全部楼层
nongxiaoming 发表于 2012-5-26 13:25
这个我做了,但不是在Ardunio上面的,我是用STM32做的,几周前的了,今天刚刚买了个ardunio玩玩~

你用STM32做的啊,可以分享一下你的制作过程?如果可以的话,很感谢您哦!
回复 支持 反对

使用道具 举报

发表于 2012-5-27 12:21:48 | 显示全部楼层
迷你强 发表于 2012-5-26 13:52
玩飞参的肯定要气压计。。。

气压计主要就是通过测量气压得到海拔参数撒?
关键是天气对气压还是有影响的吧。。。所以,数据。。。会有偏差吧
回复 支持 反对

使用道具 举报

发表于 2012-5-28 13:16:54 | 显示全部楼层
楼主你是学电子的么。。求入门书。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-5-28 13:51:53 | 显示全部楼层
陈冬冬 发表于 2012-5-28 13:16
楼主你是学电子的么。。求入门书。。。

是学电子的,准备走出学校大门而已,您想问什么入门书呢?是Arduino的?如果是请看一下这个链接哦!里面讲的这些都是不错的哦!http://www.geek-workshop.com/for ... &extra=page%3D1
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2018-12-16 16:22 , Processed in 0.056996 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表