Обзор модуля GY-521 (MPU-6050) – RobotChip

Обзор модуля GY-521 (MPU-6050) – RobotChip Самолеты
Содержание
  1. Drv8825
  2. Акселерометр
  3. Гироскоп, это прибор способный реагировать на изменение ориентации объекта. простейшим примером гироскопа является волчок. если волчок раскрутить на перемещаемой поверхности, например, на доске, а затем наклонять эту доску, то волчок будет пытаться сохранить свою ориентацию.
  4. Изменяем значения gpio
  5. Изменяем направление вращения колес
  6. Исследуем работу bno055
  7. Исследуем работу mpu6050
  8. Комплементарный фильтр
  9. Контроллер (управление)
  10. Макетная плата, предназначенная для прототипирования
  11. Микроконтроллер arduino uno r3
  12. Модуль датчика для гироскопа акселерометра на аrduino с 3 осями – gy-521 (mpu-6050)
  13. На плате имеется 8 контактов:
  14. Несколько идей/заданий:
  15. Общие сведения.
  16. Подключение gy-521 к arduino
  17. Подключение mpu6050 к ардуино
  18. Подключение гироскопа mpu6050 к arduino: схема и программа
  19. Программа для вычисления угла наклона акселерометра mpu6050
  20. Программа для получения сырых данных с акселерометра mpu6050
  21. Прошивка
  22. Снимаем показания с гироприборов
  23. Соединительные провода папа-папа
  24. Схемы робота
  25. Теория и практика балансировки
  26. Технические параметры.
  27. Точность измерения ускорения в mpu6050
  28. Учимся работать с гироприбором
  29. Характеристики модуля mpu6050 roc:
  30. Шаг 1. компоненты для подключения акселерометра к arduino
  31. Шаг 2. схема подключения акселерометра к микроконтроллеру arduino
  32. Шаг 3. программируем arduino для обработки информации, полученной с акселерометра
  33. Шаговые моторы
  34. Электропитание робота
  35. Заключение

Drv8825

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

На рисунке название ряда контактов сверху имеют линию, это знак «Инверсии» сигнала, он означает, что активный сигнал на данной линии – отрицательный:

  • ENABLE – включение управления мотором (если 1 – выключен, 0 – включен);
  • М0,М1,М2 – задают режим деления шага (дробления шага) см.таблицу 3.1;
  • RESET – перезагрузка (в рабочем состоянии мотора должен быть подтянут к питанию логики 3.3в-5в);
  • SLEEP – сон (в рабочем состоянии мотора должен быть подтянут к питанию логики 3.3в-5в);
  • STEP – шаг, импульс на данном входе, это команда мотору сделать шаг;
  • DIR – задает направление вращения вала мотора (само направление условно и зависит от порядка подключения обмоток);
  • VMOT – ( ) контакт для подачи напряжения питания положительный;
  • GNDMOT – (–/GND) контакт для подачи напряжения питания – (ЗЕМЛЯ);
  • B1 и B2 – разъем для подключение первой обмотки (номера обмоток и номера контактов в обмотках условны);
  • A1 и A2 – разъем для подключение второй обмотки (номера обмоток и номера контактов в обмотках условны);
  • FAULT – выход сигнала аварии (действие не изучено, возможно устанавливается в низкий уровень при превышении нагрузки, замыкании или обрыве обмотки мотора);
  • GNDLOGICGND (земля) логической части (контроллера управления), если источники питания логики и силовой части различны и не имеют общей «земли», если источник питания один, данный контакт можно не подключать.
Смотрите про коптеры:  Ловля на кораблик: как сделать своими руками для рыбалки?

Некоторые современные драйверы шаговых моторов могут дробить шаги на более мелкие, за счет плавного изменения тока обмоток. DRV8825 может делить шаг на 32 микрошага, таким микрошагом мы пользоваться не будем, но возможно воспользуемся данной возможностью для дробления шага до 1/16 (в роботе дробление шага 1/4), это увеличит плавность хода, что важно в нашем случае важно.

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

Для подстройки тока фазы требуется мультиметр и тоненькая плоская отвертка. На мультиметре устанавливаем режим измерения напряжения (до 2-5 вольт). Подключаем драйвер к силовому питанию. Измеряем напряжение между GND и металлической вращающейся головкой подстроечного резистора.

Измерив на подключенном к питанию драйвере напряжение между резистором и GND, и умножив полученное значение на 2, получим ток фазы. В нашем случае следует добиться значения в пределах 0.7-1.0В, что соответствует току через обмотки мотора 1.4-2А.

Большие значения поставить можно, но это приведет к нагреву драйвера и мотора, а также ускорит разряд батареи робота. Меньшие значения могут стать причиной того, что робот под нагрузкой (в режиме управления роботом) не будет поворачивать колеса или будет «пропускать» шаги. Вращаем головку (без усилий — можно повредить резистор), добиваемся нужного значения.

Для защиты драйвера от перегрева следует использовать радиатор (он идет в комплекте с драйвером). Радиатор снабжен клейкой основой. Снимите бумагу с клейкой части радиатора. Установите радиатор на микросхему драйвера, прижмите, произведите вращательные движения на 5-10 градусов, чтобы удалить пузыри воздуха между радиатором и микросхемой.

Значение микрошага шагового мотора в зависимости от подключения контактов M0,M1,M2 драйвера DRV8825.

Акселерометр

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

где Обзор модуля GY-521 (MPU-6050) – RobotChipОбзор модуля GY-521 (MPU-6050) – RobotChipОбзор модуля GY-521 (MPU-6050) – RobotChipОбзор модуля GY-521 (MPU-6050) – RobotChipОбзор модуля GY-521 (MPU-6050) – RobotChipОбзор модуля GY-521 (MPU-6050) – RobotChipОбзор модуля GY-521 (MPU-6050) – RobotChip

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

где Обзор модуля GY-521 (MPU-6050) – RobotChipОбзор модуля GY-521 (MPU-6050) – RobotChipОбзор модуля GY-521 (MPU-6050) – RobotChipОбзор модуля GY-521 (MPU-6050) – RobotChipОбзор модуля GY-521 (MPU-6050) – RobotChipОбзор модуля GY-521 (MPU-6050) – RobotChipОбзор модуля GY-521 (MPU-6050) – RobotChipОбзор модуля GY-521 (MPU-6050) – RobotChipОбзор модуля GY-521 (MPU-6050) – RobotChip

Рисунок Нахождение угла отклонения от вертикали (робот неподвижен)

Если у вас BNO055 используйте скетч BNO055test для тестирования гироприбора.

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

Гироскоп был изобретен в начале XIX века, и в конце того же века был впервые применен на практике для стабилизации курса торпед.

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

Изменяем значения gpio

Если вы для своего робота используете не те GPIO, что прописаны в схемах и программе, их можно заменить в файле  step_motor.h

#define STEP_L 15 //Пин левого шага 

#define STEP_R 4 //Пин правого шага

#define STEPER_EN 2 //Пин врключения моторов

#define DIR_L 13 //Пин направления левого шага 

#define DIR_R 16 //Пин направления правого шага

Изменяем направление вращения колес

Если колеса по факту вращаются не в ту сторону, следует поменять  в файле step_motor.h значения указанных ниже констант на противоположные:

#define DIR_L_FRONT false //Пин направления левого шага 

#define DIR_R_FRONT true //Пин направления правого шага

#define DIR_L_BACK true //Пин направления левого шага 

#define DIR_R_BACK false //Пин направления правого шага

Исследуем работу bno055

Если у вас BNO055 используйте скетчBNO055test для тестирования гироприбора.

1. Прошейте робота данной программой.

2. В Arduino IDE откройте «Монитор порта», установите скорость обмена 115200, как показано на следующем рисунке.

Обзор модуля GY-521 (MPU-6050) – RobotChip
Теперь в мониторе порта вы увидите несколько строк данных, которые будут обновляться каждые 0.3 сек (delay(300)).Обзор модуля GY-521 (MPU-6050) – RobotChip
Первая строка содержит углы склонения/поворота робота. Вторая строка содержит угловую скорость по осям. Оси ориентации и угловой скорости могут не совпадать по названиям, какие оси использовать и с каким знаком следует установить.

Углы склонения/поворота робота

Покрутите робота, наклоните робота вперед/назад, вправо/влево.

event.orientation.x= ?? покажет угол поворота/налона робота в градусах по (вокруг) оси X прибора, event.orientation.y= ?? по оси Y, event.orientation.z= ?? по оси Z.

Установите робота параллельно горизонту и вращайте без наклонов. Заметьте — значения по какой оси изменяются — исключите эту ось — она нам пока не потребуется. Наклоните робота вправо/влево, запомните значения по какой оси будут в градусах соответствовать наклону, запомните эту ось, она нам не потребуется.

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

Угловая скорость

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

Gyro.x()= ?? Gyro.y()= ?? Gyro.z()= ??

Вращайте робота в горизонтальной плоскости.

ВНИМАНИЕ, значение угловой скорости нужно снимать именно во время движения!

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

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

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

Еще раз отмечу, берите во внимание только показания, которые получаются, когда действие склонения робота производится!!! Когда робот остановлен, значение угловой скорости будут близки нулю и колебаться по знаку, он нам не интересны.

Эту ось мы будем использовать.

Если при действии «наклон вперед» угловая скорость по оси имеет отрицательный знак, в дальнейшем требуется менять знак (инвертировать).

Исследуем работу mpu6050

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

Получение угла отклонения

MPU6050 не показывает угол отклонения от заданного направления. Прибор, регистрирует текущую угловую скорость (скорость вращения), и значения влияния гравитации по осям (акселерометр). Зная мгновенную угловую скорость, можно вычислить угол, на который повернется объект за некоторый промежуток времени:

где Обзор модуля GY-521 (MPU-6050) – RobotChipОбзор модуля GY-521 (MPU-6050) – RobotChipОбзор модуля GY-521 (MPU-6050) – RobotChipОбзор модуля GY-521 (MPU-6050) – RobotChipОбзор модуля GY-521 (MPU-6050) – RobotChipОбзор модуля GY-521 (MPU-6050) – RobotChipОбзор модуля GY-521 (MPU-6050) – RobotChip

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

Комплементарный фильтр

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

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

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

При объединение показаний акселерометра и гироскопа на основе комплементарного фильтра можно рассчитать значение угла наклона по формуле:

где Обзор модуля GY-521 (MPU-6050) – RobotChipОбзор модуля GY-521 (MPU-6050) – RobotChipОбзор модуля GY-521 (MPU-6050) – RobotChipОбзор модуля GY-521 (MPU-6050) – RobotChipОбзор модуля GY-521 (MPU-6050) – RobotChipОбзор модуля GY-521 (MPU-6050) – RobotChipОбзор модуля GY-521 (MPU-6050) – RobotChipОбзор модуля GY-521 (MPU-6050) – RobotChipОбзор модуля GY-521 (MPU-6050) – RobotChip.

Итоговая величина является долевой суммой интегрированного значения показаний гироскопа и мгновенного значения показаний акселерометра

Доля показаний акселерометра мала, поскольку они умножаются на малую величину Обзор модуля GY-521 (MPU-6050) – RobotChipОбзор модуля GY-521 (MPU-6050) – RobotChipОбзор модуля GY-521 (MPU-6050) – RobotChip

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

Коэффициент Обзор модуля GY-521 (MPU-6050) – RobotChip

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

Цитирование «Мобильные роботы на базе Arduino» закончено.

Используйте скетч MPU6050test для тестирования гироприбора.

  1. Прошейте робота данной программой.

  1. В Arduino IDE откройте «Монитор порта», установите скорость обмена 115200, как показано на следующем рисунке.

  2. Обзор модуля GY-521 (MPU-6050) – RobotChip
    Перезагрузите ESP32 кнопокой «Reset», не трогайте робота в течении 4х секунд, в это время производится расчет смещения показаний акселерометра.

Теперь в мониторе порта вы увидите несколько строк данных, которые будут обновляться каждые 0.1 сек .

Gyro =показания угловой скорости в радианах.

Acsel= показания угла наклона по акселерометру в радианах.

AcYsum =показания угла наклона Комплементарный фильтр.

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

Если при действии «наклон вперед» угловая скорость по оси имеет отрицательный знак, в дальнейшем требуется изменить знак (инвертировать). То же касается показаний угла Acsel. При проведении наклона вперед угловая скорость — положительна.

Запомним те изменения, которые внесены в типовой пример, они потребуются в полной программе балансировки.

Контроллер (управление)

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

В последнее время я довольно активно использую данные контроллеры по причине высокой производительности и низкой стоимости, также стоит отметить широкий перечень возможностей, которые представляет ESP32. Это скорее микрокомпьютер, чем контроллер 512КБ ОЗУ, 4МБ Flash, два ядра по 240МГц, 64-разрядные таймеры и пр. и пр…

Макетная плата, предназначенная для прототипирования

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

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

Материал для изготовления беспаечных макетных плат – пластик. Кроме того, все контакты надежно скреплены к плате, поэтому частые переключения не испортят элемент.

Микроконтроллер arduino uno r3

МК создан с использованием материалов контроллера ATmega328:

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

Старт работы начинается с подачи электрического питания в плату. Пользователь подключает к плате со схемой блок питания или зарядное устройство. Также процедура осуществляется с помощью usb-кабеля, который подключен к компьютеру и микроконтроллеру. Для разработки программы понадобится бесплатная среда программирования – Arduino IDE.

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

Пользователь создает в бесплатной среде код, затем его компилирует и загружает проработанную программу в пространство памяти в Ардуино. Язык, на котором программируется код, Wiring максимально приближен к популярному среди программистов языку – C . Кроме того МК поддерживает версии для осей Виндовс, Мак ОС и Линукс.

Модуль датчика для гироскопа акселерометра на аrduino с 3 осями – gy-521 (mpu-6050)

В основе компонента лежит микросхема MPU-6050. В комплект входят 2 предмета – гироскоп и акселерометр. Данные устройства перед конструированием обрабатываются и затем переносятся прямиком в микроконтроллер через интерфейс

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

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

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

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

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

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

Общие сведения.

Основная микросхема модуль GY-521 чип MPU-6050 , который содержит в себе акселерометр и гироскоп, а так же датчик температуры. Обработка данных осуществляется с помощью 16-битное АЦП (Аналого-цифровой преобразователь) на каждый канал, поэтому он обрабатывает значение x, y и z одновременно.

Встроенный датчик температуры предназначен для измерения температуры и имеет диапазон измерений от -40 ° С до 85 ° С.Для взаимодействия с Arduino используется шина I2C и датчик MPU-6050 всегда выступает в качестве подчиненного устройства. Но кроме обычной шины I2C, есть собственный контроллер I2C, в котором MPU-6050 ведомый, выводы SDAи XDA и с помощью это шины можно управлять например магнитометром и передавать данные на Arduino.

Датчика MPU-6050 работает от напряжение ~2.4 — 3.5 В и чтобы стабилизировать питание, на модуле GY-521 добавили стабилизатор напряжения на 3.3 В с малым падением напряжении, поэтому модуль можно подключить к напряжению 5 В и 3.3 В.

Назначение выводов:►  VCC – « » питание модуля 3.3 В до 5 В ►  GND – «-» питание модуля►  SCL – линия синхронизации для протокола I2C►  SDA – линия передачи данных протокола I2C►  XDA – линия передачи данных протокола при работе в режиме мастера►  XCL – линия синхронизации для протокола I2C при работе в режиме мастера►  AD0 – если вывод лог «0» адрес I2C будет 0x68, если вывод лог «1» адрес I2C будет 0x69►  INT – прерывание

Подключение gy-521 к arduino

Необходимые детали:► Arduino UNO R3 x 1 шт.► Провод DuPont, 2,54 мм, 20 см x 1 шт.► Кабель USB 2.0 A-B x 1 шт.► 3-осевой гироскоп акселерометр GY-521 x 1 шт.

Подключение:В примере будем использовать только первые четыре контакта VCC, GND, SDA и SCL. Сначала подключаем VCC и GND модуля GY-521 к 5V и GND. Далее нужно установить соединение I2C между модулем GY-521 и Arduino, для этого подключите вывод SCL модуля к выводу А4 Arduino и вывод модуля SCL к выводу A5 Arduino. Для удобства приведу схему подключение.

Подключение mpu6050 к ардуино

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

MPU6050 ROCGNDVCCSDASCL
Ардуино УноGND 5VA4A5

Подключение гироскопа mpu6050 к arduino: схема и программа

#include<LiquidCrystal.h> // библиотека для работы с ЖК дсиплеем

LiquidCrystallcd(8,9,10,11,12,13);// номера контактов, к которым подключен ЖК дисплей

#include <Wire.h>

#include <MPU6050.h> // библиотека для работы с датчиком MPU6050 (ссылка для ее скачивания приведена в тексте статьи)

#define period 10000

MPU6050mpu;

intcount=0;

charokFlag=0;

bytedegree[8]={

  0b00000,

  0b00110,

  0b01111,

  0b00110,

  0b00000,

  0b00000,

  0b00000,

  0b00000

};// символ градуса

voidsetup()

{

  lcd.begin(16,2);

  lcd.createChar(0,degree);

  Serial.begin(9600);// инициализируем последовательный порт для работы на скорости 9600 бод/с

  Serial.println(“Initialize MPU6050”);

  while(!mpu.begin(MPU6050_SCALE_2000DPS,MPU6050_RANGE_2G))

  {//если нет соединения с MPU6050, выдаем предупреждающие сообщения

    lcd.clear();

    lcd.print(“Device not Found”);

    Serial.println(“Could not find a valid MPU6050 sensor, check wiring!”);

    delay(500);

  }

  count=0;

  mpu.calibrateGyro();// калибровка гироскопа

  mpu.setThreshold(3);

  lcd.clear();

  lcd.print(“MPU6050 Interface”);

  lcd.setCursor(0,1);

  lcd.print(” Circuit Digest”);

  delay(2000);

  lcd.clear();

}

voidloop()

{

    lcd.clear();

    lcd.print(“Temperature”);

    longst=millis();

    Serial.println(“Temperature”);

    while(millis()<st period)

    {

      lcd.setCursor(0,1);

      tempShow();

    }

    lcd.clear();

    lcd.print(“Gyro”);

    delay(2000);

    st=millis();

    Serial.println(“Gyro”);

    while(millis()<st period)

    {

      lcd.setCursor(0,1);

      gyroShow();

    }

    lcd.clear();

    lcd.print(“Accelerometer”);

    delay(2000);

    st=millis();

    Serial.println(“Accelerometer”);

    while(millis()<st period)

    {

      lcd.setCursor(0,1);

      accelShow();

    }

}

voidtempShow()//данные температуры

{

    floattemp=mpu.readTemperature();

    Serial.print(” Temp = “);

    Serial.print(temp);

    Serial.println(” *C”);

    lcd.clear();

    lcd.print(“Temperature”);

    lcd.setCursor(0,1);

    lcd.print(temp);

    lcd.write((byte)0);

    lcd.print(“C”);

    delay(400);

}

voidgyroShow()//данные гироскопа

{

  //lcd.setCursor(0,0);

  lcd.clear();

  lcd.print(” X     Y     Z”);

  VectorrawGyro=mpu.readRawGyro();

  VectornormGyro=mpu.readNormalizeGyro();

  lcd.setCursor(0,1);

  lcd.print(normGyro.XAxis,1);

  lcd.setCursor(6,1);

  lcd.print(normGyro.YAxis,1);

  lcd.setCursor(12,1);

  lcd.print(normGyro.ZAxis,1);

  Serial.print(” Xnorm = “);

  Serial.print(normGyro.XAxis);

  Serial.print(” Ynorm = “);

  Serial.print(normGyro.YAxis);

  Serial.print(” Znorm = “);

  Serial.println(normGyro.ZAxis);

  delay(200);

}

voidaccelShow()// данные акселерометра

{

// lcd.setCursor(0,0);

  lcd.clear();

  lcd.print(” X     Y     Z”);

  VectorrawAccel=mpu.readRawAccel();

  VectornormAccel=mpu.readNormalizeAccel();

  lcd.setCursor(0,1);

  lcd.print(normAccel.XAxis,1);

  lcd.setCursor(6,1);

  lcd.print(normAccel.YAxis,1);

  lcd.setCursor(12,1);

  lcd.print(normAccel.ZAxis,1);

  Serial.print(” Xnorm = “);

  Serial.print(normAccel.XAxis);

  Serial.print(” Ynorm = “);

  Serial.print(normAccel.YAxis);

  Serial.print(” Znorm = “);

  Serial.println(normAccel.ZAxis);

  delay(200);

}

Программа для вычисления угла наклона акселерометра 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<minv )
        return minv;
    return v;
}

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;
        float ay,gx;

        t_next = t   T_OUT;
        accel.getMotion6(&ax_raw, &ay_raw, &az_raw, &gx_raw, &gy_raw, &gz_raw);
 
        // сырые данные акселерометра нужно преобразовать в единицы гравитации
        // при базовых настройках 1G = 4096
        ay = ay_raw / 4096.0;
        // на случай, если на акселерометр действуют посторонние силы, которые могут
        // увеличить ускорение датчика свыше 1G, установим границы от -1G до  1G  
        ay = clamp(ay, -1.0, 1.0);

        // функция acos возвращает угол в радианах, так что преобразуем
        // его в градусы при помощи коэффициента TO_DEG
        if( ay >= 0){
            angle_ax = 90 - TO_DEG*acos(ay);
        } else {
            angle_ax = TO_DEG*acos(-ay) - 90;
        }
 
        Serial.println(angle_ax); // вывод в порт угла поворота вокруг оси X
    }
}

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

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

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

Прошивка

Я предполагаю, что вы знаете как устанавливать поддержку ESP32 в среду Arduino IDE. Я предполагаю, что вы знаете, как прошить ESP32. Замечу, что некоторые платы, например DEVKIT, требуют нажать кнопку BOOT для прошивки (во время прошивки), а затем кнопку RESET. Эти кнопки расположены на плате контроллера.

Снимаем показания с гироприборов

(далее идет выборочное цитирование из моей книги «Мобильные роботы на базе Arduino»)

Соединительные провода папа-папа

Обычные провода папа-папа нам подойдут, еще их называют провода-перемычки. Такие стоят недорого и продаются везде, на любом рынке или в любом онлайн-магазине для радиолюбителей.

Схемы робота

Схемы робота приведены ниже. Также сборку робота можно проследить по роликам:

1 часть.

Теория и практика балансировки

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

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

Хотя, пойдем от простого к сложному.

Все описанные далее формулы должны применяться к роботу периодически, через 5-10 миллисекунд.

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

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

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

скорость ответа колес робота Speed должна быть пропорциональна углу склонения робота Ang. Это первая фаза построения регулятора.

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

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

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

Допустим ситуацию, когда робот склонён но уже не падает, а поднимается, логично предположить, что в этом случае робот должен хотя-бы остановиться, но он, «видя» свой наклон, продолжит ехать вперед, что приведет в обратному склонению (перерегулированию) и в дальнейшем к падению.

As – угловая скорость (скорость падения) , Kd —коэффициент пропорциональности.

Если применить данную формулу, то можно невооруженным глазом заметить, что балансировка стала плавнее. Для подбора Kd, примите Kp = 0, и добейтесь существенного противодействия падению одним вторым звеном. Робот будет падать но должен существенно этому сопротивляться.

Но еще один вопрос как быть, если робот уже движется с определенной скоростью и падает, где и как мы учитываем текущую линейную скорость робота? – нигде. А это желательно сделать!

Если заданная скорость совпадает со скоростью движения, а это практически так для шаговых моторов, то формула превращается в следующую:

где Speed_old – текущая скорость.

Если теперь запустить робота, он сразу уйдет в критическое отклонение, это связано с тем, что Kp и Kd для данного режима будут велики и должны быть существенно снижены.

Настройка похожа на предыдущую: сначала принимаем Kd=0, добиваемся балансировки, затем Kp=0, также добиваемся существенного сопротивления робота падению, затем оба коэффициента снижаем вдвое от полученных значений и подключаем оба.

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

Вы уже задали вопрос — «почему робот не стоит на месте?» – пора задать!

Дело в том, что точно отцентрировать робота относительно гироприбора сложно и робот будет всегда немного наклонен вперед или назад, наклон задается смещением центра тяжести. Для компенсации этого наклона применяется обратная связь по пройденному расстоянию, а это не что иное как скорость умноженная на dt – время действие данной скорости. Так как скорость робота изменяется периодически, то следует использовать накопительную (интегральную) форму:

Move – пройденный роботом путь в относительных единицах (для шаговых моторов это могут быть шаги), dt- время действия скорости (период между опросами в секундах),

Ki —коэффициент пропорциональности.

Кажется все нормально, но на деле робот начинает колебаться с огромной амплитудой — изменяя Ki добейтесь этого. Дело в том, что работе интегральной составляющей Move нужно помогать останавливая робота за счет составляющей, которая уменьшается с уменьшением скорости робота, это как раз сама скорость робота — Speed, добавим ее небольшую часть для компенсации раскачивания робота интегральным звеном…

где Kki – коэффициент затухания для интегрального звена.

Теперь наш робот будет устойчиво стоять и даже если его толкнуть — вернет себе устойчивое равновесие. Но, он еще не может двигаться!

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

Если принять заданную скорость движения за SpZ, то формула примет вид:

Вот теперь робот будет двигаться с указанной скоростью и не только по равнине, но и в гору и с горы!

Можно и далее сглаживать движение робота, введением звеньев высшего порядка, но их влияние, как показывает практика, не велико.

Технические параметры.

►  Основная микросхема: MPU-6050 ►  Напряжение питания: 3.3 и 5 В►  Режимы для акселерометра: ±2g, ±4g, ±6g, ±8g, ±16g;►  Режимы для гироскопа: ±250°, ±500°, ±1000°, ±2000°;►  Ширина шины IIC: 16 бит;

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

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

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

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

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

Учимся работать с гироприбором

Если вы уже собрали робота, то отключите его моторы, вынув положительный контакт (провода питания драйверов DRV8825), или другим способом, если робот не собран. Возьмите модуль ESP32 и гироприбор, далее будут показаны принципы работы с MPU6050 и BNO055. В любом случае гироприбор должен быть подключен согласно схемы, указанной выше и соответствующей вашему гироприбору.

У приборов MPU6050 и BNO055, которые были у меня под рукой, при установке их на макетную плату контакты SCL и SDA распаяны по разному (перекрещены).

Но все зависит от распайки чипа на плате, вы можете самостоятельно менять GPIO для ESP32 I2C в строке включения I2C Wire.

begin(SDA, SCL), здесь вместо SDA иSCL установите номера GPIO вашего подключения.

Строка Wire.begin() для BNO055 находится в файле Adafruit_BNO055.cpp , для MPU6050 – в файле gyro_acsel.h .

Ориентацию осей также рекомендую определять экспериментально, получая показания прибора.

Если у вас BNO055, который имеет несколько режимов работы интерфейса, переключите его в режим I2C интерфейса закоротив перемычки S0 (PS0) и S1 (PS1) на GND, на рисунке с GY-BNO055 перемычки уже впаяны (рядом со стрелками осей).

Считаем, что гироприбор стоит на роботе, так как и будет стоять в дальнейшем. Сторону робота ближе к которой расположен гироприбор будем считать «FRONT», а соответственно ту, где расположены драйверы моторов и выключатель — «BACK», напишите маркером или сделайте метки маркером на роботе.

Характеристики модуля mpu6050 roc:

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

Шаг 1. компоненты для подключения акселерометра к arduino

Для проекта понадобятся несколько компонентов:

Шаг 2. схема подключения акселерометра к микроконтроллеру arduino

Порядок и схема подключения довольно просты:

GY-521 (MPU-6050)Arduino Uno
VCC3.3 V
GNDGND
SCLA5
SDAA4
  1. Присоединяем модуль датчика к микроконтроллеру.
  2. На МК Ардуино загружаем проработанный код, представленный в разделе ниже.
  3. Открываем среду разработки Arduino IDE и мониторим последовательный порт.
  4. Сверяем выводимые данные акселерометра и гироскопа.
  5. Во время поворота датчика сведения не производят изменений.

Гироскоп – инструмент, который позволяет измерить реакцию тела на перемещение углов и вообще ориентации. Акселерометр же служит измерителем проекции ускорения, которое только кажется.

Шаг 3. программируем arduino для обработки информации, полученной с акселерометра

Алгоритм написания программы в последовательности:

// Подключаем необходимые для работы библиотек
#include "MPU6050.h";
#include "I2Cdev.h";
#include "Wire.h";

// Создаем объект, символизирующий модуль датчика
MPU6050 axeler;

// Создаем объект библиотеки Wire
Wire b;

// Создаем объект, который символизирует контакт I2C
I2Cdev h;

// Вводим цифровые данные, отвечающие за точки в 3-х осях
int16_t axx, axy, axz;
int16_t gix, giy, giz;

// Объявляем метод, который будет запускать программу
void setup()

{
// Начинаем работу
Wire.begin();
h.begin(38400);

// Производим инициализацию, отчет выводится после компиляции
h.println("Initializing I2C devices...");
axeler.initialize();
delay(100);
}

// Считываем значения гироскопа и акселерометра с помощью адресов, которые принадлежат описанным выше переменным
void loop()
{
axeler.getMotion6(&axx, &axy, &axz, &gix, &giy, &giz);

// Выводим получившиеся значения на экран
h.print("a/g:t");
h.print(axx); 
h.print("t");
h.print(axy);
hl.print("t");
hl.print(axz); 
h.print("t");
h.print(gix); 
h.print("t");
h.print(giy); 
h.print("t");
h.println(giz);
}

Вуаля! Акселерометр Аrduino запрограммирован.

В принципе, для разнообразия можно написать еще один скетч (ниже), но тогда нам нужна будет еще одна библиотека – Kalman (Gy-521, mpu6050), которая преобразует показания координат X и Y.

#include <Wire.h>
#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;
}

После второго скетча вы на экране сможете увидеть подобные цифры:

Шаговые моторы

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

Шаговые моторы должны иметь достаточную мощность для работы без перегрузок. Для этого подходят моторы Nema17 рассчитанные на ток 1.2-1.5А. Более мощные моторы будут избыточными, менее мощные не смогут без пропуска шагов перемещать достаточно тяжелую конструкцию робота.

Электропитание робота

В качестве источника питания для робота используется 4 литиевых аккумулятора формата 18650 подключенные последовательно, что дает напряжение 14-16 вольт и ток до 5А. Использование 4х аккумуляторов и столь высокого напряжения основано на требованиях двигателей к току (до 1.5А) и драйверов drv8825 к напряжению (не менее 9В).

Также потребуется один стабилизатор для уменьшения напряжения до 5В. Данное напряжение способен «переварить» внутренний стабилизатор платы ESP32 (сам контроллер использует напряжение 3.3вольта). Можно использовать линейный стабилизатор типа L7805CV или импульсный понижающий стабилизатор настроенный на выходное напряжение 5 вольт.

Ниже, в схеме робота будет приведено подключение линейного стабилизатора. Отмечу, что ножка 1 – ( входа), 2 — (GND), 3 – ( выходного напряжения 5вольт). Между обоими положительными контактами и GND устанавливаются гасящие помехи конденсаторы.

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

Заключение

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

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

Оцените статью
Радиокоптер.ру
Добавить комментарий