Модуль GY-521 на MPU6050: подключение и чтение углов наклона

Гироскоп и акселерометр на одной плате: адрес на шине I2C, библиотеки I2Cdev и MPU6050, пересчёт показаний в градусы и пример радиопульта.
Назначение модуля
GY-521 — небольшая плата с микросхемой MPU-6050, объединяющей трёхосевой гироскоп, трёхосевой акселерометр и термометр. В любительской робототехнике её используют, чтобы определять положение устройства в пространстве: совместная обработка данных акселерометра и гироскопа позволяет отслеживать движение тела в трёх измерениях. На плате уже установлена необходимая обвязка микросхемы, включая подтягивающие резисторы линий I2C, поэтому дополнительных деталей для подключения не требуется.

| Микросхема | MPU-6050 |
| Питание | 3,5–6 В |
| Ток потребления | 500 мкА |
| Диапазоны акселерометра | ±2, ±4, ±8, ±16 g |
| Диапазоны гироскопа | ±250, 500, 1000, 2000 °/с |
| Интерфейс | I2C |
| Адрес I2C | 0x68 |
Подключение и проверка адреса
С Arduino модуль связывается по шине I2C. Убедиться, что датчик виден контроллеру, проще всего скетчем-сканером: он на базе библиотеки Wire перебирает адреса от 0 до 127, пытается начать передачу по каждому и печатает в монитор порта таблицу откликнувшихся устройств. Для MPU6050 сканер показывает адрес 0x68.


Сырые показания акселерометра
Для работы с датчиком используются библиотеки I2Cdev и MPU6050. Минимальный скетч создаёт объект MPU6050, вызывает в setup метод initialize(), а в цикле каждые 20 мс запрашивает все шесть величин одной функцией getMotion6(&ax, &ay, &az, &gx, &gy, &gz) и отправляет в порт значение ускорения по оси X.
Смотреть результат удобнее не в виде чисел, а на графике — через пункт «Плоттер по последовательному соединению» в Arduino IDE. При наклоне датчика вокруг оси в одну и в другую сторону кривая плавно уходит вверх и вниз. АЦП датчика 16-разрядный, а библиотека, как указано в исходном описании, по умолчанию выставляет диапазон ±8 g из возможных ±2, 4, 8 и 16 g.

Пересчёт в угол наклона
Чтобы получить угол, сырое значение сначала переводят в единицы g: в примере оно делится на 4096, что соответствует одному g. Результат ограничивают интервалом от -1 до +1, после чего берут арккосинус и умножают на коэффициент 57,2957 для перехода от радиан к градусам. Для положительных значений угол считается как 90 минус полученная величина, для отрицательных — как та же величина от модуля минус 90. В плоттере при этом видна кривая угла, меняющаяся при поворотах датчика.
Пример: пульт управления платформой
На основе MPU6050 можно собрать пульт, который управляет двухколёсной тележкой наклонами руки. Для пульта нужны:
- Arduino Nano;
- макетная плата;
- модуль MPU6050;
- радиопередатчик FS1000A;
- провода.
Для самой платформы:
- Arduino Nano;
- двухколёсное шасси;
- драйвер моторов L298N;
- приёмник MX-RM-5V;
- блок аккумуляторов 18650;
- провода.
Передающая часть использует библиотеку RCSwitch, передатчик включается на выводе 2 вызовом mySwitch.enableTransmit(2). Скетч вычисляет углы наклона по осям X и Y описанным выше способом и отправляет посылку из трёх восьмибитных значений: стартовый байт B11111111, затем угол по X и угол по Y, с паузами 50 и 100 мс между ними.
Приёмная сторона запускает приёмник командой mySwitch.enableReceive(0) и ждёт стартовый байт. Следующие два значения поочерёдно относятся к первому и второму мотору. Модуль угла из диапазона 0–90 пересчитывается функцией map в скважность ШИМ 0–255, а знак определяет направление вращения. Для первого мотора заняты выводы 10 (ШИМ), 9 и 8, для второго — 5 (ШИМ), 7 и 6.
Если данных нет
При отсутствии показаний с MPU6050 в первую очередь проверяют правильность соединения модуля с платой Arduino; сканер шины I2C помогает быстро понять, отвечает ли датчик.