Шесть осей движения: ускорение и угловая скорость по X, Y, Z. Для балансирующих роботов, измерения наклона и шагомеров.
Как работает
MPU6050 объединяет трёхосевой акселерометр (ускорение и направление силы тяжести) и трёхосевой гироскоп (скорость поворота). Подключается по I2C, адрес 0x68, а если вывод AD0 подтянуть к питанию — 0x69.
Наклон считают по акселерометру: atan2(ay, az). Он точен в покое, но шумит при движении. Гироскоп наоборот: быстрый, но интеграл его показаний «уплывает». Поэтому их объединяют — комплементарным фильтром или встроенным процессором движения (DMP).
Выводы
Вывод
Назначение
INT
выход прерывания «данные готовы» или «движение»; для простого чтения не нужен
#include <Adafruit_MPU6050.h>
Adafruit_MPU6050 mpu;
void setup() {
Serial.begin(115200);
delay(200);
// begin() не только проверяет датчик, но и будит его. Скетч,
// написанный без библиотеки и забывший про регистр питания,
// получит ровно нули — и на столе, и здесь.
if (!mpu.begin()) {
Serial.println("MPU6050 не отвечает: проверьте адрес и провода");
while (true) delay(1000);
}
mpu.setAccelerometerRange(MPU6050_RANGE_2_G);
mpu.setGyroRange(MPU6050_RANGE_250_DEG);
}
void loop() {
sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);
// Ускорение библиотека отдаёт в метрах на секунду в квадрате, а не в
// единицах силы тяжести: делите на 9,81, если привычнее в g.
Serial.printf("a %.2f %.2f %.2f м/с2 w %.2f %.2f %.2f рад/с %.1f C\n",
a.acceleration.x, a.acceleration.y, a.acceleration.z,
g.gyro.x, g.gyro.y, g.gyro.z, temp.temperature);
delay(500);
}
В железе
Шина I2C: ESP32 — SDA GPIO21, SCL GPIO22; Arduino Uno — A4 и A5. Модуль крепят жёстко: вибрация от крепления на проводах — это тоже «ускорение».
Частые ошибки
Конфликт адресов с часами DS3231 (тоже 0x68) — оба модуля отвечают одновременно. Переключите MPU6050 на 0x69.
Угол по гироскопу, проинтегрированный без коррекции, уплывает на градусы в минуту. Нужен фильтр.
Нет калибровки: у каждого экземпляра свои смещения нуля. Снимите показания в покое и вычитайте.
Датчик спит после включения — библиотека будит его в begin(); при работе через Wire руками это надо сделать самому.