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

А ты построил собственного балансирующего робота?

New-Motor-Smart-Robot-Car-Chassis-Kit-Speed-Encoder-Battery-Box-2WD-For-Arduino-Free-Shipping.jpg

  • Цена: $9.50

Если уж бесполезный ящик имеет право на жизнь, то эта милая и познавательная игрушка и подавно. Она не требует больших трудозатрат, освежает знания физики и математики, увеличивает чувство собственной важности конструктора, повышает его авторитет в глазах представителей противоположного пола и младшего поколения. Прогресс в развитии микроэлектромеханических систем (MEMS) привел к тому, что к началу 10-х годов XXI века гироскопы и акселерометры уменьшились до размера булавочной головки и стоят в розницу пару долларов. Чем не преминули воспользоваться разнообразные гики, создавшие устройства с недостижимыми ранее характеристиками — висящие на одном месте как влитые квадрокоптеры, «чувствующие» свое перемещение в пространстве игровые контроллеры, летящие точно в цель самодельные баллистические ракеты способные сохранять вертикальное положение транспортные средства типа Segway. Последний в свое время произвел фурор и породил армию почитателей, которые возжелали построить если не его полный аналог, то хотя бы действующую модель. Вот и я, насмотревшись роликов на Youtube по запросу «балансирующий робот», в один прекрасный день решил, что тоже хочу повторить подобную конструкцию. Для этого были куплены: — шасси для построения самодвижущихся роботов: акриловая пластина, два моторчика с червячными редукторами, надеваемые на оси редукторов колеса, батарейный отсек и сопутствующая мелочь; — модуль для Arduino с распаянным чипом MPU6050, представляющим из себя трехосевой гироскоп и трехосевой акселерометр; — коммутатор нагрузки типа «H-мост». Мощность для маленьких моторчиков явно избыточна, но пускай будет. Может когда придется применить для привода мощного шагового двигателя; Для ссылок найдены аналогичные товары по минимальной цене у продавцов с хорошей репутацией. Оригинальные ссылки уже не актуальны. Уже имелись в наличии: — Arduino Nano были куплены с запасом еще в те времена, когда вода была мокрее USB-UART преобразователи в них делались на FT232, а не на CH340; — лишний понижающий преобразователь тоже, как мне кажется, есть у любого любителя электронных поделок.Программная часть и немного теории. Алгоритм балансирующего робота опирается на некоторое количество матана. Данные с гироскопа и акселерометра получаются по шине I2C, разделяются на компоненты и поступают на вход фильтра Калмана. На выходе фильтра получаем данные о положении в пространстве, усредненные и очищенные от шума. В нашем случае нас интересует угол только в одной плоскости. Текущее положение угла передается в PID-алгоритм (пропорционально-интегрально-дифференциальный), который на основании текущего угла наклона и его динамики во времени принимает решение о скважности и полярности сигналов на электромоторы управления положением. Поскольку в нашем случае управлять направлением движения робота мы не планируем, сигналы на левый и правый электромотор подаются одинаковые.4f18f9.png Желающие досконально разобраться в математике процесса без проблем найдут поиском в сети статьи о фильтре Калмана и PID-регулировании. В нашем же случае будем пользоваться готовыми библиотеками в качестве «черных ящиков», целиком полагаясь на то, что авторы библиотек свою работу сделали хорошо. В этом и заключается главная особенность Arduno, за которую она любима нубами и ненавидима труъ-эмбеддерами: поделки можно собирать из программных модулей как из кирпичей, вообще не догадываясь об их внутреннем функционировании. Код: drive.google.com/open?id=0ByfpVoSE6ehYem4tVG45MW5kZ3M В скетче собственно моего кода не более 20%. Все остальное честно скопировано из чужих работ. Копирайты потеряны, но оригиналы всегда можно нагуглить используя строки кода в качестве запросов.Аппаратная часть. Отрезаем нижнюю часть оргстекла, подогрев изгибаем ее на 90 градусов, и прикручиваем винтами с другой стороны. Это будет полка для «приборного отсека» робота.9921ad.jpg Прикрепляем электромоторы к нижней части и припаиваем к ним провода. Крепим подходящими винтами коммутатор нагрузки и подключаем к нему электромоторы. Собираем на макетке управляющую часть. Паяем «подсистему питания». Напряжений питания будет два: стабилизированные 5 вольт для питания логики и прямой выход с батареи для питания моторов. Собираем все вместе. Приклеиваем компоненты на полке на двухсторонний скотч. Выглядит брутальненько, как и полагается настоящему роботу. Ну и самый волнующий вопрос: заработало ли устройство? Да, заработало практически сразу:Видео Конечно, по сравнению со «взрослыми» устройствами (с энкодерами, бесколлекторными моторами, продвинутыми алгоритмами и тщательным подбором коэффициентов) устойчивость оставляет желать лучшего, но для демонстрации возможностей сойдет. Главнаяв†’Информацияв†’Статьи

Список деталей:

Помимо вышеперечисленного, Вам понадобиться немного проводов, pbs разъемы и выключатель.

Репозиторий с исходным кодом:В Balancer.

Шаг 1: немного теории

Шаг 2: приступаем к сборке

Робот собирается на трёх макетных платах, расположенных на расстоянии 25мм друг от друга с использованием нейлоновых стоек. На нижнем слое расположено два мотора и модуль двухканального драйвера моторов DRV8833. На среднем уровне размещается Arduino, модуль MPU6050 и два модуля 5В повышающих преобразователя. На верхнем уровне расположен выключатель, аккумулятор и ультразвуковой дальномер (будет установлен позже).

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

Возможно, Вы заметили, что использовано два модуля повышающих преобразователей напряжения (один для Arduino, второй подключен к драйверу моторов), хотя для них обоих требуется напряжение 5В. В первой конструкции использовался один 5В повышающий регулятор для питания контроллера и двигателей, но программа периодически зависала. Это было связано с помехами от мотора, действующими на контроллер и MPU6050. Решением проблемы стало разделение питания и добавление конденсатора 10 мкФ.

Шаг 3: измерение угла наклона с использованием акселерометра

MPU6050 содержит трёх-осевой акселерометр и трёх-осевой гироскоп. Акселерометр измеряет ускорение по трем осям, а гироскоп измеряет угловую скорость по трем осям. Чтобы измерить угол наклона робота, нам нужны значения ускорения по осям y и z. Функция atan2(y, z) возвращает угол в радианах между положительной осью z плоскости и точкой, заданной координатами (z, y) на этой плоскости. Функция возвращает положительное число, когда y> 0 и отрицательное, когда y <0. Для чтения данных из MPU6050 используется библиотека https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050. Загрузите скетч Sketch1.ino и посмотрите, как меняется угол наклона. Попробуйте перемещать робота вперед, назад и наклоняя его под разными углами. Вы заметите, как выводимый в мониторе порта угол, внезапно меняется. Это связано с тем, что горизонтальная составляющая ускорения влияет на значения ускорения по осям y и z.

Шаг 4: измерение угла наклона с помощью гироскопа

Шаг 5: комбинирование и фильтрация данных

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

currentAngle = 0.9934 * (previousAngle + gyroAngle) + 0.0066 * (accAngle)

0.9934 и 0.0066 являются коэффициентами фильтра для интервала времени 0.75с. Фильтр нижних частот пропускает через него любой сигнал, длительность которого превышает эту длительность, а фильтр верхних частот пропускает любой сигнал, длина которого меньше этой длительности. Отклик фильтра можно настроить, выбрав правильную постоянную времени. Понижение постоянной времени позволит увеличить горизонтальное ускорение.

Устранение ошибок смещения акселерометра и гироскопа

Загрузите в Arduino скетч MPU6050_calibration.ino для калибровки смещений MPU6050. В скетче FullCode.ino в функции setup() есть следующие строчки:

mpu.setYAccelOffset(1593);

mpu.setZAccelOffset(963);

mpu.setXGyroOffset(40);

В этих строчках замените числа на полученные при калибровке.

Шаг 6: ПИД-регулятор

Шаг 7: настройка ПИД

  1. Установите Ki и Kd равными нулю и постепенно увеличивайте Kp, чтобы робот начал колебаться около нулевой позиции;

  2. Увеличьте Ki, чтобы робот быстрее реагировал, когда он выходит из равновесия. Ki должен быть достаточно большим, чтобы угол наклона не увеличивался. Робот должен вернуться в нулевое положение, если он наклонен;

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

Шаг 8: дальномер

Ультразвуковой дальномер, который я использовал, это US-020. Это аналог HC-SR05. Если у Вас нет US-020, используйте HC-SR05 или другой подобный дальномер.

Дальномер имеет четыре контакта: Vcc, Trig, Echo и Gnd. Напряжение питания 5В. Контакты триггера и эхо подключены к цифровым выводам Arduino 9 и 8 соответственно. Для получения данных о расстоянии используется библиотека NewPing. Расстояние будет считываться один раз каждые 100 миллисекунд. Если значение будет в диапазоне от 0 до 20 см, на моторы поступит команда вращения.

Заключение

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

«Arduino Self-Balancing Robot», midhun_s Перевод и адаптация: RobotoTehnika.ruИспользуемые источники:

  • https://mysku.ru/blog/aliexpress/39473.html
  • https://robototehnika.ru/content/article/balansiruyushchiy-robot-na-arduino/

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