Балансирующие роботы своими руками

Содержание
  1. Делаем самобалансирующего робота на Ардуино
  2. Как работает балансировка?
  3. Схема робота
  4. Создание робота
  5. Теория
  6. Код Ардуино самобалансирующего робота
  7. Собираем балансирующего робота на шаговых моторах
  8. Основная идея: собрать робота, который сможет держать равновесие на двух колесах. Под сборкой подразумевается конструирование и программа балансировки.
  9. Программные листинги
  10. Но мне хотелось большего, что-бы он свободно ездил и при этом делал это плавно и грациозно. Я проводил вечера пробуя различные механики на роботе с коллекторными редукторными моторами. Кое-что получалось, но не было идеала, не было стабильности. Впрочем что говорить, посмотрите ролики про этих роботов начиная со сборки:
  11. Начинаю использовать шаговики
  12. Собственно чего стесняться, приведу ролик про сборку данного робота:
  13. Комплектующие для балансирующего робота
  14. Математические выкладки

Делаем самобалансирующего робота на Ардуино

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

Как работает балансировка?

Сигвей от англ. Segway – двухколесное средство передвижения стоя, оснащенное электроприводом. Еще их называют гироскутерами или электрическими самокатами.

Вы когда-нибудь задумывались, как работает Сигвей? В этом уроке мы постараемся показать вам, как сделать робота Ардуино, который уравновешивает себя точно так же, как Segway.

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

Элемент обратной связи — гироскоп-акселерометр MPU6050, который обеспечивает как ускорение, так и вращение во всех трех осях (основы MP26050 I2C). Ардуино использует это, чтобы знать текущую ориентацию робота. Корректирующим элементом является комбинация двигателя и колеса.

В итоге должен получиться примерно такой друг:

Схема робота

Сначала подключите MPU6050 к Ардуино и проверьте соединение, используя коды в этом учебном руководстве по интерфейсу IMU. Если данные теперь отображаются на последовательном мониторе, вы молодец!

Продолжайте подключать остальные компоненты, как показано выше. Модуль L298N может обеспечить +5В, необходимый для Ардуино, если его входное напряжение составляет +7В или выше. Тем не менее, мы выбрали отдельные источники питания для двигателя и схемы.

Создание робота

Корпус робота изготовлен в основном из акрилового пластика с двумя редукторными двигателями постоянного тока:

Основная печатная плата, состоящая из Arduino Nano и MPU6050:

Модуль драйвера двигателя L298N:

Мотор редуктора постоянного тока с колесом:

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

Завершенный вариант самостоятельно балансирующего робота можно посмотреть на рисунке выше. В верхней части находятся шесть Ni-Cd-батарей для питания печатной платы. В промежутках между моторами используется 9-вольтовая батарея для драйвера двигателя.

Теория

В теории управления, удерживая некоторую переменную (в данном случае позицию робота), требуется специальный контроллер, называемый ПИД (пропорциональная интегральная производная). Каждый из этих параметров имеет «прирост», обычно называемый Kp, Ki и Kd. PID обеспечивает коррекцию между желаемым значением (или входом) и фактическим значением (или выходом). Разница между входом и выходом называется «ошибкой».

Читайте также:  Зимняя теплица своими руками схемы

ПИД-регулятор уменьшает погрешность до наименьшего возможного значения, постоянно регулируя выход. В нашем самобалансирующем роботе Arduino вход (который является желаемым наклоном в градусах) устанавливается программным обеспечением. MPU6050 считывает текущий наклон робота и подает его на алгоритм PID, который выполняет вычисления для управления двигателем и удерживает робота в вертикальном положении.

PID требует, чтобы значения Kp, Ki и Kd были настроены на оптимальные значения. Инженеры используют программное обеспечение, такое как MATLAB, для автоматического вычисления этих значений. К сожалению, мы не можем использовать MATLAB в нашем случае, потому что это еще больше усложнит проект. Вместо этого мы будем настраивать значения PID. Вот как это сделать:

  1. Сделайте Kp, Ki и Kd равными нулю.
  2. Отрегулируйте Kp. Слишком маленький Kp заставит робота упасть, потому что исправления недостаточно. Слишком много Kp заставляет робота идти дико вперед и назад. Хороший Kp сделает так, что робот будет совсем немного отклоняться назад и вперед (или немного осциллирует).
  3. Как только Kp установлен, отрегулируйте Kd. Хорошее значение Kd уменьшит колебания, пока робот не станет почти устойчивым. Кроме того, правильное Kd будет удерживать робота, даже если его толькать.
  4. Наконец, установите Ki. При включении робот будет колебаться, даже если Kp и Kd установлены, но будет стабилизироваться во времени. Правильное значение Ki сократит время, необходимое для стабилизации робота.

Поведение робота можно посмотреть ниже на видео:

Код Ардуино самобалансирующего робота

Нам понадобилось четыре внешних библиотеки, для создания нашего робота. Библиотека PID упрощает вычисление значений P, I и D. Библиотека LMotorController используется для управления двумя двигателями с модулем L298N. Библиотека I2Cdev и библиотека MPU6050_6_Axis_MotionApps20 предназначены для чтения данных с MPU6050. Вы можете загрузить код, включая библиотеки в этом репозитории.

Значения Kp, Ki, Kd могут работать или не работать. Если они этого не делают, выполните шаги, описанные выше. Обратите внимание, что наклона в коде установлен на 173 градуса.

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

Источник

Собираем балансирующего робота на шаговых моторах

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

Программные листинги

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

Но мне хотелось большего, что-бы он свободно ездил и при этом делал это плавно и грациозно. Я проводил вечера пробуя различные механики на роботе с коллекторными редукторными моторами. Кое-что получалось, но не было идеала, не было стабильности. Впрочем что говорить, посмотрите ролики про этих роботов начиная со сборки:



Начинаю использовать шаговики

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

Читайте также:  Бойлы для сазана своим руками

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

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

Первоначальные схемы робота я привожу:

В дальнейшем моторы были заменены на более мощные NEMA 17 (17hs4401) с номинальным током 1.7А и резистивным сопротивлением обмоток 1.8Ом . У старых двигателей номинальный ток был неизвестен, а вот сопротивление обмоток было около 26 Ом, что непозволяло мотору развивать достаточную мощность.

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


Комплектующие для балансирующего робота

№ пункта Название Количество 1 Корпус (я смоделировал его и выфрезеровал из 3мм фанеры), но можно сделать из пластиковых линеек 1 2 бокс аккумуляторный (стандартный подпружиненый, по 2шт аккумулятора в бокс) 2 3 аккумумляторы 18650 литиевый 3.7В (соединены последовательно), желательно высокого качества 4 4 драйвер шаговых моторов DRV8825, потребуется установить радиатор, я установил его с обратной стороны на плату (на рассеивающую метализацию) 2 5 выключатель (должен держать импульсные токи до 4 ампер) 1 6 гироcкоп-акселерометр MPU-6050 (берегитесь подделки) 1 7 стабилизатор напряжения 5В (7805), (питание BT-приемопередатчика), данный стабилизатор позволил оставлять HC-05 без напряжения, при подключении робота к компьютеру по USB. 1 8 конденсаторы электролиты 16в 200мкф (требуются на вход и выход стабилизатора 7805 5в) 2 9 конденсаторы электролиты 25в 2000мкф (на входы питания шаговых драйверов — по инструкции подключения) 2 10 конденсаторы керамика 104 100нф (везде где только можно) на питание гироскопа, arduino, HC-05 (убираем высокачастотные помехи) 2 11 провода силовые и сигнальные (толстые и тонкие) по потребности 12 Bluetooth-приемопередатчик HC-05/HC-06 (через него рулим роботом) 1 13 шаговые моторы NEMA 17 (17hs4401) 2 14 Колеса капролоновые 77мм диаметр (самофрезерованные) 2 15 Arduino NANO (не лучший вариант — лучше Mega или ESP8266), но что было под рукой 1 16 Диод на цепь питания Arduino NANO. Подцепил их последовательно для снижения питания от 4 последовательно соединенных 18650 (напряжение может достигать 18в), а каждый диод гасит немного на себе. Кроме того при программирование напряжение не наводится на силовые цепи робота 4

Математические выкладки

Длина шага моего робота при настройке делителя шага на 4:

, где r – радиус колеса

Расстояние, которое должен преодолеть робот, чтобы компенсировать свой наклон:

,

где – собственно расстояние,
– расстояние от пола до центра масс робота, — угол наклона робота,
или приближенно:

,

где – угол наклона робота в радианах (при углах до ).

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

,

— требуемое количество шагов робота.

Данное количество шагов мы будем втискивать в рамки некоторого времени, а это уже не что иное, как скорость! И дополнительно приложим к нему коэффициент – получили пропорциональное звено.

Читайте также:  Гамак для дачи с каркасом своими руками

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

.

В старых роботах я это не учитывал.

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

,

где — скорость изменения угла падения робота, — коэффициент влияния скорости падения робота на результат (скорость шагового привода).

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

У меня это несовпадение было около 3-х градусов.

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

Этим займется Интегральное звено.

, где – значение интеграла, – коэффициент влияния интегрального звена (как правило, он меньше 1.0).

И итоговая формула выглядит так:

,

А если на чистоту, то у меня получилось так:

,где – немного больше 1.0

Теперь перейду к программе, я попытался максимально сэкономить на расчетах,

Запрос состояния MPU -5060 занимает не менее 1.4 миллисекунды, мои расчеты около 0.6 миллисекунд в старой программе.

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

Я программировал на Arduino NANO ( ATmega 328), у данного контроллера только один 16 разрядный таймер, а управлять нужно отдельно шагами двух моторов!

Вот что получилось, я использовал библиотеку Timer 1, хотя и не очень обоснованно:

Запрос к гироскопу акселерометру проходит каждые 5 милисекунд (200 раз в секунду), если реже, то накапливается погрешность, теряется точность

А вот корректировка скорости робота осуществляется всего 10 раз в секунду.

Много ресурсов забирает прерывание, которое срабатывает каждые 12 микросекунд и запускает перерасчет шагов обоих моторов. Если использовать контроллер, который имеет 2а 16ти-разрядных таймера, этой проблемы можно избежать (например, ArduinoMega ). Более того, становиться возможным использование микрошага 8 и 16, что повышает точность отработки робота.

Также много ресурсов потребляла эмуляция последовательного порта библиотекой SoftwareSerial , от нее пришлось отказаться, а управление роботом осуществляется по D 0- D 1 аппаратному порту, который не расходует ресурсы основного логического ядра контроллера — реализован аппаратно.

Чтобы BT -адаптер не мешал при прошивке робота, он запитывается отдельно.

Перед включением, робота следует положить и не трогать, он подсчитает смещение нуля гироскопа, а когда замигает 13 светодиод ( D 13) (через 3 сек.) поднять его в положение балансировки.

Собственно пока все, программу прилагаю, схема робота в предыдущем ролике.

Забыл рассказать, за счет чего робот двигается:

,где — заданная скорость робота.

А повороты осуществляются смещением скоростей колес в разную сторону на константу.

Источник

Оцените статью