MPU6050: подключение акселерометра и гироскопа к Arduino
MPU6050 это два датчика в одном корпусе: трёхосевой акселерометр и трёхосевой гироскоп на шине I2C. Типовой модуль называется GY-521 и стоит дешевле бутерброда. Углы наклона выводятся в монитор порта парой строк, но первый вечер новички обычно теряют на «данные скачут» и «угол уплывает». Обе проблемы лечатся, ниже показано чем.
Ниже схема, код с углами и порогом наклона, разница между акселерометром и гироскопом без формул, калибровка и честный разбор дрейфа. Разбор с фильтром в уроке MPU6050: определение наклона, платку можно наклонять мышкой в симуляторе.
Отдельные разделы ниже отвечают на вопросы, которые возникают после первых экспериментов: почему угол прыгает на 5–10 градусов, что делать с дрейфом гироскопа на практике, какие задачи датчику по силам, а какие лучше решать другим способом, и как проверить модуль по семи шагам.
Схема: GY-521 к Arduino
| Вывод GY-521 | Arduino Uno | Зачем |
|---|---|---|
| VCC | 5 В | На модуле стабилизатор до 3.3 В |
| GND | GND | Земля |
| SDA | A4 | Данные I2C |
| SCL | A5 | Тактирование I2C |
| AD0 | Не подключен | Адрес 0x68; при замыкании на VCC адрес 0x69 |
Кристалл питается от 3,3 В, но на модуле стоит стабилизатор, поэтому 5 В с платы это штатное питание. Адрес на шине 0x68, а при замыкании AD0 на VCC он становится 0x69: так к одной шине подключают два датчика. Линии SDA и SCL на модуле подтянуты резисторами к 3,3 В, с Uno это работает без переделок. На ESP32 тоже всё спокойно, потому что логика там как раз 3,3 В, и подтяжки получаются родными.
Отдельно стоит сказать, что модуль называется GY-521, а чип внутри MPU6050, и это разные вещи в разных магазинах. GY-521 это плата с чипом, стабилизатором и подтяжками, то есть то, что нужно новичку. Сам чип продаётся и отдельно, и впаивать его на плату без опыта мы не советуем. Ещё одно: у GY-521 есть выводы XDA и XCL, они нужны только для подключения внешней памяти EEPROM, в обычных проектах их не трогают.
Код: угол наклона с порогом
#include <Wire.h>MPU6050 mpu; void setup() { Serial.begin(9600); mpu.begin(); pinMode(13, OUTPUT);} void loop() { float x = mpu.getAngleX(); // наклон вокруг X, градусы float y = mpu.getAngleY(); Serial.print("x="); Serial.print(x); Serial.print(" y="); Serial.println(y); if (x > 30 || x < -30 || y > 30 || y < -30) { digitalWrite(13, HIGH); // перешли порог в 30 градусов } else { digitalWrite(13, LOW); } delay(100);}getAngleX и getAngleY возвращают углы в градусах в диапазоне −90…+90, и для сигнализации наклона, уровня полки или пульта-рукоятки этого хватает. Сырые значения читаются через readAcceleration(): вектор в g, где у датчика на столе az около 1, а в целочисленных единицах 1 g это 16384 при базовом диапазоне ±2g. Порог подбирается под задачу: 10–15° ловят сдвиг предмета, 30–45° опрокидывание, 60–90° различают «лежит на боку». И ещё одно: getAngleX внутри библиотеки считает угол через вектор гравитации, то есть по акселерометру, и поэтому на тряске он дёргается.
Акселерометр и гироскоп: кто за что отвечает
| Свойство | Акселерометр | Гироскоп |
|---|---|---|
| Что меряет | Ускорение и наклон к земле | Скорость вращения, °/с |
| Угол из данных | Да, по вектору гравитации | Только интегрированием скорости |
| Стабильность | Не уплывает, но шумит от вибраций | Чистый сигнал, но дрейфует |
| Реакция на тряску | Врёт при ударах | Отрабатывает честно |
| Типовая роль | Статический наклон, детектор падения | Быстрые повороты, роботы, дроны |
Отсюда классика: акселерометр отвечает на вопрос «куда наклонено сейчас», гироскоп на вопрос «как быстро вращается». Каждый по отдельности врёт: первый на вибрациях, второй дрейфом. Поэтому серьёзные угломеры смешивают оба показания комплементарным фильтром, примерно 98% гироскопа и 2% акселерометра за итерацию. Как это собирается, в уроке угол наклона с фильтром, а первое знакомство с сырыми осями в уроке акселерометр и гироскоп за один сеанс.
Калибровка и дрейф
У гироскопа есть смещение нуля: в полном покое он показывает не 0, а доли градуса в секунду, и паспорт допускает до ±20°/с между экземплярами. Интегрирование превращает это в градусы уплывания. Лечение это калибровка на старте: датчик неподвижен, усредняем 300–500 отсчётов и вычитаем оффсеты из каждого чтения. Акселерометр калибруется иначе: в шести ориентациях (дно, крышка, каждый бок) снимают минимум и максимум по осям и считают центр диапазона.
- Сигнализация наклона: открылась дверца, упал почтовый ящик, съехала камера
- Уровень для полки или штатива с выводом углов на OLED-экран
- Пульт-рукоятка: наклон руки ведёт робота или машинку
- Счётчик шагов: акселерометр ловит пики ускорения при каждом шаге
Тупик: угол прыгает на несколько градусов
Самый частый вопрос по этому датчику. Поставили на стол, положили плату, запустили скетч, а в мониторе порта угол гуляет на 5–10 градусов сам по себе. Мы сначала решили, что виноват шум, и усредняли значения, но картина не менялась: прыжки оставались ровно на тех же уровнях.
Дело оказалось в том, что плата лежала на столе рядом с работающим компьютером и источником питания, и модуль ловил вибрации от вентилятора и от нагрева. Акселерометр такие микровибрации читает как изменение наклона, и это ожидаемое поведение. Мы отодвинули модуль на подставку подальше от источников тепла, положили под него мягкую подкладку и всё встало на место. Второй источник прыжков это собственная калибровка: если датчик не откалиброван, у него есть постоянная ошибка смещения, и она гуляет вместе с температурой кристалла.
Личный опыт: где MPU6050 оказался полезен
Мы взяли датчик для датчика падения, который должен был включать сирену, если машинка перевернулась. На столе всё работало идеально, а вот на неровной поверхности срабатывания оказались слишком частыми. Выяснилось, что причина в пороге: 30 градусов это очень чувствительно для машины с мягкой подвеской, и при езде по неровностям наклон меняется сильнее, чем кажется.
Мы усложнили логику: срабатывание происходило не по мгновенному углу, а по условию «угол больше порога и держится дольше секунды». После этого ложных срабатываний почти не осталось, а настоящее переворачивание ловилось уверенно. Второе, что мы поменяли, это место установки: датчик переехал на центр платы, подальше от колёс и моторов, потому что вибрации от моторов давали шум в акселерометре. Отдельное наблюдение про дрейф: на столе гироскоп за час покоя заметно полз, и мы вывели его из показаний, оставив только акселерометр для статических углов.
Авторская позиция: какой датчик наклона взять
Мы советуем начинать именно с MPU6050, а не с более дорогих модулей. Он дешёвый, на рынке продаётся повсеместно, библиотека под него есть в менеджере, и для учебных задач его точности хватает с запасом. Большинство примеров в интернете написаны именно под него, и код из уроков не придётся переписывать.
Но если задача это «поворот прибора в пространстве» или «угол робота в динамике», мы смотрим в сторону MPU6500 или ICM-42688: у них лучше шумовые характеристики и заметно меньше дрейф гироскопа, а фильтр Madgwick с ними работает заметно ровнее. Второе правило касается задачи: если нужно просто понять, что устройство перевернулось, хватит акселерометра без фильтра, и такой проект укладывается в двадцать строк кода. Если нужно вести угол в движении, придётся разбираться с фильтрами, и это отдельная тема со своей математикой.