- Робот балансир на ардуино
- Нам понадобится:
- Собираем балансирующего робота на шаговых моторах
- Основная идея: собрать робота, который сможет держать равновесие на двух колесах. Под сборкой подразумевается конструирование и программа балансировки.
- Программные листинги
- Но мне хотелось большего, что-бы он свободно ездил и при этом делал это плавно и грациозно. Я проводил вечера пробуя различные механики на роботе с коллекторными редукторными моторами. Кое-что получалось, но не было идеала, не было стабильности. Впрочем что говорить, посмотрите ролики про этих роботов начиная со сборки:
- Начинаю использовать шаговики
- Собственно чего стесняться, приведу ролик про сборку данного робота:
- Комплектующие для балансирующего робота
- Математические выкладки
Робот балансир на ардуино
Октябрь 14, 2017
Нам понадобится:
Для изготовления корпуса для балансира я взял картон. Картон был довольно тонкий и я склеивал несколько листов, для увеличения прочности конструкции.
Размер боковин балансира указан на фото:
Таких деталей должно быть две, но с учетом того что картон тонкий, я их сделал 4 и склеил между собой термопистолетом.
С вертикальными частями разобрались, теперь нужно сделать 3 горизонтальных. Я их склеивал тоже между собой, поэтому сделал вот таких частей 6 шт.:
После склейки должна получиться лесенка. Все детали я склеивал между собой термоклеем, картон он очень хорошо склеивает.
Моторредукторы я крепил на стяжки к боковинам получившейся “лесенки”
Драйвер двигателей, я разместил на самую нижнюю полку получившейся конструкции.
При подключении самих моторов к драйверу, важно подобрать правильную полярность, чтоб моторы крутились именно в ту сторону, в которую нужно чтоб они крутились для удерживания ровновесия.
Наши “мозги” Ардуино и гироском Mpu 6050 я установил на среднюю полку, чтоб было не сложно дотянуться и до драйвера двигателей и до аккумуляторов.
ВАЖНО: Гироскоп нужно расположить ровно в плоскости, иначе роботу будет тяжело держать равновесие.
Ну и сами аккумуляторы прикрепил на стяжки в самом верху конструкции.
После размещения всех элементов и подключения их друг с другом проводами, Робот выглядит вот таким вот образом.
После того как мы разобрались с конструкцией робота, давайте перейдем к электронной части, а именно к схеме подключения элементов.
Ну и собственно сам скетч:
Для корректной работы скетча нам еще понадобятся две библиотеки kalman и PID_v1
Ну и собственно демонстрация работы:
Источник
Собираем балансирующего робота на шаговых моторах
Основная идея: собрать робота, который сможет держать равновесие на двух колесах. Под сборкой подразумевается конструирование и программа балансировки.
Программные листинги
Проблемой балансировки я занялся сравнительно давно, а если точно около двух лет назад. Стумулом к этому послужило написание книги «Мобильные роботы на базе arduino». Мне хотелось разобраться с балансировкой и я включил подобную главу в план книги, не имея никакого представления о том, как я буду конструировать. В дальнейшем именно данная глава, а точнее эксперименты с роботом, отняли множество моих сил, но робот был создан, он стоял на двух колесах и не падал, балансируя.
Но мне хотелось большего, что-бы он свободно ездил и при этом делал это плавно и грациозно. Я проводил вечера пробуя различные механики на роботе с коллекторными редукторными моторами. Кое-что получалось, но не было идеала, не было стабильности. Впрочем что говорить, посмотрите ролики про этих роботов начиная со сборки:
Начинаю использовать шаговики
Идея конструирования колесных роботов на шаговых моторах не новая, но для меня все было в первый раз.
Я посоветовался с теми, кто уже пробовал делать подобных роботов, но брать чужие механики за основу не стал. Меня заводила именно идея конструирования и моделирования ПО для робота самотсоятельно.
Надеясь сэкономить на шаговых моторах я приобрел пару довольно хороших но маломощных моторов, их я использовал в статье ранее. Смоделил и распечатал пару колес, и смоделировал и вырезал из фанеры корпус:
Первоначальные схемы робота я привожу:
В дальнейшем моторы были заменены на более мощные NEMA 17 (17hs4401) с номинальным током 1.7А и резистивным сопротивлением обмоток 1.8Ом . У старых двигателей номинальный ток был неизвестен, а вот сопротивление обмоток было около 26 Ом, что непозволяло мотору развивать достаточную мощность.
Собственно чего стесняться, приведу ролик про сборку данного робота:
Комплектующие для балансирующего робота
Математические выкладки
Длина шага моего робота при настройке делителя шага на 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 сек.) поднять его в положение балансировки.
Собственно пока все, программу прилагаю, схема робота в предыдущем ролике.
Забыл рассказать, за счет чего робот двигается:
,где
— заданная скорость робота.
А повороты осуществляются смещением скоростей колес в разную сторону на константу.
Источник