MPU-6050 六轴 IMU 入门指南:Arduino 接线、库安装与 DMP 姿态解算
元件清单
| 元件 | 数量 |
|---|---|
| Arduino UNO | 1 |
| MPU-6050 模块(六轴:三轴加速度计 + 三轴陀螺仪) | 1 |
| 杜邦线 | 若干 |
MPU-6050 核心特性
- 单芯片集成 3 轴加速度计 + 3 轴陀螺仪
- 内置 DMP(数字运动处理器),可输出四元数、欧拉角、Yaw/Pitch/Roll、去重力加速度等
- I²C 接口(地址 0x68/0x69),低功耗,适合穿戴/手机/平板
- INT 引脚可配置为数据就绪中断,连接 Arduino D2(外部中断 0)
接线(I²C)
| MPU-6050 | Arduino UNO |
|---|---|
| VCC | 5V 或 3.3V(模块自带 LDO 时接 5V,裸芯片板接 3.3V) |
| GND | GND |
| SDA | A4 |
| SCL | A5 |
| INT | D2(外部中断 0) |
库安装步骤
- 下载 I2Cdev 库(
I2Cdev.zip)并解压到 Arduinolibraries目录。 - 下载 MPU6050 库(
MPU6050.zip)同样放入libraries。 - 重启 Arduino IDE,菜单 文件 → 示例 → MPU6050 → Examples → MPU6050_DMP6 打开例程。
- 确认例程开头已包含
#include "I2Cdev.h"与#include "MPU6050_6Axis_MotionApps20.h"。 - 编译上传,打开串口监视器,波特率设为 115200。
串口监视器操作
- 上传后提示
Initializing I2C devices...→Testing device connections...→MPU6050 connection successful。 - 提示
Send any character to begin DMP programming and demo:,发送任意字符启动。 - 随后输出 Yaw/Pitch/Roll(度)、四元数、去重力加速度等,取决于宏定义(默认
OUTPUT_READABLE_YAWPITCHROLL)。 - 板载 LED(D13)闪烁指示运行状态。
关键代码片段(MPU6050_DMP6 例程核心)
#include "I2Cdev.h"
#include "MPU6050_6Axis_MotionApps20.h"
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
#include "Wire.h"
#endif
MPU6050 mpu; // 默认地址 0x68
#define OUTPUT_READABLE_YAWPITCHROLL
#define LED_PIN 13
volatile bool mpuInterrupt = false;
void dmpDataReady() { mpuInterrupt = true; }
void setup() {
Wire.begin();
TWBR = 24; // 400kHz I2C
Serial.begin(115200);
while(!Serial);
mpu.initialize();
Serial.println(mpu.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");
Serial.println("Send any character to begin DMP programming and demo:");
while(Serial.available() && Serial.read());
while(!Serial.available());
while(Serial.available() && Serial.read());
devStatus = mpu.dmpInitialize();
// 以下偏移值需按自校准结果修改
mpu.setXGyroOffset(220);
mpu.setYGyroOffset(76);
mpu.setZGyroOffset(-85);
mpu.setZAccelOffset(1788);
if(devStatus == 0) {
mpu.setDMPEnabled(true);
attachInterrupt(0, dmpDataReady, RISING);
dmpReady = true;
packetSize = mpu.dmpGetFIFOPacketSize();
}
pinMode(LED_PIN, OUTPUT);
}
void loop() {
if(!dmpReady) return;
while(!mpuInterrupt && fifoCount < packetSize) { /* 可做其他任务 */ }
mpuInterrupt = false;
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);
Serial.print("ypr\t");
Serial.print(ypr[0]*180/M_PI); Serial.print("\t");
Serial.print(ypr[1]*180/M_PI); Serial.print("\t");
Serial.println(ypr[2]*180/M_PI);
blinkState = !blinkState;
digitalWrite(LED_PIN, blinkState);
}
}
常见问题与技巧
- 波特率:8 MHz 或更低主频(如 3.3V Pro Mini)无法稳定跑 115200,需降至 38400 或用外部晶振。
- 偏移校准:例程中的陀螺/加速度偏移值需按自校准结果修改,否则零点漂移大。
- INT 引脚:必须接中断脚(Uno 是 D2),否则 DMP 无法触发读取。
- 电源:模块若无 5V 引脚,务必接 3.3V,避免过压损坏。
- 后续扩展:可结合 Processing/Unity 实现 3D 姿态可视化,或接入 Kalman/互补滤波做自平衡车、四轴飞行器。
原理图

制造工艺
- 优化Cat®机械:My.Cat.com终极指南
- 树莓派接 KY‑033 循迹/门状态传感器:简易 Python 实现
- 树莓派构建稳健传感器 API:基于 GY‑91 多功能模块的 Flask 实现
- 树莓派 PIR 运动传感器控制 LED 实战指南
- 掌握树莓派 GPIO:在 B+/Model 2 上接入 PIR 运动传感器
- HC‑SR501 PIR 运动传感器与树莓派接线、校准与 Python 编程全指南
- TJBot 入门指南:构建、配置与语音控制您的 AI 机器人
- 树莓派 3 部署 RAK 831 LoRa 网关分步指南
- 基于 RAK831 模块与树莓派 3 构建 LoRa 网关:分步指南
- Arduino入门教程01:开始你的第一个项目
- Eagle Group:从概念到成品的优质金属制造合作伙伴
- 保险业 AI 落地实战指南:从认知到规模化应用