Швидкий довідник по MPU6050: I2C-адресація, ключові регістри, режими діапазону і формули переводу сирих значень у фізичні одиниці.
I2C-адреса
| AD0 (пін) | Адреса |
|---|---|
| Підтягнутий до GND (за замовчуванням) | 0x68 |
| Підтягнутий до VCC | 0x69 |
На модулях GY-521 AD0 зазвичай розведений на окремий пін, можна перемикати.
Ключові регістри
| Адреса | Назва | Опис |
|---|---|---|
0x6B |
PWR_MGMT_1 | Керування живленням. Запис 0 — будимо. |
0x1B |
GYRO_CONFIG | Діапазон гіроскопа (див. нижче) |
0x1C |
ACCEL_CONFIG | Діапазон акселерометра (див. нижче) |
0x3B |
ACCEL_XOUT_H | Початок 6 байтів даних акселерометра |
0x43 |
GYRO_XOUT_H | Початок 6 байтів даних гіроскопа |
0x41 |
TEMP_OUT_H | Температура (2 байти) |
0x75 |
WHO_AM_I | Має повертати 0x68 — перевірка зв’язку |
Дані: формат і порядок
Від 0x3B чип віддає 6 байтів акселерометра, по два на вісь, старший байт перший:
|
1 2 3 4 5 6 7 |
0x3B ACCEL_XOUT_H ┐ 0x3C ACCEL_XOUT_L ┘ → int16 X 0x3D ACCEL_YOUT_H ┐ 0x3E ACCEL_YOUT_L ┘ → int16 Y 0x3F ACCEL_ZOUT_H ┐ 0x40 ACCEL_ZOUT_L ┘ → int16 Z |
Склейка двох байтів у число зі знаком:
|
1 2 |
int16_t raw = (high_byte << 8) | low_byte; |
Гіроскоп — аналогічно, починаючи з 0x43. Між ними (0x41–0x42) лежить температура.
Діапазони акселерометра (ACCEL_CONFIG, 0x1C)
Біти [4:3] регістра задають повний діапазон. Чим ширший — тим грубіша роздільна здатність на одну одиницю.
| AFS_SEL | Діапазон | Сирий діапазон | Дільник (LSB/g) |
|---|---|---|---|
0 |
±2 g | −32768 … +32767 | 16384 |
1 |
±4 g | −32768 … +32767 | 8192 |
2 |
±8 g | −32768 … +32767 | 4096 |
3 |
±16 g | −32768 … +32767 | 2048 |
Формула переводу в g:
|
1 2 |
g = raw / дільник |
За замовчуванням — ±2 g, дільник 16384.
⚠ Звідки 16384. Діапазон ±2g розкладений на 16 біт зі знаком. Половина діапазону (2g) відповідає максимуму 32768. 32768 / 2 = 16384 одиниць на кожен g. Поміняв діапазон — поміняв дільник.
⚠ Класична граблина. Взяв чужий код з іншим діапазоном (наприклад,
±4 g), забув про дільник — і твої числа в 2 рази менші, ніж мали б бути. Модель отримує дані не того масштабу й видає сміття.
Діапазони гіроскопа (GYRO_CONFIG, 0x1B)
Аналогічно, біти [4:3]:
| FS_SEL | Діапазон | Дільник (LSB/°/с) |
|---|---|---|
0 |
±250 °/с | 131.0 |
1 |
±500 °/с | 65.5 |
2 |
±1000 °/с | 32.8 |
3 |
±2000 °/с | 16.4 |
Формула:
|
1 2 |
°/с = raw / дільник |
За замовчуванням — ±250 °/с, дільник 131.0.
Температура
| Регістр | Що |
|---|---|
0x41-0x42 |
TEMP_OUT (2 байти, int16) |
Формула:
|
1 2 |
°C = (raw / 340.0) + 36.53 |
Це температура самого чипа, не оточення. Зміни значущі переважно для калібрування датчика.
Послідовність ініціалізації (мінімальна)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// 1. Розбудити MPU6050 Wire.beginTransmission(0x68); Wire.write(0x6B); // PWR_MGMT_1 Wire.write(0x00); // не спати Wire.endTransmission(); // (опційно) 2. Перевірити WHO_AM_I Wire.beginTransmission(0x68); Wire.write(0x75); Wire.endTransmission(false); Wire.requestFrom(0x68, 1); uint8_t whoami = Wire.read(); // має бути 0x68 |
Читання акселерометра — повний код
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
const int MPU = 0x68; void readAccel(float* ax, float* ay, float* az) { Wire.beginTransmission(MPU); Wire.write(0x3B); // починаємо з ACCEL_XOUT_H Wire.endTransmission(false); // не відпускаємо шину Wire.requestFrom(MPU, 6, true); // просимо 6 байтів int16_t raw_x = (Wire.read() << 8) | Wire.read(); int16_t raw_y = (Wire.read() << 8) | Wire.read(); int16_t raw_z = (Wire.read() << 8) | Wire.read(); *ax = raw_x / 16384.0; // ±2g за замовчуванням *ay = raw_y / 16384.0; *az = raw_z / 16384.0; } |
Типові значення в спокої
При нерухомому датчику, рівно покладеному:
| Вісь | Очікуване значення (g) |
|---|---|
| X | ≈ 0 |
| Y | ≈ 0 |
| Z | ≈ 1.0 (земне тяжіння) |
Сума √(ax² + ay² + az²) має бути близько 1.0 — це постійний орієнтир, корисний для самоперевірки калібрування.
Підказки з власного досвіду
WHO_AM_I — перший крок діагностики. Якщо чип повертає не 0x68 (або не 0x69 для AD0=VCC) — далі читати марно. Спершу перевір живлення, GND, дроти SDA/SCL.
Регістри прокидаються один раз. Якщо змінив діапазон через ACCEL_CONFIG — він тримається до наступного reset або перезапису.
Внутрішня температура зростає при роботі. Якщо тренуєш модель на даних і не дав чипу прогрітись — реальні значення в нормальному режимі будуть трохи інакші. Дай йому хвилину постояти перед збором датасету.
Шум живлення = шум даних. MPU6050 чутливий до якості 3.3 В. Якщо живиш від «брудного» USB-хаба — на високих діапазонах побачиш дрейф навіть у спокої. Конденсатор 100 нФ на VCC поряд з чипом — і простіше, і чесніше.