好文档 - 专业文书写作范文服务资料分享网站

Arduino MPU6050 6 轴运动处理模块精编教程

天下 分享 时间: 加入收藏 我要投稿 点赞

Arduino MPU6050 6 轴运动处理模块精编教程

?

2014年1月27日 ? ARDUINO, 传感器

了解 MPU6050 芯片:

MPU-6000(6050)为全球首例整合性6轴运动处

理组件,相较于多组件方案,免除了组合陀螺仪与加速器时之轴间差的问题,减少了大量的包装空间。MPU-6000(6050)整合了3轴陀螺仪、3轴加速器,并含可藉由第二个I2C端口连接其他厂牌之加速器、磁力传感器、或其他传感器的数位运动处理(DMP: Digital Motion Processor)硬件加速引擎,由主要I2C端口以单一数据流的形式,向应用端输出完整的9轴融合演算技术。

InvenSense 的运动处理资料库,可处理运动感测的复杂数据,降低了运动处理运算对操作系统的负荷,并为应用开发提供架构化的API。

MPU-6000(6050)的角速度全格感测范围为±250、±500、±1000与±2000°/sec (dps),可准确追踪快速与慢速动作,并且,用户可程式控制的加速器全格感测范围为±2g、±4g±8g与±16g。产品传输可透过最高至400kHz的 I2C 或最高达20MHz的SPI(MPU-6050没有SPI)。

MPU-6000可在不同电压下工作,VDD供电电压介为2.5V±5%、3.0V±5%或3.3V±5%,逻辑接口VVDIO供电为1.8V± 5%(MPU6000仅用VDD)。MPU-6000的包装尺寸

4x4x0.9mm(QFN),在业界是革命性的尺寸。其他的特征包含内建的温度感测器、包含在运作环境中仅有±1%变动的振荡器。

了解 I2C 总线通讯协议:

请戳这里跳转

连接 Arduino:

Arduino 连接 MPU6050 模块

请注意:

Arduino Uno 下 SDA 是 A4,SCL 是 A5

Arduino Mega 2560 下 SDA 是 pin 20,SCL 是 21

准备并安装依赖库文件:

点击下载 I2CDEVLIB ? 点击下载 MPU6050 类库 ? 如何安装类库请戳这里

?

例程:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39

/*

*@Author: TONYLABS *@Date: 2012.12.23 */

//@引入 Wire.h 头文件,下面的 I2Cdev.h 依赖于它 #include \

//@I2Cdev 和 MPU6050 类库需要事先安装在 Arduino 类库文件夹下 //@引入 I2Cdev.h 头文件 #include \

//@引入

#include \

//@实例化一个 MPU6050 对象,对象名称为 mpu MPU6050 mpu(0x68);

//@ 声明 MPU6050 控制和状态变量

bool dmpReady = false; //@set true if DMP init was successful uint8_t mpuIntStatus; //@此变量用于保存 MPU6050 中断状态

uint8_t devStatus; //@返回设备状态,0为成功,不为0则发生错误 uint16_t packetSize; // expected DMP packet size (default is 42 bytes) uint16_t fifoCount; // count of all bytes currently in FIFO uint8_t fifoBuffer[64]; // FIFO storage buffer

//@声明方向和运动变量:

Quaternion q; //@四元数变量 W,X,Y,Z VectorFloat gravity; //@重力矢量 X,Y, Z

float ypr[3]; // [yaw, pitch, roll] yaw/pitch/roll container and gravity vector

// ================================================================ // =========================== 中断检测程序 ========================= // ================================================================

volatile bool mpuInterrupt = false; // indicates whether MPU interrupt pin has gone high void dmpDataReady()

40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95

{

mpuInterrupt = true; }

// ================================================================ // =============== 初始设置 凡 Arduino 代码都有 setup() ===============

// ================================================================

void setup() {

Serial.begin(115200); //@开启串口,设置波特率为 115200,程序下载到 Arduino 之后注意打开串口观察

//@加入 I2C 总线序列 Wire.begin();

//@初始化MPU6050

Serial.println(\ mpu.initialize();

//@验证连接

Serial.println(\

Serial.println(mpu.testConnection() ? \

delay(2); //@延时2毫秒

//@加载并配置 DMP 数字运动处理引擎 Serial.println(\

devStatus = mpu.dmpInitialize(); //@返回 DMP 状态结果,0为成功,不为0则发生错误

//@如果成功返回 0 if (devStatus == 0) {

//@使能 DMP 数字运动处理引擎 Serial.println(\ mpu.setDMPEnabled(true);

//@使能 Arduino 中断检测

Serial.println(\ attachInterrupt(0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus();

// set our DMP Ready flag so the main loop() function knows it's okay to use it Serial.println(\ dmpReady = true;

// get expected DMP packet size for later comparison packetSize = mpu.dmpGetFIFOPacketSize(); } else {

// ERROR!

// 1 = initial memory load failed

// 2 = DMP configuration updates failed

// (if it's going to break, usually the code will be 1) Serial.print(\

96 Serial.print(devStatus); 97 Serial.println(\98 } 99 } 100

101 // ================================================================ 102 // =========================== 主循环程序体 ========================= 103 // ================================================================ 104

105 void loop() 106 {

107 float alpha, omiga; //@声明2个浮点数变量, alpha 和 omiga 108

109 //@如果 MPU6050 的 DMP 状态为错误,程序停止工作 110 if (!dmpReady) 111 return; 112

113 // wait for MPU interrupt or extra packet(s) available 114 if (!mpuInterrupt && fifoCount < packetSize) 115 return; 116

117 // reset interrupt flag and get INT_STATUS byte 118 mpuInterrupt = false;

119 mpuIntStatus = mpu.getIntStatus(); 120

121 // get current FIFO count

122 fifoCount = mpu.getFIFOCount(); 123

124 // check for overflow (this should never happen unless our code is too inefficient) 125 if ((mpuIntStatus & 0x10) || fifoCount == 1024) { 126 // reset so we can continue cleanly 127 mpu.resetFIFO();

128 Serial.println(\129

130 // otherwise, check for DMP data ready interrupt (this should happen frequently) 131 }

132 else if (mpuIntStatus & 0x02) {

133 // wait for correct available data length, should be a VERY short wait 134 while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount(); 135

136 // read a packet from FIFO

137 mpu.getFIFOBytes(fifoBuffer, packetSize); 138

139 // track FIFO count here in case there is > 1 packet available

140 // (this lets us immediately read more without waiting for an interrupt) 141 fifoCount -= packetSize; 142

143 mpu.dmpGetQuaternion(&q, fifoBuffer); 144 mpu.dmpGetGravity(&gravity, &q); 145

mpu.dmpGetYawPitchRoll(ypr, &q, &gravity); //@从DMP中取出Yaw, Pitch, Roll三个轴的角度,放入数组ypr。单146

147 位:弧度

148 alpha=-ypr[2] * 180/M_PI; 149

/s, 65536/4000 150 omiga=mpu.getRotationX()/16.4; //@配置是16位表示正负2000°

151

152 Serial.print(\

Serial.print(alpha);

Serial.print(\ Serial.println(omiga); } }

Arduino MPU6050 6 轴运动处理模块精编教程

ArduinoMPU60506轴运动处理模块精编教程?2014年1月27日?ARDUINO,传感器了解MPU6050芯片:MPU-6000(6050)为全球首例整合性6轴运动处理组件,相较于多组件方案,免除了组合陀螺仪与加速器时之轴间差的问题,减少了大量的包装空
推荐度:
点击下载文档文档为doc格式
2ywb97aamk9o8y29xxgt
领取福利

微信扫码领取福利

微信扫码分享