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

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

Гироскоп и акселерометр на одной плате: адрес на шине I2C, библиотеки I2Cdev и MPU6050, пересчёт показаний в градусы и пример радиопульта.

Назначение модуля

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

Модуль GY-521 с микросхемой MPU6050
МикросхемаMPU-6050
Питание3,5–6 В
Ток потребления500 мкА
Диапазоны акселерометра±2, ±4, ±8, ±16 g
Диапазоны гироскопа±250, 500, 1000, 2000 °/с
ИнтерфейсI2C
Адрес I2C0x68

Подключение и проверка адреса

С Arduino модуль связывается по шине I2C. Убедиться, что датчик виден контроллеру, проще всего скетчем-сканером: он на базе библиотеки Wire перебирает адреса от 0 до 127, пытается начать передачу по каждому и печатает в монитор порта таблицу откликнувшихся устройств. Для MPU6050 сканер показывает адрес 0x68.

Схема подключения GY-521 к Arduino по I2C
Результат работы I2C-сканера: адрес 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.

График показаний акселерометра по оси X в плоттере Arduino IDE

Пересчёт в угол наклона

Чтобы получить угол, сырое значение сначала переводят в единицы 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 помогает быстро понять, отвечает ли датчик.

← Все статьи