arduino教程系列37-Arduino Uno + MPU6050首例整合性6轴演示实验

经过和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

2012-5-24 11:53 上传
(66.77 KB)







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


6050连线图.jpg

2012-5-24 11:53 上传
(63.93 KB)





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


比例数6050.jpg

2012-5-24 11:53 上传
(54.78 KB)





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


ACC 比例数.jpg

2012-5-24 11:53 上传
(57.75 KB)





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



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


硬件连接图.jpg

2012-5-24 11:53 上传
(42.1 KB)




IMG_2149.jpg

2012-5-24 11:53 上传
(104.88 KB)





A4接SDA A5接SCL vcc接3v3商家说可以接5v但是保守起见还是接了3.3v GND接GND

不过mpu受温度的影响精度相差比较大!



注意:本模块采用的是IIC通信方式,所以我们只需要连接四跟线就可以完成电路的连接,简单方便!

接着就是提供一下测试代码给大家玩玩,方便测试!ARDUINO 代码复制打印

// Arduino Wire library is required if I2Cdev I2CDEV_ARDUINO_WIRE implementation// is used in I2Cdev.h#include "Wire.h"// I2Cdev and MPU6050 must be installed as libraries, or else the .cpp/.h files// for both classes must be in the include path of your project#include "I2Cdev.h"#include "MPU6050.h"// class default I2C address is 0x68// specific I2C addresses may be passed as a parameter here// AD0 low = 0x68 (default for InvenSense evaluation board)// AD0 high = 0x69MPU6050 accelgyro;int16_t ax, ay, az;int16_t gx, gy, gz;#define LED_PIN 13bool blinkState = false;void setup() {// join I2C bus (I2Cdev library doesn't do this automatically)Wire.begin();// initialize serial communication// (38400 chosen because it works as well at 8MHz as it does at 16MHz, but// it's really up to you depending on your project)Serial.begin(38400);// initialize deviceSerial.println("Initializing I2C devices...");accelgyro.initialize();// verify connectionSerial.println("Testing device connections...");Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");// configure Arduino LED forpinMode(LED_PIN, OUTPUT);}void loop() {// read raw accel/gyro measurements from deviceaccelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);// these methods (and a few others) are also available//accelgyro.getAcceleration(&ax, &ay, &az);//accelgyro.getRotation(&gx, &gy, &gz);// display tab-separated accel/gyro x/y/z valuesSerial.print("a/g:\t");Serial.print(ax); Serial.print("\t");Serial.print(ay); Serial.print("\t");Serial.print(az); Serial.print("\t");Serial.print(gx); Serial.print("\t");Serial.print(gy); Serial.print("\t");Serial.println(gz);// blink LED to indicate activityblinkState = !blinkState;digitalWrite(LED_PIN, blinkState);}
// Arduino Wire library is required if I2Cdev I2CDEV_ARDUINO_WIRE implementation

// is used in I2Cdev.h

#include "Wire.h"



// I2Cdev and MPU6050 must be installed as libraries, or else the .cpp/.h files

// for both classes must be in the include path of your project

#include "I2Cdev.h"

#include "MPU6050.h"



// class default I2C address is 0x68

// specific I2C addresses may be passed as a parameter here

// AD0 low = 0x68 (default for InvenSense evaluation board)

// AD0 high = 0x69

MPU6050 accelgyro;



int16_t ax, ay, az;

int16_t gx, gy, gz;



#define LED_PIN 13

bool blinkState = false;



void setup() {

// join I2C bus (I2Cdev library doesn't do this automatically)

Wire.begin();



// initialize serial communication

// (38400 chosen because it works as well at 8MHz as it does at 16MHz, but

// it's really up to you depending on your project)

Serial.begin(38400);



// initialize device

Serial.println("Initializing I2C devices...");

accelgyro.initialize();



// verify connection

Serial.println("Testing device connections...");

Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");



// configure Arduino LED for

pinMode(LED_PIN, OUTPUT);

}



void loop() {

// read raw accel/gyro measurements from device

accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);



// these methods (and a few others) are also available

//accelgyro.getAcceleration(&ax, &ay, &az);

//accelgyro.getRotation(&gx, &gy, &gz);



// display tab-separated accel/gyro x/y/z values

Serial.print("a/g:\t");

Serial.print(ax);

Serial.print("\t");

Serial.print(ay);

Serial.print("\t");

Serial.print(az);

Serial.print("\t");

Serial.print(gx);

Serial.print("\t");

Serial.print(gy);

Serial.print("\t");

Serial.println(gz);



// blink LED to indicate activity

blinkState = !blinkState;

digitalWrite(LED_PIN, blinkState);

}



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

MPU6050的水平原始数据.jpg

2012-5-24 11:53 上传
(80.5 KB)





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



ARDUINO 代码复制打印

#include "Wire.h"#include "I2Cdev.h"#include "MPU6050.h"MPU6050 accelgyro;int16_t ax, ay, az;int16_t gx, gy, gz;bool blinkState = false;void setup() {  Wire.begin();  Serial.begin(38400);  accelgyro.initialize(); } void loop() {  accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);  Serial.print("a/g:\t");  Serial.print(ax/16384); Serial.print("\t");  Serial.print(ay/16384); Serial.print("\t");  Serial.print(az/16384); Serial.print("\t");  Serial.print(gx/131); Serial.print("\t");  Serial.print(gy/131); Serial.print("\t");  Serial.println(gz/131);  blinkState = !blinkState;}
#include "Wire.h"

#include "I2Cdev.h"

#include "MPU6050.h"

MPU6050 accelgyro;



int16_t ax, ay, az;

int16_t gx, gy, gz;



bool blinkState = false;



void setup() {



Wire.begin();

Serial.begin(38400);



accelgyro.initialize();

}

void loop() {



accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);

Serial.print("a/g:\t");

Serial.print(ax/16384); Serial.print("\t");

Serial.print(ay/16384); Serial.print("\t");

Serial.print(az/16384); Serial.print("\t");

Serial.print(gx/131); Serial.print("\t");

Serial.print(gy/131); Serial.print("\t");

Serial.println(gz/131);

blinkState = !blinkState;



}

校正后的数据.jpg

2012-5-24 11:53 上传
(72.75 KB)



以上的结果有些偏差,原因是没有经过校正的,这个只是给大家提供参考,希望对您有所帮助谢谢!



另外有什么问题,也可以去翻看lucsong的,关于MPU6050的调试帖子,里面还是有些重要的东西哦!

下面是MPU6050的因为文档,中文还在找时间翻译。

不经过同意,请勿转载,谢谢!

添加实验时的文件相关库:

I2Cdev.zip

(10.85 KB, 下载次数: 4859)

2012-9-27 23:05 上传
点击文件名下载附件

MPU6050.zip

(31.47 KB, 下载次数: 4953)

2012-9-27 23:05 上传
点击文件名下载附件


via - 极客工坊

标签: Arduino教程