第一范文网 - 专业文章范例文档资料分享平台

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

来源:用户分享 时间:2025/11/19 21:46:00 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

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 轴运动处理模块精编教程.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c2ywb97aamk9o8y29xxgt_1.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top