I2C 通信
UNO/Nano 常用 A4/A5,ESP32 常用 GPIO21/GPIO22,树莓派常用 GPIO2/GPIO3。
Overview
GY-521 是基于 MPU-6050 的六轴姿态模块。芯片内部有三轴 MEMS 陀螺仪、三轴 MEMS 加速度计和温度传感器,可通过 I2C 输出原始运动数据。需要姿态角时,通常使用 DMP 或软件滤波库处理。
UNO/Nano 常用 A4/A5,ESP32 常用 GPIO21/GPIO22,树莓派常用 GPIO2/GPIO3。
AD0 接 GND 通常是 0x68;AD0 接 VCC 通常是 0x69,可挂两个 MPU-6050。
MPU-6050 官方状态和替代型号以 TDK 最新公开页面为准;模块供货批次以实物为准。
Wiring
普通测试先接 VCC、GND、SDA、SCL 四根线即可。INT 是可选脚,跑 DMP 中断模式时再接。
| GY-521 | Arduino UNO / Nano | 说明 |
|---|---|---|
| VCC | 5V 或 3.3V | 常见模块可接 5V,最终以实物模块说明为准 |
| GND | GND | 共地 |
| SDA | A4 / SDA | I2C 数据 |
| SCL | A5 / SCL | I2C 时钟 |
| INT | D2 可选 | DMP 中断模式建议接 |
| AD0 | 默认不接或接 GND | 默认地址 0x68 |
ESP32
ESP32 是 3.3V 逻辑,建议 GY-521 VCC 接 3.3V。不同 ESP32 板可自定义 I2C 引脚,代码里用 Wire.begin(SDA, SCL) 指定。
| GY-521 | ESP32 | 说明 |
|---|---|---|
| VCC | 3.3V | 推荐接 3.3V |
| GND | GND | 共地 |
| SDA | GPIO21 | 常用默认 SDA |
| SCL | GPIO22 | 常用默认 SCL |
| INT | GPIO4 可选 | 也可换其他可用 GPIO |
| AD0 | 默认不接或接 GND | 默认地址 0x68 |
Raspberry Pi
树莓派 I2C 是 3.3V 逻辑,VCC 接 3V3。使用前需要在系统里启用 I2C,再用 i2cdetect -y 1 检查地址。
| GY-521 | 树莓派 40Pin | 说明 |
|---|---|---|
| VCC | Pin 1 / 3V3 | 不要接 5V |
| GND | Pin 6 / GND | 共地 |
| SDA | Pin 3 / GPIO2 | I2C SDA |
| SCL | Pin 5 / GPIO3 | I2C SCL |
| INT | GPIO17 可选 | 普通读取可不接 |
| AD0 | 默认不接或接 GND | 默认地址 0x68 |
I2C Address
| AD0 状态 | I2C 地址 | 用途 |
|---|---|---|
| 接 GND 或默认悬空 | 0x68 | 最常见默认地址 |
| 接 VCC | 0x69 | 同一总线挂第二个 MPU-6050 时使用 |
Arduino Code
Arduino IDE 打开库管理器,安装 Adafruit MPU6050、Adafruit Unified Sensor 和 Adafruit BusIO 后再上传。
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>
Adafruit_MPU6050 mpu;
void setup(void) {
Serial.begin(115200);
while (!Serial) delay(10);
if (!mpu.begin()) {
Serial.println("Failed to find MPU6050 chip");
while (1) delay(10);
}
mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
mpu.setGyroRange(MPU6050_RANGE_500_DEG);
mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
}
void loop() {
sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);
Serial.print("Accel X: ");
Serial.print(a.acceleration.x);
Serial.print(", Y: ");
Serial.print(a.acceleration.y);
Serial.print(", Z: ");
Serial.println(a.acceleration.z);
Serial.print("Gyro X: ");
Serial.print(g.gyro.x);
Serial.print(", Y: ");
Serial.print(g.gyro.y);
Serial.print(", Z: ");
Serial.println(g.gyro.z);
Serial.print("Temp: ");
Serial.println(temp.temperature);
delay(500);
}
FAQ
先检查 VCC/GND/SDA/SCL 是否接反,再确认板子供电。UNO/Nano 是 A4/A5,ESP32 常用 GPIO21/GPIO22,树莓派需要先启用 I2C。
AD0 接到 VCC 时地址通常变为 0x69。默认不接或接 GND 通常是 0x68。
加速度和陀螺仪原始值会有噪声,轻微跳动正常。可降低滤波带宽、做滑动平均、固定模块并重新校准。
陀螺仪积分会产生漂移,Yaw 角尤其明显。需要校准偏移量,并使用 DMP 或互补滤波/卡尔曼滤波处理。
基础读取不用接。跑 DMP 数据就绪中断时建议接到外部中断脚,例如 UNO D2。
Customer Reply
References