MPU6050: hướng dẫn đọc dữ liệu IMU 6 trục phổ biến nhất
Atlasbot · 18/8/2026 · 11 phút đọc
Trong số rất nhiều loại IMU trên thị trường, MPU6050 là cái tên quen thuộc nhất với người mới học robot DIY — giá rẻ, giao tiếp I2C đơn giản, thư viện Arduino/ESP32 có sẵn cho gần như mọi trường hợp sử dụng.
Khái niệm chính
MPU6050 là IMU 6 trục (6-DOF): 3 trục accelerometer + 3 trục gyroscope trong cùng một chip, không có magnetometer (khác với MPU9250 — bản 9 trục có thêm la bàn số, đã học ở bài IMU là gì?).
| Thông số | Giá trị |
|---|---|
| Accelerometer | ±2/±4/±8/±16g (chỉnh được) |
| Gyroscope | ±250/±500/±1000/±2000°/giây (chỉnh được) |
| Giao tiếp | I2C (địa chỉ mặc định 0x68, hoặc 0x69 nếu nối chân AD0 lên cao) |
| Điện áp | 3.3–5V (module thường có sẵn LDO chuyển áp) |
Nguyên lý hoạt động
#include <Wire.h>
#include <MPU6050.h>
MPU6050 mpu;
void setup() {
Serial.begin(115200);
Wire.begin();
mpu.initialize();
if (!mpu.testConnection()) {
Serial.println("Không kết nối được MPU6050 — kiểm tra dây I2C (SDA/SCL)");
}
}
void loop() {
int16_t ax, ay, az, gx, gy, gz;
mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
Serial.print("Accel: "); Serial.print(ax); Serial.print(",");
Serial.print(ay); Serial.print(","); Serial.println(az);
Serial.print("Gyro: "); Serial.print(gx); Serial.print(",");
Serial.print(gy); Serial.print(","); Serial.println(gz);
delay(100);
}
Giá trị đọc được là số nguyên thô (raw) — cần chia theo hệ số độ nhạy tương ứng với dải đo đã chọn để ra đơn vị thật (m/s² hoặc độ/giây, đã học ở 2 bài trước), thông tin này có trong datasheet MPU6050.
Kiến thức kỹ thuật
Công thức
Chuyển đổi giá trị thô sang đơn vị thật, dùng hệ số độ nhạy (sensitivity) theo dải đo đã chọn:
Giá_trị_thật = Giá_trị_thô / Hệ_số_độ_nhạy
VD accelerometer, dải ±8g, hệ số độ nhạy 4096 LSB/g:
raw = 8192 → giá_trị_thật = 8192/4096 = 2g = 2 × 9.8 ≈ 19.6 m/s²
VD gyroscope, dải ±500°/s, hệ số độ nhạy 65.5 LSB/(°/s):
raw = 3275 → giá_trị_thật = 3275/65.5 = 50°/s
Thông số
| Thanh ghi I2C | Chức năng |
|---|---|
0x75 (WHO_AM_I) | Đọc để xác nhận đúng chip MPU6050 (giá trị mong đợi 0x68) |
0x6B (PWR_MGMT_1) | Bật/tắt chế độ ngủ (sleep mode) |
0x1C (ACCEL_CONFIG) | Chọn dải đo accelerometer |
0x1B (GYRO_CONFIG) | Chọn dải đo gyroscope |
Ứng dụng thực tế
MPU6050 là lựa chọn khởi đầu hợp lý để học và thử nghiệm với dữ liệu IMU nhờ giá rẻ và cộng đồng hỗ trợ lớn — đây chính là loại chip nền tảng cho việc học các khái niệm accelerometer/gyroscope đã trình bày ở 2 bài trước trước khi ứng dụng vào bài toán thực tế như phát hiện trượt bánh (bài IMU trong AMR). Với ứng dụng thực tế cần độ chính xác cao hơn hoặc cần magnetometer, nên cân nhắc các dòng cao cấp hơn như MPU9250 hoặc BNO055 (có sẵn bộ lọc hợp nhất cảm biến ngay trên chip). BNO055 đặc biệt đáng chú ý cho robot cần độ ổn định cao hơn MPU6050 nhưng chưa cần đầu tư vào IMU công nghiệp đắt tiền — nó tự chạy sẵn thuật toán sensor fusion nội bộ, trả về trực tiếp quaternion hướng đã tính toán, giảm bớt phần code phải tự viết ở tầng ứng dụng.
Ví dụ thực tế
#include <Wire.h>
#include <MPU6050.h>
MPU6050 mpu;
const float ACCEL_SENSITIVITY = 4096.0; // LSB/g, dai +-8g
const float GYRO_SENSITIVITY = 65.5; // LSB/(deg/s), dai +-500deg/s
void setup() {
Serial.begin(115200);
Wire.begin();
mpu.initialize();
mpu.setFullScaleAccelRange(MPU6050_ACCEL_FS_8);
mpu.setFullScaleGyroRange(MPU6050_GYRO_FS_500);
}
void loop() {
int16_t ax, ay, az, gx, gy, gz;
mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
float ax_g = ax / ACCEL_SENSITIVITY;
float gz_dps = gz / GYRO_SENSITIVITY;
Serial.print("Accel X: "); Serial.print(ax_g, 2); Serial.println(" g");
Serial.print("Gyro Z: "); Serial.print(gz_dps, 2); Serial.println(" deg/s");
delay(100);
}
Output điển hình:
Accel X: 0.02 g
Gyro Z: 1.15 deg/s
Chuyển đổi đúng hệ số độ nhạy (khớp với dải đo đã cấu hình bằng setFullScaleAccelRange/setFullScaleGyroRange) là bước bắt buộc — dùng nhầm hệ số của dải đo khác cho ra giá trị sai hoàn toàn dù code không báo lỗi gì.
Lỗi thường gặp
testConnection()trả về false — thường do đấu nhầm chân SDA/SCL, thiếu điện trở pull-up (một số module không có sẵn), hoặc nối nhầm điện áp (một số bản module chỉ chịu 3.3V dù ghi hỗ trợ 5V).- Dùng nhầm hệ số độ nhạy không khớp dải đo đã cấu hình — như tính ở mục Công thức, mỗi dải đo có hệ số riêng, cấu hình
setFullScaleAccelRangemà không đổi hệ số tương ứng khi tính toán gây sai giá trị hoàn toàn. - Dữ liệu gyro trôi dần dù không di chuyển — đây là hiện tượng drift bình thường của mọi gyroscope MEMS giá rẻ (đã học ở bài Gyroscope là gì?), không phải lỗi kết nối.
- Không kiểm tra
WHO_AM_Ikhi nghi ngờ nhầm chip hoặc lỗi kết nối I2C — bỏ qua bước xác nhận cơ bản này khiến khó chẩn đoán khi có nhiều thiết bị I2C khác trên cùng bus gây xung đột địa chỉ.
Kết luận
MPU6050 là lựa chọn khởi đầu hợp lý để học và thử nghiệm với dữ liệu IMU nhờ giá rẻ và cộng đồng hỗ trợ lớn — chuyển đổi đúng hệ số độ nhạy theo dải đo đã cấu hình là bước quan trọng thường bị bỏ qua. Bài cuối cùng của chuyên mục, Hiệu chuẩn IMU, đi vào cách loại bỏ sai số hệ thống (bias) trước khi dùng dữ liệu cho các ứng dụng thực tế.