← До всіх проєктів
Сенсори Середній

Цифровий рівень на MPU6050: кути нахилу з акселерометра

Акселерометр у спокої вимірює лише гравітацію, а з її проєкцій на осі можна отримати кути нахилу. Рахуємо roll і pitch через atan2, виводимо їх на LCD і розбираємося, чому гіроскоп сам по собі «пливе».

Складність
Середній
Час
40 min
Категорія
Сенсори
Оновлено

Про проєкт

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 замість цифр.