Цифровий рівень на MPU6050: кути нахилу з акселерометра
Акселерометр у спокої вимірює лише гравітацію, а з її проєкцій на осі можна отримати кути нахилу. Рахуємо roll і pitch через atan2, виводимо їх на LCD і розбираємося, чому гіроскоп сам по собі «пливе».
Про проєкт
MPU6050 — дешевий модуль (GY-521) з 3-осьовим акселерометром і 3-осьовим гіроскопом. Зробимо з нього будівельний рівень: два кути нахилу, roll (вбік) і pitch (вперед-назад), на екрані LCD 1602.
Що знадобиться
- ESP32 DevKit
- Модуль MPU6050 (GY-521)
- LCD 1602 з I2C-перехідником
- Бібліотеки Adafruit MPU6050 (підтягне Adafruit Unified Sensor) і LiquidCrystal_I2C
Схема
Обидва модулі на одній шині I2C:
| Модуль | VCC | GND | SDA | SCL | Адреса |
|---|---|---|---|---|---|
| MPU6050 | 3V3 | GND | GPIO21 | GPIO22 | 0x68 (AD0 → GND) |
| LCD 1602 | 3V3 | GND | GPIO21 | GPIO22 | 0x27 |
Якщо потрібні два MPU6050 на одній шині, підключіть AD0 другого до VCC: адреса стане 0x69.
Звідки беруться кути
Нерухомий акселерометр вимірює вектор гравітації g ≈ 9.81 м/с². Коли модуль лежить рівно, уся сила припадає на вісь Z. Нахиляємо його, і частина переходить на X і Y. За співвідношенням проєкцій визначаємо кути:
- roll = atan2(ay, az)
- pitch = atan2(−ax, √(ay² + az²))
atan2 на відміну від atan враховує знаки обох аргументів і працює в усіх чотирьох квадрантах. RAD_TO_DEG переводить радіани в градуси.
Кут навколо вертикалі (yaw, «курс») так визначити не можна: гравітація від нього не залежить. Для курсу потрібен магнітометр.
Код
// Цифровий рівень: MPU6050 → кути roll/pitch → LCD 1602
#include <Adafruit_MPU6050.h>
#include <LiquidCrystal_I2C.h>
Adafruit_MPU6050 mpu;
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
lcd.init();
lcd.backlight();
if (!mpu.begin()) {
lcd.print("MPU6050 missing");
while (true) delay(1000);
}
mpu.setAccelerometerRange(MPU6050_RANGE_2_G); // найвища чутливість
}
void loop() {
sensors_event_t a, g, t;
mpu.getEvent(&a, &g, &t);
float ax = a.acceleration.x, ay = a.acceleration.y, az = a.acceleration.z;
float roll = atan2(ay, az) * RAD_TO_DEG;
float pitch = atan2(-ax, sqrt(ay * ay + az * az)) * RAD_TO_DEG;
char line[17];
snprintf(line, sizeof line, "Roll %6.1f", roll);
lcd.setCursor(0, 0);
lcd.print(line);
lcd.write(223); // символ градуса в шрифті HD44780
snprintf(line, sizeof line, "Pitch %6.1f", pitch);
lcd.setCursor(0, 1);
lcd.print(line);
lcd.write(223);
delay(100);
}
Акселерометр чи гіроскоп
- Акселерометр дає абсолютний кут, але шумить і «плаває» від будь-якого руху: струс сприймається як нахил.
- Гіроскоп вимірює швидкість обертання (°/с). Інтегруючи її, отримуємо кут, гладкий і швидкий, але з дрейфом: похибка накопичується, і за хвилину набігають градуси.
- Комплементарний фільтр поєднує обидва:
angle = 0.98 * (angle + gyro * dt) + 0.02 * accAngle. Для дронів і балансуючих роботів — наступний крок.
Що далі
Додайте звуковий сигнал, коли обидва кути в межах ±0.5°, і отримаєте повноцінний рівень для полиць. Або виведіть «бульбашку» на OLED замість цифр.