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

发布于: 27 January, 2014
分享:

了解 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 Uno 下 SDA 是 A4,SCL 是 A5 Arduino Mega 2560 下 SDA 是 pin 20,SCL 是 21

准备并安装依赖库文件:

例程:

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

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

#include "Wire.h" #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h"

mpu MPU6050 mpu(0x68);

bool dmpReady = false; uint8_t mpuIntStatus; uint8_t devStatus; uint16_t packetSize; uint16_t fifoCount; uint8_t fifoBuffer[64]; Quaternion q; VectorFloat gravity; float ypr[3];

volatile bool mpuInterrupt = false;

dmpDataReady() { mpuInterrupt = true; }

void setup() { Serial.begin(115200); Wire.begin(); Serial.println("Initializing I2C devices..."); mpu.initialize(); Serial.println("Testing device connections..."); Serial.println(mpu.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");

delay(2);

Serial.println("Initializing DMP...");
devStatus = mpu.dmpInitialize(); //@返回 DMP 状态结果,0为成功,不为0则发生错误
//@如果成功返回 0
if (devStatus == 0) {
    Serial.println("Enabling DMP...");
    mpu.setDMPEnabled(true);
    Serial.println("Enabling interrupt detection (Arduino external interrupt 0)...");
    attachInterrupt(0, dmpDataReady, RISING);
    mpuIntStatus = mpu.getIntStatus();
    Serial.println("DMP ready! Waiting for first interrupt...");
    dmpReady = true;
    packetSize = mpu.dmpGetFIFOPacketSize();
} else {
    Serial.print("DMP Initialization failed (code ");
    Serial.print(devStatus);
    Serial.println(")");
}

}

void loop() { float alpha, omiga; if (!dmpReady) return; if (!mpuInterrupt && fifoCount < packetSize) return; mpuIntStatus = mpu.getIntStatus(); fifoCount = mpu.getFIFOCount(); if ((mpuIntStatus & 0x10) || fifoCount == 1024) { mpu.resetFIFO(); Serial.println("FIFO overflow!"); } else if (mpuIntStatus & 0x02) { while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount(); mpu.getFIFOBytes(fifoBuffer, packetSize); fifoCount -= packetSize; mpu.dmpGetQuaternion(&q, fifoBuffer); mpu.dmpGetGravity(&gravity, &q); mpu.dmpGetYawPitchRoll(ypr, &q, &gravity); alpha=-ypr[2] * 180/M_PI; omiga=mpu.getRotationX()/16.4; Serial.print("Alpha "); Serial.print(alpha); Serial.print("\tOmiga "); Serial.println(omiga); } }

0 留言

留言

您的留言将被人工审核,请勿发表色情、反动言论。