MPU6050 六轴 IMU 详解:Arduino 姿态解算与 3D 可视化
本教程讲解 MPU6050 加速度计与陀螺仪 传感器的原理及 Arduino 读取方法,并实现两个实战例程: 可观看视频或阅读图文教程。 例程一:Processing 3D 可视化姿态;例程二:自稳定平台/云台,融合加速度计与陀螺仪数据驱动三舵机保持水平。 MPU6050 集成 三轴加速度计 与 三轴陀螺仪 于单芯片。 MPU6050 即 6 轴运动追踪器 / 6 DoF(3 加速度 + 3 陀螺)。 I2C 通信,仅需 2 根信号线 (SDA/SCL) + 电源。 Arduino 串口发送 运行效果:3D 盒子实时跟随传感器姿态,响应灵敏。Yaw 会随时间漂移(无加速度计修正)。 MPU6050 内置 DMP 可输出四元数,无万向节锁、自动融合磁力计修正 Yaw。需额外连接中断引脚 (INT → Arduino D2),使用 i2cdevlib 库。 库自带 第二个例程(DIY 云台/自稳定平台)已单独成文,详见后续文章。 欢迎评论区提问,别忘了查看我的 Arduino 项目合集!
概览
工作原理

Arduino 与 MPU6050 连接

所需元件
MPU6050 Arduino 读取代码(含互补滤波)
/* Arduino + MPU6050 加速度计陀螺仪教程 by Dejan, https://howtomechatronics.com */
#include 代码关键点
0.96 * 陀螺角度 + 0.04 * 加速度角度calculate_IMU_error() 静止采样 200 次求平均零偏,结果写入修正常量





Processing 3D 姿态可视化
roll/pitch/yaw,Processing 读取旋转 3D 物体。/* Arduino + MPU6050 - 3D 可视化 by Dejan, https://howtomechatronics.com */
import processing.serial.*;
Serial myPort; String data=""; float roll, pitch, yaw;
void setup() {
size(2560, 1440, P3D);
myPort = new Serial(this, "COM7", 19200);
myPort.bufferUntil('\n');
}
void draw() {
translate(width/2, height/2, 0);
background(233);
textSize(22);
text("Roll: " + int(roll) + " Pitch: " + int(pitch), -100, 265);
rotateX(radians(-pitch));
rotateZ(radians(roll));
rotateY(radians(yaw));
textSize(30); fill(0, 76, 153);
box(386, 40, 200);
textSize(25); fill(255);
text("www.HowToMechatronics.com", -183, 10, 101);
}
void serialEvent(Serial myPort) {
data = myPort.readStringUntil('\n');
if (data != null) {
data = trim(data);
String[] items = split(data, '/');
if (items.length > 2) {
roll = float(items[0]);
pitch = float(items[1]);
yaw = float(items[2]);
}
}
}
进阶:使用 DMP (Digital Motion Processor) 消除 Yaw 漂移



MPU6050_DMP6 示例与 Processing 可视化代码(输出四元数 OUTPUT_TEAPOT)。四元数旋转更稳健、无 Gimbal Lock。/* DMP 四元数 3D 可视化 */
import processing.serial.*;
Serial myPort; String data=""; float roll, pitch, yaw;
void setup() {
size(2560, 1440, P3D);
myPort = new Serial(this, "COM7", 19200);
myPort.bufferUntil('\n');
}
void draw() {
translate(width/2, height/2, 0);
background(233);
textSize(22);
text("Roll: " + int(roll) + " Pitch: " + int(pitch), -100, 265);
rotateX(radians(-pitch));
rotateZ(radians(roll));
rotateY(radians(yaw));
textSize(30); fill(0, 76, 153);
box(386, 40, 200);
textSize(25); fill(255);
text("www.HowToMechatronics.com", -183, 10, 101);
}
void serialEvent(Serial myPort) {
data = myPort.readStringUntil('\n');
if (data != null) {
data = trim(data);
String[] items = split(data, '/');
if (items.length > 2) {
roll = float(items[0]);
pitch = float(items[1]);
yaw = float(items[2]);
}
}
}
制造工艺
- 打造安全的 Arduino RFID 门锁——分步指南
- Arduino UNO 驱动 16x2 LCD 实现动画与小游戏
- Arduino + MPU6050 姿态控制舵机:SG90 与 MG996R 精准跟随实战
- Python 3 控制 Arduino UNO - 串口通信点亮内置 LED 入门教程
- 使用 Arduino Nano 和 RDA8057M 制作紧凑型 FM 收音机
- Arduino Nano + MPU6050 实现加速度转倾斜角度(Visuino 图形化编程)
- Arduino Nano 指纹传感器项目——分步教程
- 用 Arduino UNO 自制迷你钢琴 — 图文教程
- 手把手教你打造树莓派 3 + Arduino 笔记本电脑
- ESP 手势识别系统:Arduino 101/ADXL335 加速度计 + 机器学习实时识别动作
- ADXL345 三轴加速度计 Arduino 姿态追踪教程
- Arduino入门教程01:开始你的第一个项目