Андрей Смирнов
Время чтения: ~17 мин.
Просмотров: 30

Применение Ардуино гироскопа на основе микросхемы mpu 6050

SKU080242h.JPG

  • Цена: $3

Датчики определения положения в пространстве широко используются в мобильных устройствах, а для самоделок чаще всего применяются в квадрокоптерах. Также, его можно применить в светящемся шлеме! Удобно, не правда ли? Наклонил голову вправо — загорелось правое «полушарие» =) влево — левое, согнул голову в шее — сзади на шлеме высветился стоп-сигнал! Вот только, думаю, моей шеи хватит минут на 5 таких упражнений, потом — коллдаун, в виде боли на неделю обеспечен. Итак, заказал — прислали, теперь нужно разобраться и продемонстрировать функционал для Вас, уважаемые читатели Муськи. Пришло с треком, не известно, почему, но в Киеве посылку держали неделю (или это глюки системы треккинга). Дошла чуть менее, чем за три недели. Упаковано в три слоя утеплителя — для амортизации. Сам модуль — внутри запаянного пакетика со штрих-кодом на наклейке:862224.jpg Размеры платы: 20×16мм. В комплекте два набора штыревых контактов: ровные и загнутые — удобно, не придется гнуть или ровнять.4f96db.jpg… Большие отверстия не металлизированы, как на картинке в магазине, поэтому, если Вы будите их прикручивать болтами к «минусу», эффекта не будет. Я заливаю их термоклеем, а он, образуя «шапочки», надёжно фиксирует плату. Отвертия контактов металлизированы отлично, паяются без проблем. Модуль GY-521 включает понижающий линейный стабилизатор для питания от 5В, красный светодиод питания и обвязку, обеспечивающую работу по протоколу I2C.СхемаВзята из статьи про такой же модуль — cxem.net/mc/mc324.php MPU-6050 снабжен акселерометром, гироскопом и термометром. Зачем нужен термометр — не понятно, вероятно, его было удобно разместить в этой микросхеме. Или, действительно, есть такие варианты применения, о которых я не знаю, где тебя вертят и греют нужно вертеться в пространстве и знать температуру =) Или, в процессе интенсивной работы с устройством, оно может нагреваться и нужно контролировать его температуру и нагрузку.

Характеристики:

— 16-битный АЦП, — напряжение питания 3-5В, — поддержка протокола «IIC» (может, I2C ?), — диапазон ускорений: ± 2 ± 4 ± 8 ± 16g, — диапазон «гиро»: ± 250 500 1000 2000 ° / s, — покрытие иммерсионным золотом вместо лужения, — ток при работе последнего примера составил 5.3 мА и 1.2 мА когда устройство не успело стартовать (питание на модуль было подано после выполнения setup() контроллером)

Подключение к Arduino

Для интерфейса I2C у Ардуино имеются контакты A4 (SDA) и A5 (SCL), да-а, это те, которые расположены чёрти-где (на одной плате у меня они были справа от контроллера, на другой с левого края). В коде нужно использовать библиотеку Wire, прочитать о ней можно туточки. Минимальная схема во Fritzing такая:… а значит у нас уже не 8 лишних штырьков, а целых двенадцать!

Тестирование

Термометр тестировать проще всего: залил скетч отсюда, открыл монитор порта, выставил скорость на 9600, — побежали такие строкиВследствие нагревания феном для волос, значение Tmp = взлетело до 80. Далее покрутили в пространстве платкой — другие показания тоже изменяются, но это не наглядно. Данные, выводимые вторым скетчем Более приятный глазу пример описан в этой статье. Там реализована трансляция положения предмета в реальном времени! Для повторения эксперимента, нужно скачать по ссылкам в конце той статьи: скетч для Ардуино — GY_521_send_serial (в atmega128 у меня залилось без проблем) и прогу для 3D-рендеринга ShowGY521Data. Последнюю нужно запускать в IDE Processing, статья была написана в 2013 году и для нормальной работы, качать лучше версию 1.5.1, в исходнике нужно подправить номер порта:short portIndex = 1; в строке 15 вместо 1 поставить порядковый номер COM-порта, но не номер из его имени (у меня, при подключении программатора, появляется один порт «COM15», я исправил на , если у Вас, допустим, есть порты «COM8» и «COM10», причем, последний соединён с Ардуино, то ничего исправлять не надо);myPort = new Serial(this, portName, 38400); в строке 42 поставить скорость, которая была в скетче для Ардуино — 19200. Запускаем программу…видим три объекта, моделирующих гироскоп, акселерометр и нечто «средне».При отклонении платы, объекты синхронно пляшут, акселерометр подёргивается реще

После определённого времени кручения платой, показания гироскопа сбиваются:это нормально и об этом написано в статье, упомянутой выше. Примечательно, что если нажать ресет и перезагрузить плату в произвольном положении, то реальное положение в пространстве будет показывать акселерометр, гироскоп же сориентироваться в изначальное положение:Суть этого вяления раскрыта в первом комментарии к этой статье от AndyBig. Думаю, можно будет реализовать с помощью этого модуля какую-нибудь «неваляшку», шлем обклеивать светодиодами как-то рука не поднимается.

Тестовая установка

Тентаклиевый монстр, о котором я писал ранее, был пересмотрен, урезан и сокращён (кстати, на этом фото заметно отличие в качестве металлизации отверстий обозреваемой платы и дешевой платы Ардуино):если отсоединить тентакли шлейф от креплений, то откроются два ряда контактов, у которых нужно «поотламывать половинки», — в результате получится разъем, удобно вставляющийся в отверстия макетной платы. Для пущей надёжности, нужно проклеить корпус, т.к. держаться на одних контактах конструкция не будет.всё ещё может напугать, но на самом деле бояться нечего:спаял с обратной стороны контакты, прозвонил их тестером — и можно подключать. Лично моя практика показывает, что лучше потратить пару секунд на предварительную проверку, чем ткнуть «не туда» и спалить девайс… Я так спалил Orange Pi PC =)猫Даташит на сенсор MPU-6050Описание регистров MPU-6050Неплохая статья Товар предоставлен для написания обзора магазином. Обзор опубликован в соответствии с п.18 Правил сайта.

Акселерометр — это прибор, позволяющий измерять ускорение тела под действием внешних сил. Подробно об устройстве этого датчика мы уже рассказывали на одном из уроков: Акселерометр: что это такое и как им определять наклон тела

На этот раз мы перейдем от теории к практике: подключим датчик к Ардуино, и напишем пару программ для работы с ним. Подключать будем модуль MPU6050 от RobotClass.

В основе этого модуля лежит микросхема MPU6050, в которой размещаются сразу два датчика: акселерометр и гироскоп. На плате уже имеется вся необходимая обвязка, а также преобразователь напряжения.

Характеристики модуля MPU6050 ROC:

  • напряжение питания: от 3,5 до 6 В;
  • потребляемый ток: 500 мкА;
  • ток в режиме пониженного потребления: 10 мкА при 1,25 Гц, 20 мкА при 5 Гц, 60 мкА при 20 Гц, 110 мкА при 40 Гц;
  • диапазон: ± 2, 4, 8, 16g;
  • разрядность АЦП: 16;
  • интерфейс: I2C (до 400 кГц).

На плате имеется 8 контактов:

  • VCC — положительный контакт питания;
  • GND — земля;
  • SDA — линия данных I2C;
  • SCL — линия синхроимпульсов I2C;
  • INT — настраиваемое прерывание;
  • AD0 — I2C адрес; по-умолчанию AD0 подтянут к земле, поэтому адрес устройства — 0x68; если соединить AD0 к контактом питания, то адрес изменится на 0x69;
  • XCL, XDA — дополнительный I2C интерфейс для подключения внешнего магнитометра.

Подключение MPU6050 к Ардуино

Соединим контакты датчика с Ардуино Уно согласно стандартной схеме для интерфейса I2C:

MPU6050 ROC GND VCC SDA SCL
Ардуино Уно GND +5V A4 A5

Принципиальная схема

Внешний вид макета

Программа для получения сырых данных с акселерометра MPU6050

Составим программу, которая будет каждые 20 миллисекунд получать данные из MPU6050 и выводить их в последовательный порт.

#include "I2Cdev.h" #include "MPU6050.h"  #define T_OUT 20  MPU6050 accel;  unsigned long int t_next;  void setup() {     Serial.begin(9600);     accel.initialize();     Serial.println(accel.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed"); }  void loop() {     long int t = millis();     if( t_next < t ){         int16_t ax_raw, ay_raw, az_raw, gx_raw, gy_raw, gz_raw;          t_next = t + T_OUT;         accel.getMotion6(&ax_raw, &ay_raw, &az_raw, &gx_raw, &gy_raw, &gz_raw);           Serial.println(ay_raw); // вывод в порт проекции ускорения на ось Y     } }

Для работы программы потребуются библиотеки: MPU6050 и I2Cdev, ссылки на которые можно найти в конце урока.

Загружаем программу на Ардуино и открываем окно графика. Поворачиваем датчик вокруг оси X на 90 градусов в одну сторону, потом на 90 в другую. Получится примерно такая картина.

На графике хорошо видно, что при наклоне оси Y вертикально, акселерометр выдает значения близкие к четырём тысячам. Откуда берется это число?

Точность измерения ускорения в MPU6050

Дело в том, что датчик MPU6050 позволяет настраивать точность измерений. Можно выбрать один из четырех классов точности: ±2G, 4G, 8G и 16G, где 1G — это одна земная гравитация.  Используемая нами библиотека по-умолчанию настраивает датчик на диапазон ±8G (прим. по ссылке внизу статьи библиотека по-умолчанию устанавливает ±2G).

С другой стороны, MPU6050 имеет 16 разрядный АЦП. 2 в степени 16 даст нам число 65 536. Поскольку датчик может измерять и отрицательное и положительное ускорение, то он будет выдавать нам числа от -32768 до +32768.

Сложив эти два факта вместе получаем, что при таких настройках 1G будет равен числу 4096 (ну а -1G равен числу -4096). Это вполне совпадает с наблюдаемыми на графике значениями!

Следующий шаг — преобразование этих странных чисел в привычные нам углы, измеряемые в градусах.

Программа для вычисления угла наклона акселерометра MPU6050

Добавим в предыдущую программу вычисление угла поворота датчика вокруг оси X:

#include "I2Cdev.h" #include "MPU6050.h"  #define TO_DEG 57.29577951308232087679815481410517033f #define T_OUT 20  MPU6050 accel;  float angle_ax; long int t_next;  float clamp(float v, float minv, float maxv){     if( v>maxv )         return maxv;     else if( v= 0){             angle_ax = 90 - TO_DEG*acos(ay);         } else {             angle_ax = TO_DEG*acos(-ay) - 90;         }           Serial.println(angle_ax); // вывод в порт угла поворота вокруг оси X     } }

Загружаем программу в Ардуино и снова пробуем вращать датчик. Теперь на графике отображается угол наклона в градусах!

Ну вот, мы получили уже что-то пригодное для дальнейшего использования. Видно, что датчик поворачивался сначала на 30 с лишним градусов в одну сторону, потом примерно на 60 в другую. Работает!

Заключение

На этом уроке мы получили с датчика MPU6050 сначала сырые данные, а потом и угол его наклона в градусах. Это большое достижение. Но впереди еще немного математики и еще более крутые результаты! Будем делать комплементарный фильтр, который позволит работать с датчиком даже в условиях вибрации и тряски.

Несколько идей/заданий:

  • Детектор стука, он же детектор попадания пули в мишень. Программа должна обнаружить всплеск показаний датчика по одной из осей и сигнализировать об этом, например, с помощью зуммера.
  • Кодовый замок, открывающийся по определенной последовательности стука. То же, что и в предыдущем задании, только нужно считать паузы между стуками и сверять их с эталонной последовательностью.
  • Детектор свободного падения. Если значения акселерометра по всем трем осям близки к нулю, значит тело находится в состоянии свободного падения.
  • Пульт управления роботом. Можно прикрепить датчик на перчатку и отслеживать наклоны ладони по двум осям. Передавать значения датчика через Bluetooth роботу.

Принципиальная схема датчика

Полезные ссылки

2+

Ардуино – популярнейшая система для одноимённых МК, позволяющая любому желающему, даже без специального образования, воплотить в жизнь проект, о котором он давно мечтал. Будь то автоматизированная теплица или простая система выключения света по хлопку в умном доме.

Но естественно, сам микроконтроллер не способен выполнять все функции, и для этого к нему необходимо покупать датчики, коих на рынке более нескольких десятков разновидностей. Об одном из таких, а именно мы рассмотрим гироскоп Ардуино, и пойдёт речь. Что это такое, в каких проектах его можно применить и как настроить опишем ниже.

А если вам хочется больше практики — посмотрите наши уроки: Подключаем гироскоп-акселерометр (MPU-6050) к плате Arduino или Гироскоп с помощью Arduino 101.

Назначение связки гироскоп и акселерометр

Для начала давайте разберёмся, зачем Arduino mpu 6050 (Gy-521) вообще нужен и что собой представляет гироскоп-акселерометр в целом. Такой датчик все мы видели в смартфонах, и там он выполняет следующие функции:

  1. Позволяет замерять шаги. Акселерометр способен отслеживать резкие движения устройства, а в зависимости от его настройки и чувствительности, считать некоторые из них за шаг.
  2. Измеряет поворот экрана. Здесь уже оба устройства работают в паре. Ведь когда вы поворачиваете смартфон набок, картинка должна изменить свою ориентацию для пользователя, и лишь с помощью гироскопа удаётся определить угол наклона, под которым ПО это должно будет сделать.
  3. Компас, карты и навигация. Акселерометр с гироскопом позволяют определить ориентацию устройства в пространстве, что необходимо в различных приложениях для мобильной навигации.

Вот и выходит, что данный датчик подойдёт для тех проектов, в которых вам необходимо измерить ориентацию или движения прибора в пространстве, без точных данных о его местоположении. Это может быть, как самодельная линейка со встроенным уровнем, чтобы пользователь мог определить, насколько ровно стоит та или иная мебель, так и устройство для кровати, встроенной в стену, включающее свет, когда она выдвигается.

Но применить модуль можно и с большей выдумкой, например, для измерения количества оборотов в секунду и регуляции мощности охладительной системы или автоматизации различных процессов.

Всё зависит исключительно от вашей выдумки и конкретного проекта.

Смотрите по теме: Подключаем гироскоп-акселерометр (MPU-6050) к плате Arduino

Чаще всего гироскоп для Ардуино применяется в системах автоматизации под так называемые «смартхаусы» (умные дома — прим. ред.), являясь своеобразным переключателем. Передавая определённые данные в МК, который затем отправляет их по блютуз-модулю к другому устройству, он может управлять всей техникой в доме.

Ещё один простой способ применения – использование вместо датчика движения на дверях, для включения света и кондиционирования, когда вы возвращаетесь домой.

Комплектующие

Создаётся данный датчик или МК, в зависимости от того, что вы собрались приобретать, из компонентов ATmega328.

Распиновка модуля Arduino MPU 6050

Так, в нём имеются:

  1. 14 штук различных пинов и цифровых выходов, половина из которых являются ШИМ-выходами.
  2. Специальные кварцевые резонаторы до 16 МГц мощностью.
  3. Встроенный вход под usb-кабель, который позволит вам сэкономить не только время, но и деньги, которые вы могли бы потратить на покупку адаптера.
  4. Контакты и распиновка для стандартного питания с нулем, фазой и заземлением.
  5. Контакты для сброса до заводских настроек, при которых весь машинный код и данные будут стёрты. Это полезно в том случае, если вы напортачили с программой и модуль превратился в бесполезную груду железа, и просто как экономия времени, если необходимо сменить прошивку.
  6. ICSP контакт, который необходим для того, чтобы запрограммировать машинный код, который будет находиться внутри системы.

Все эти компоненты и составляют Arduino гироскоп, позволяя ему выполнять свои базовые функции. Но как же запрограммировать систему, если вы до этого не имели опыта работа с данными МК?

Сборка

Здесь всё зависит от используемого вами интерфейса, например, для I2C от Ардуино пригодятся контакты: A4, A5, которые являются SDA и SCL входами соответственно.

Для нормального функционирования всей этой системы необходимо будет использовать wire библиотеку в коде.

Gy-521 (mpu6050) Arduino (Uno)
VCC 3.3 V
GND GND
SCL A5
SDA A4

Также будьте готовы к тому, что распиновка может оказаться не самой удачной, поэтому не стоит делать корпус для устройства впритык, пока вы не подключите и не увидите реальные размеры вашего проекта.

Питание модуля строго 3.3В!

Программы

Без программы модуль будет не более чем грудой железа, которая не выполнит ни одной функции. Базовые библиотеки для взаимодействия с другими МК можно найти на официальном сайте или в интернете, но, помимо них, вам потребуется вспомогательный код. С его помощью можно настроить взаимодействие между акселерометром и тем же блютуз модулем, без которого, в большинстве проектов, он станет бесполезен.

Мы воспользуемся готовой библиотекой для Arduino MPU 6050, которую написал Джефф Роуберг.

Скачать библиотеку MPU6050

В целом, многие поступают и другим путем, правда далеко не все умеют программировать на С++, поэтому перед пользователем, который хочет написать программу для работы с гироскопом, открывается два пути:

  1. Найти уже готовый шаблон или библиотеку. Для этого потребуется всего пара секунд и подключение к интернету, но не стоит забывать, что готовые решения пишутся, зачастую, столь же неопытными инженерами. Поэтому, по возможности, проверяйте, насколько качественный код вы скачиваете. Смотрите отзывы о библиотеке, если есть такая возможность, и старайтесь скачивать их на зарубежных форумах. Там и выбор будет больше, и куда выше вероятность найти действительно качественную библиотеку.
  2. Написать функции и методы для работы системы своими силами. Этот вариант подойдёт лишь тем, кто ранее имел дело с языком С++ и понимает все нюансы работы с Ардуино. Все необходимые вспомогательные библиотеки можно скачать в интернете, а всё остальное вы можете подогнать под свои нужды. Такой способ идеально подходит для тех, кто хочет реализовать собственный проект, не имеющий аналогов. Ведь в таком случае найти заготовленный код под него будет крайне сложно, даже если быть готовым править большую его часть.

Вернемся к нашей библиотеке. После того как вы скачали библиотеку гироскопа вам нужно сделать следующее.

Нужно распаковать/извлечь эту библиотеку, взять папку с именем «MPU6050» и поместить ее в папку «library» в Arduino. Для этого перейдите в место, где вы установили Arduino (Arduino -> libraries) и вставьте свою папку в папку библиотек. Возможно, вам также придется сделать то же самое, чтобы установить библиотеку I2Cdev, если у вас еще нет ее на вашем Ардуино. Для её установки выполните ту же процедуру, что и выше. Вы можете скачать I2Cdev на нашем сайте по этой ссылке.

Если вы всё сделали правильно, при открытии IDE Arduino вы можете увидеть «MPU6050» в:

Файл -> Примеры.

Затем откройте пример программы из меню:

Файл -> Примеры -> MPU6050 -> Примеры -> MPU6050_DMP6.

Затем вы должны загрузить этот код в свой Ардуино. После загрузки кода откройте последовательный монитор и установите скорость передачи в бодах как 115200. Затем проверьте, видите ли вы что-то вроде «Инициализация устройств I2C …» («Initializing I2C devices …») на последовательном мониторе.

Если вы этого не сделаете, просто нажмите кнопку сброса. Теперь вы увидите строку с надписью «Отправить символы, чтобы начать программирование и демо DMP» («Send any character to begin DMP programming and demo»). Просто введите любой символ на последовательном мониторе и отправьте его, и вы должны начать видеть значения поступающие с MPU 6050.

Также можно, например, воспользоваться скетчем ниже, который пересчитывает координату X и Y и выводит в консоль (монитор последовательного порта):

#include   #include "Kalman.h"  Kalman kalmanX;  Kalman kalmanY;  uint8_t IMUAddress = 0x68;  /* IMU Data */  int16_t accX;  int16_t accY;  int16_t accZ;  int16_t tempRaw;  int16_t gyroX;  int16_t gyroY;  int16_t gyroZ;  double accXangle; // Angle calculate using the accelerometer  double accYangle;  double temp;  double gyroXangle = 180; // Angle calculate using the gyro  double gyroYangle = 180;  double compAngleX = 180; // Calculate the angle using a Kalman filter  double compAngleY = 180;  double kalAngleX; // Calculate the angle using a Kalman filter  double kalAngleY;  uint32_t timer;  void setup() {    Wire.begin();    Serial.begin(9600);    i2cWrite(0x6B,0x00); // Disable sleep mode          kalmanX.setAngle(180); // Set starting angle    kalmanY.setAngle(180);    timer = micros();  }  void loop() {    /* Update all the values */    uint8_t* data = i2cRead(0x3B,14);    accX = ((data[0] << 8) | data[1]);    accY = ((data[2] << 8) | data[3]);    accZ = ((data[4] << 8) | data[5]);    tempRaw = ((data[6] << 8) | data[7]);    gyroX = ((data[8] << 8) | data[9]);    gyroY = ((data[10] << 8) | data[11]);    gyroZ = ((data[12] << 8) | data[13]);    /* Calculate the angls based on the different sensors and algorithm */    accYangle = (atan2(accX,accZ)+PI)*RAD_TO_DEG;    accXangle = (atan2(accY,accZ)+PI)*RAD_TO_DEG;      double gyroXrate = (double)gyroX/131.0;    double gyroYrate = -((double)gyroY/131.0);    gyroXangle += kalmanX.getRate()*((double)(micros()-timer)/1000000); // Calculate gyro angle using the unbiased rate    gyroYangle += kalmanY.getRate()*((double)(micros()-timer)/1000000);    kalAngleX = kalmanX.getAngle(accXangle, gyroXrate, (double)(micros()-timer)/1000000); // Calculate the angle using a Kalman filter    kalAngleY = kalmanY.getAngle(accYangle, gyroYrate, (double)(micros()-timer)/1000000);    timer = micros();  Serial.println();      Serial.print("X:");      Serial.print(kalAngleX,0);      Serial.print(" ");      Serial.print("Y:");      Serial.print(kalAngleY,0);      Serial.println(" ");    // The accelerometer's maximum samples rate is 1kHz  }  void i2cWrite(uint8_t registerAddress, uint8_t data){    Wire.beginTransmission(IMUAddress);    Wire.write(registerAddress);    Wire.write(data);    Wire.endTransmission(); // Send stop  }  uint8_t* i2cRead(uint8_t registerAddress, uint8_t nbytes) {    uint8_t data[nbytes];    Wire.beginTransmission(IMUAddress);    Wire.write(registerAddress);    Wire.endTransmission(false); // Don't release the bus    Wire.requestFrom(IMUAddress, nbytes); // Send a repeated start and then release the bus after reading    for(uint8_t i = 0; i < nbytes; i++)      data [i]= Wire.read();    return data;  }

Когда X и Y равны 180 — гироскоп в горизонтальной плоскости:

Вот вы определились с выбором и уже написали всё необходимое ПО, пришла пора его протестировать. Для этого, естественно, необходимо собрать всё вместе.

Наладка

Далее наступает самый ответственный этап – отладка программного кода. Здесь вам необходимо подключить питание к прибору, а сам прибор – к компьютеру, чтобы следить за строками в консоли. Прогоните несколько базовых функций и посмотрите, не будет ли ошибок или багов. Если они возникают, то воспользуйтесь любым удобным методом дебагинга.

Самый простой вариант – использовать для ввода переменные, которые вычисляются рандомным образом, и смотреть, как код будет вести себя в различных ситуациях.

Тестирование

После отладки необходимо провести тестирование. В чём разница? При тестировании вы точно знаете, что программный код работает без лагов и багов, но вам необходимо убедиться, что в нём нет логических ошибок.

С акселерометром и гироскопом проще всего использовать программы 3Д рендеринга показаний, вроде ShowGY521Data, которые позволят в реальном времени увидеть, как железо позиционируется в пространстве. В случае неисправностей всегда можно подправить нулевой уровень и уменьшить чувствительность акселерометра, который также влияет на конечную модель отображения устройства.

Используемые источники:

  • https://mysku.ru/blog/china-stores/40178.html
  • https://robotclass.ru/tutorials/arduino-accelerometer-mpu6050/
  • https://arduinoplus.ru/arduino-giroskop/

Рейтинг автора
5
Подборку подготовил
Максим Уваров
Наш эксперт
Написано статей
171
Ссылка на основную публикацию
Похожие публикации