Ардуино гироскоп: варианты подключения, библиотеки, код

Вопросы и ответы

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

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

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

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

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

Все зависит исключительно от вашего изобретения и конкретного проекта.

Очень часто гироскоп Arduino используется в системах автоматизации для так называемых «умных домов», являясь своеобразным переключателем. Посредством передачи определенных данных на МК, который затем отправляет их через модуль Bluetooth на другое устройство, он может управлять всей бытовой техникой в ​​доме.

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

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

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

Следовательно, он содержит:

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

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

Сборка

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

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

Блок питания модуля строго 3,3 В!

Программы

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

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

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

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

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

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

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

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

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

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

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

Если нет, просто нажмите кнопку сброса. Теперь вы увидите строку с надписью «Отправить любого персонажа, чтобы начать программирование и демонстрацию DMP». Просто введите любой символ на последовательном мониторе и отправьте его, и вы должны начать видеть значения, поступающие с MPU 6050.

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

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

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

Скетч для Arduino, считывающий идентификационные регистры HMC5883L

Как происходит обмен с магнитным датчиком HMC5883L? Мы открываем паспорт датчика HMC5883L и обнаруживаем, что адрес устройства — 0x1E и доступны следующие регистры:

Журналы цифрового компаса HMC5883L
Журналы цифрового компаса HMC5883L

Попробуем для первого знакомства прочитать регистры идентификации 10 (0xA), 11 (0xB) и 12 (0xC) устройства.

Открыв монитор последовательного порта, мы увидим:

А = 48 В = 34 С = 33

Сигнал, полученный логическим анализатором, будет следующим:

Временная диаграмма обмена I2C с цифровым компасом HMC5883L
Временная диаграмма обмена I2C с цифровым компасом HMC5883L

Что это значит? Первый байт — это адрес I2C, с которым мы (ведущее устройство, Arduino) устанавливаем связь (старший 7 бит 0x1E) и режим записи (младший бит — 0x0); число 0x3C. Второй байт — это номер 0xA, который мы записали по адресу 0x1E, и бит подтверждения от датчика HMC5883L, который является подчиненным. Это номер регистра, с которого мы начнем считывать данные. На этом завершается первая сделка. Следующий начинается. Третий байт — это запрос чтения от ведомого устройства (7 старших битов — это адрес 0x1E, восьмой бит — это операция чтения 0x1; результирующее число — 0x3D). Последние 3 байта со значениями 0x48, 0x34 и 0x33 являются ответом ведомого устройства HMC5883L из регистров 0xA, 0xB и 0xC соответственно.

Журналы цифрового компаса HMC5883L автоматически перемещаются во время непрерывного чтения. Те не нужно (но и не запрещено) каждый раз указывать случай. Например, если бы вместо 0xA мы написали 0x3 и прочитали 10 раз, мы получили бы значения в 10 регистрах, начиная с 3-го по 12-й.

А что это за три числа — 0x48, 0x34, 0x33? Все еще используя паспорт цифрового компаса HMC5883L, мы увидим, что это значения по умолчанию для трех регистров идентификации:

Регистры идентификатора цифрового компаса HMC5883L
Регистры идентификатора цифрового компаса HMC5883L

Наладка

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

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

Подключение IMU 10DOF L3G4200D+ADXL345+HMC5883L+BMP085 – Популярная робототехника


10-DOF означает, что этот IMU может построить 10 параметров, которые определяют его положение в пространстве.

В список этих параметров входят:

  • проекция ускорения на три оси x, y, z (акселерометр ADXL345);
  • скорость вращения вокруг трех осей x, y, z (гироскоп L3G4200D);
  • проекции магнитного поля на три оси x, y, z (компас HMC5883L);
  • атмосферное давление (барометр BMP085).

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

Все датчики на плате соединены шиной I2C. Благодаря этому устройство легко подключается ко всем распространенным платформам, включая Arduino, mbed и TI LaunchPad. Кроме того, этот вариант подключения освобождает аналоговые входы микроконтроллера, количество которых ограничено.

Плата IMU имеет 11 контактов:

  • M_DRDY — сигнал готовности компаса HMC5883L;
  • G_INT1,2 — программируемые прерывания гироскопа L3G4200D;
  • A_INT1,2 — программируемые прерывания для акселерометра ADXL345;
  • P_EOC — конец измерения температуры или давления в BMP085;
  • P_XCLR — восстановить все регистры BMP085;
  • SCL, SDA — шина I2C;
  • VCC — питание + 5В, + 3,3В;
  • GND — земля.

Устройство необходимо только подключить к каналам питания и шины I2C. Как обычно, эксперимент по анимации устройства проводился с помощью mbed. Схема подключения представлена ​​ниже.

Как видно на схеме, линии I2C «подтянуты» к питающему напряжению с сопротивлением 2,2 кОм (рекомендуется 2,2-10 кОм). Есть подозрение, что на плате IMU уже установлены соответствующие резисторы, обязательно проверю эту гипотезу в следующий раз.

Что касается блока питания, то я подключил IMU к + 3,3В, хотя согласно паспорту можно использовать + 5В.

В связи с тем, что указанный IMU содержит достаточно распространенные модели датчиков, найти соответствующие библиотеки для mbed не составило труда. Я уверен, что для Arduino ситуация будет такой же.

Единственные проблемы возникли при подключении гироскопа. Здесь следует помнить, что адреса устройств I2C на mbed сдвинуты на один бит влево по сравнению с адресами для Arduino.

Например, если Arduino использует адреса 0x68 или 0x69 для связи с гироскопом L3G4200D, при работе с mbed используйте 0xD1 или 0xD2 соответственно.

Адрес 0xD2 был установлен в коде библиотеки для этого гироскопа, и я подумал, что попробую 0xD1 только после сканирования всей шины.

Ниже приведен снимок экрана с выходными данными тестируемого IMU в приложении TeraTerm. Как видите, температура воздуха в моей квартире почти 28 градусов по Цельсию. У меня нет другого градусника, но, учитывая постоянное ворчание гостей, я склонен верить этим показаниям.

Атмосферное давление составляет примерно 98 260 Паскалей, что соответствует 737 мм рт. По данным об атмосферном давлении в городе полученное значение примерно соответствует действительности.

Теперь что касается высоты над уровнем моря, которая рассчитывается по показаниям градусника и барометра по известным формулам (формулы есть в Google и в даташите датчика).

Учитывая холмистый рельеф города и тот факт, что измерения проводились на 16 этаже, полученное значение 258 метров выглядит вполне правдоподобным.

Меня вполне устраивает этот относительно дешевый китайский IMU (21 доллар на ebay). Справедливости ради стоит отметить, что только сама плата и обвязка китайские.

Сами датчики являются продуктом очень известных компаний, таких как Bosch, Pololu, Analog Devices и Honeywell.

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

В ближайшем будущем именно этот IMU заменит аналоговый гироскоп и акселерометр, которые сейчас установлены на моем квадрокоптере.

GY-521 – модуль с гироскопом, акселерометром и термометром MPU-6050 для Ардуино

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

Также его можно использовать в ярком шлеме! Удобно, правда? Наклонил голову вправо — загорелась правая «полусфера» =) влево — влево, голову за голову засунул — на задней части шлема загорелся стоп-сигнал! Но, думаю, на 5 минут таких упражнений шеи хватит, значит — усиление предусмотрено, в виде боли на неделю.

Итак, разобрано — отправлено, теперь вам нужно разобраться и доказать вам функциональность, уважаемые читатели Muska. Приехала с треком, неизвестно зачем, но в Киеве посылку продержали неделю (или речь идет о дефектах треккинг-системы). Я получил его чуть менее чем за три недели. Упакован в три слоя утеплителя — для амортизации.

Сама форма находится внутри запечатанного конверта со штрих-кодом на наклейке: Размер карты: 20х16мм. В комплекте два набора штыревых контактов: прямые и изогнутые — удобно, не надо гнуть и выравнивать.

Большие отверстия не металлизированы, как на фото в магазине, поэтому если их хотя бы прикрутить, эффекта не будет. Заливаю их горячим клеем и он, образуя «шляпки», надежно фиксирует доску.
Контактные отверстия идеально металлизированы, без проблем поддаются пайке. Модуль GY-521 включает понижающий стабилизатор питания 5 В, красный светодиодный индикатор питания и проводку для работы по I2C.

MPU-6050 оснащен акселерометром, гироскопом и термометром. Зачем нужен градусник — непонятно, наверное, удобно было разместить его в этой микросхеме.

Или, действительно, есть приложения, которые я не знаю, где тебя крутят и греют, надо в космосе вертеться и знать температуру =) Или в процессе интенсивной работы с устройством может перегреться и ты нужно контролировать его температуру и нагрузку.

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

2 мА, когда устройство не успело загрузиться (питание было подано на модуль после настройки (), выполненной контроллером) Для интерфейса I2C у Arduino есть контакты A4 (SDA) и A5 (SCL), да, это те, что нашли в аду (на одной плате они были у меня справа от контроллера, на другой — с левого края).

В коде нужно использовать библиотеку Wire, почитать можно в хитростях. Минимальная планировка во Фритцинге следующая:
. это означает, что у нас больше не 8 контактов, а двенадцать! Термометр тестировать проще всего: скетч загрузил отсюда, открыл дверной монитор, выставил скорость 9600, —

В результате нагрева феном значение Tmp = выросло до 80. Итак, мы повернули носовой платок в пространстве — другие показания тоже меняются, но это непонятно.

Когда карта отклоняется, объекты танцуют синхронно, акселерометр срабатывает быстрее

Через определенное время вращения карты теряются показания гироскопа — это нормально и описано в упомянутой выше статье.

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

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

Раскидистый монстр, о котором я писал ранее, был переработан, вырезан и уменьшен (кстати, на этом фото заметна разница в качестве металлизации отверстий наблюдаемой платы и дешевой платы Arduino):

если отсоединить щупальца от опор, откроются два ряда контактов, которые необходимо «разорвать»: в результате получится разъем, который удобно вставить в отверстия макета. Для большей надежности необходимо приклеить корпус, ведь некоторые контакты конструкция не будет держать.

это все равно может быть страшно, но на самом деле бояться нечего:
паял контакты сзади, тестером поиграл и можно подключать. Лично моя практика показывает, что лучше потратить пару секунд на предварительную проверку, чем ударить «не туда» и сжечь устройство… Я так сжег Orange Pi PC =)

Подключение цифрового компаса HMC5883L к Arduino

Схема подключения магнитного датчика HMC5883L к Arduino представлена ​​на рисунке. Он очень компактен и прост: двухпроводный интерфейс IIC хорош тем, что требует небольшого количества подключений.

Схема подключения цифрового компаса HMC5883L к Arduino
Схема подключения цифрового компаса HMC5883L к Arduino

Можно использовать макет. Должно получиться так, как на фото. У меня также есть логический анализатор, подключенный к шинам SCL и SDA, чтобы контролировать обмен информацией.

Arduino и MPU6050 для определения угла наклона

Приведенный ниже файл будет работать с цифровыми датчиками ускорения MPU6050, которые подключены к плате Arduino по протоколу I2C по адресу 0x68.

Производительность тестировалась на платах Arduino Uno и Arduino Mega. Перед добавлением gyro_Accel.h для этого файла заголовка требуется файл Wire.h”.

Кроме того, перед вызовом встроенных функций шину I2C необходимо инициализировать с помощью команды Wire.begin();.

Программу Arduino с заголовочными файлами и файлами примеров можно найти на Github

Журналы версий:

Версия 0.1 beta (Дата: 2014-06-22): сам заголовочный файл для калибровки и чтения данных с датчика MPU6050 по протоколу i2c и пример использования заголовочного файла для расчета угла.

Версия 0.2, бета (Дата: 2014-10-08): Исправлены ошибки в файле примера. «Accel_x_sired» и «Accel_y_sired» теперь возвращают правильные значения углов.

Глобальные переменные

Этот файл заголовка включает следующие глобальные переменные:

  • int Accel_x_OC — Содержит измерения положения акселерометра относительно оси x во время калибровки
  • int Accel_y_OC — Содержит измерения положения акселерометра относительно оси Y во время калибровки
  • int Accel_z_OC — Содержит измерения положения акселерометра относительно оси Z во время калибровки
  • int gyro_x_OC — Содержит измерения положения гироскопа относительно оси x
  • int gyro_y_OC — содержит измерения положения гироскопа относительно оси y
  • int gyro_z_OC — Содержит измерения положения гироскопа относительно оси z
  • float temp_scall — Содержит абсолютное значение температуры в градусах Цельсия
  • float Accel_x_schecked — данные акселерометра по оси абсцисс минус данные калибровки
  • float Accel_y_sired — данные акселерометра по оси Y минус данные калибровки
  • float Accel_z_scalled — данные акселерометра по оси Z минус данные калибровки
  • float gyro_x_sired — данные гироскопа относительно оси x минус данные калибровки
  • float gyro_y_scheduled — данные гироскопа относительно оси y минус данные калибровки
  • float gyro_z_sired — данные гироскопа относительно оси z минус данные калибровки

Функции в программе Arduino для работы с mpu6050

MPU6050_ReadData()

Эта функция считывает данные с акселерометра, гироскопа и датчика температуры. После считывания данных значения переменных обновляются (temp_squicked, Accel_x_squicked, Accel_y_squicked, Accel_z_squicked, gyro_x_squicked, gyro_y_squalled и gyro_z_squalled.

MPU6050_ResetWake()

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

MPU6050_SetDLPF (интервал BW)

Эта функция регулирует встроенный фильтр нижних частот. Переменная int BW должна содержать значения (0-6). Емкость фильтра будет варьироваться в соответствии с таблицей ниже.

Если int BW не находится в диапазоне 0-6, фильтр нижних частот отключен, что соответствует настройке — бесконечность.

MPU6050_SetGains (внутренний гироскоп, внутреннее ускорение)

Эта функция используется для установки максимального значения шкалы измерений

MPU6050_ReadData()

Эта функция использует масштабные коэффициенты для вычисления результата. Если значения (0–3) не используются, MPU6050_ReadData () отобразит необработанные значения датчика с ошибкой калибровки. Чтобы получить обработанные значения, установите переменные калибровки (Accel_x_OC, Accel_y_OC, Accel_z_OC, gyro_x_OC, gyro_y_OC и gyro_z_OC) в ноль.

MPU6050_OffsetCal()

Эта функция позволяет откалибровать акселерометр и гироскоп. Вычисленные значения записываются в переменные Accel_x_OC, Accel_y_OC, Accel_z_OC, gyro_x_OC, gyro_y_OC и gyro_z_OC для дальнейших корректировок.

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

Ось z откалибрована по силе тяжести — 9,81 м / с2 (1 г), которая учтена в коде.

Калибровка mpu6050

Калибровка гироскопа и акселерометра — очень важный этап. Значения, указанные для гироскопа, имеют вид: «gyro_x_schiamato =», поскольку для получения угла поворота вокруг оси из данных угловой скорости требуется интегрирование.

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

На практике достичь идеала практически невозможно, поэтому наша задача минимизировать эту ошибку.

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

На следующих рисунках показано использование функции MPU6050_OffsetCal () непосредственно в программе в среде Arduino IDE.

Скетч Arduino для калибровки платы акселерометра / гироскопа MPU6050:

Результат скетча для калибровки в серийном мониторе.

Читайте также: Инфракрасный датчик движения Ардуино: принцип работы

Оцените статью
Блог про Arduino