Балансирующий робот на ардуино с управлением блютуз
Собрав первого робота, необходимо осваивать более сложные темы и задачи. И прежде чем ребята столкнутся с освоением летательных дронов необходимо им изучить более простую тему, - построение балансирующего робота.
Сборка балансирующего робота в лаборатории детской робототехники Сборка балансирующего робота в лаборатории детской робототехникиВ чем сложность создания летательных роботов? Дело в том, что на практике, ребята сталкиваются с задачами пространственного управления по трем осям X, Y, Z и достаточно сложной математикой. И для более легкого освоения этой темы я создал курс балансирующих роботов, где управление происходит лишь по одной оси и гораздо легче происходит понимание задачи баланса и техники управления движением робота.
Этот курс я даю для учеников, собравших первого робота и получивших опыт в программировании на курсе по сборке манипулятора . Об этом курсе я уже писал ране в своей статье . Повторюсь, что он необходим для освоения практики механики (сборка манипулятора требует хорошей усидчивости и аккуратности в сборке) и программирования по разным осям, управляемыми 4-5 сервоприводами. Программирование происходит в графическом интерфейсе Scratch-программ, позволяющего осваивать задачу в более простой и удобной форме освоения, нежели более сложное на С++, описываемого практически во всех книгах по изучению Ардуино.
Сразу оговорюсь, при изучении курса создания балансирующего робота, есть первый этап, который проходят все ребята, изучающие этот курс и более сложный - второй этап. На нем происходит более сложная техника управления балансирующим роботом.
Изучение техники управления балансирующим роботом начинается с освоения модуля акселерометра-гирокомпаса MPU-6050. Он очень популярен и в дальнейшем ребята столкнутся с ним на следующем курсе по созданию летательных робота, где он используется в полном объеме.
Здесь же потребуется лишь часть данных получаемых с этого модуля, а точнее значения акселерометра и гирокомпаса по одной оси (Х или Y, в зависимости от того, как был закреплен сам модуль на роботе).
Мы не уходим в сложные формулы, где вычисляются углы, линейный ускорения и т.п., в изобилии присутствующих в учебниках по этой теме. Я эту тему приподношу в более простой форме, как значение акселеромета, изменяемого при отклонении от вертикали робота от +8000 до -8000 (при параметре 4g) который при необходимости можно перевести в угол отклонения просто разделив значение на 90. Условно, но на практике удобно в применении.
Далее, всё управление заключается в направлении движением колес и скорости. Это простой первый вариант прохождения курса.
При более сложном варианте прохождения курса изучается второй параметр - показание гирокомпаса, углового ускорения, которое для простоты понимания имеет связь - резче отклоняется, больше значение по гирокомпасу. Этот параметр привязывается к управлению скоростью колес, которые необходимо больше увеличивать, чем резче начинается отклонение от вертикали.
Если у вас есть свой опыт в изучении задачи управления балансом для робота, пишите в комментариях, мне будет интересно услышать ваш опыт.
С уважением к читателям и подписчикам канала,
Михалев СИ, руководитель конструкторского бюро и лабораторий детской робототехники
Мне давно не давало покоя желание рассчитать какой-нибудь достаточно сложный механизм и воплотить его жизнь.
Выбор пал на задачу об обратном маятнике. Итог на видео:
Математическая модель
Я не буду приводить вывод уравнений движения, все таки это третий курс института. Для тех же, кому интересен вывод, в конце статьи ссылка, где он описан подробнее.
Систему представим в следующем виде:
Маятник это масса mp прикрепленная на конце невесомого стержня длины l. На другой конец стержня прикреплен двигатель, развивающий максимальный момент Mk и передающий его на колесо массой mw и радиусом r.
Задача управления — стабилизировать маятник в вертикальном положении и возвращать в начальное положение колесо.
Уравнения движения, описывающие обратный маятник, представимы в следующем виде:
Они кажутся довольно неприятными, но сам робот о них ничего не знает, а управление использует линеаризованную модель, то есть такую:
Синтезирование управления
Завидую людям, у которых работает PID-регулятор. Я потратил несколько часов на подгонку его коэффициентов, но так и не сумел добиться стоящего результата. Научный руководитель посоветовал воспользоваться линейно-квадратичным регулятором(вики). Этот регулятор, в отличие от PID-регулятора, представляет собой просто произведение своих коэффициентов на ошибки по каждой координате. Никаких дискретных аналогов производной и интеграла. Однако для его вычисления нужна модель системы и умение решать уравнение Риккати, ну или Matlab.
В матлабе расчет регулятора представляет собой такой набор команд:
Здесь матрицы A и B — соответствующие матрицы из линеаризованной модели с подставленными значениями реального робота.
Матрица Q определяет на сколько нужно штрафовать систему за отклонение от начала координат, заметьте, в нашем случае в координаты входят скорости.
Матрица R определяет на сколько нужно штрафовать систему за растрату энергии управлением.
В переменной K будут лежать коэффициенты регулятора.
Симуляция
В Matlab simulink можно легко эмулировать систему, если кому-нибудь необходимо ссылка на репозитарий с математической моделью в конце статьи. Здесь же я только приведу графики.
Угол отклонения маятника:
Угол отклонения колеса:
Момент двигателя:
Реализация в железе
Сам каркас робота это алюминиевые профиля 12мм и 14мм, они входят друг в друга. Соединены заклепками. Электроника прикреплена на кусок стеклотекстолита в форме буквы T. Моторы так же прикреплены через стеклотекстолитовый переходник.
Изначально я пытался использовать такие моторы:
Их крутящий момент 2,2кг*см или 0.2Нм. Исходя из симуляции нам нужно гораздо больше, поэтому были выбраны другие моторы:
ссылка на производителя
Максимальный крутящий момент 14кг*см или 1.4Нм. Тока они потребляют до 5A, поэтому популярный у ардуинщиков L293D тут не подойдет.
Для определения угла и угловой скорости используется IMU — гироскоп и акселерометр. У меня завалялась плата с гироскопом L3G и акселерометром с магнетометром LSM303. Подобных плат очень много и я не стану приводить код получения значений сенсоров. Однако показания датчиков нужно отфильтровать, так как гироскоп постоянно уходит, а акселерометр шумит и сильно врет, если робот начинает двигаться не меняя угла.
Используют разные фильтры, но наиболее популярны фильтр Калмана и RC-фильтр (complementary filter). Я использую такой код:
Работает не идеально, но достаточно хорошо для данной задачи.
Следующий сенсор — квадратурный энкодер на моторе. Он генерирует прямоугольные импульсы на 2х своих выводах:
Считать их можно либо прерываниями, либо считыванием значений в цикле. На arduino playground есть замечательная статья с примерами кода.
Осталось получить угловую скорость колеса. Тут на помощь приходит школьная формула пройденное расстояние/затраченное время.
ToPhiRad переводит количество тиков энкодера в угол колеса, мой энкодер выдает около 2240 тиков на оборот. Чтобы получить угол нужно умножить тики на 2 Пи и разделить на их количество при полном обороте колеса.
Показания сенсоров поступают в LQR регулятор:
Коэффициенты взяты из Matlab, правда для большей стабильности я подправил 2 первых коэффициента.
Мой драйвер, вернее его библиотека, принимает значения от -400 до 400. Я предположил, что на 400 он выдает на мотор 12В, т.е. мотор развивает максимальный момент (1.4Нм). Разделив 400 на 1.4 получаем коэффициент перевода из Нм, которые выдает LQR, в значения, понятные драйверу.
Просто стабилизировать робота в одной точке не очень интересно, поэтому к нему добавился BT-модуль HC-05. Модуль подключается к серийному порту микроконтроллера. Он работает на 3.3В, а arduino на 5В, поэтому подключать принимающий вход модуля надо через делитель напряжения. Вот схема подключения:
Во время цикла микроконтроллер опрашивает модуль на предмет символов:
В конечном итоге показания сенсоров поступают в регулятор, а его управление и воздействие пользователя поступают на моторы:
Раз в 50 миллисекунд посылается телеметрия-угол робота:
Добавляем радиоуправление
Управлять будем с телефона под android.
При запуске приложения попросим пользователя выбрать к кому подключаться, bt-модуль должен быть уже сопряжен с телефоном (стандартный код 1234).
После выбора устройства подключимся к нему:
После подключения стартует поток, который занимается коммуникацией между приложением и роботом:
balancerView это потомок класса SurfaceView, он занимается выводом на экран текущего положения робота.
Вот его метод перерисовки:
Команды роботу посылаются при появлении событий onTouch, чтобы можно было управлять роботом удерживая кнопку.
Заключение
Самое приятное во всей постройке это то, что математическая модель сошлась с физической реализацией. Сама постройка железки не представляет из себя какой-то сложности, однако подбор правильных моторов, высоты робота, массы груза сверху и синтезирование управления довольно интересная задача.
Как и обещал вывод уравнений движения перевернутого маятника на колесе: Вывод уравнений и немного о постройке
репозитарий на GitHub
Рассказываем о том как можно использовать Ардуино для создания самобалансирующего робота, который балансирует как Сигвей.
Как работает балансировка?
Сигвей от англ. Segway – двухколесное средство передвижения стоя, оснащенное электроприводом. Еще их называют гироскутерами или электрическими самокатами.
Вы когда-нибудь задумывались, как работает Сигвей? В этом уроке мы постараемся показать вам, как сделать робота Ардуино, который уравновешивает себя точно так же, как Segway.
Чтобы сбалансировать робота, двигатели должны противодействовать падению робота. Это действие требует обратной связи и корректирующих элементов.
Элемент обратной связи - гироскоп-акселерометр MPU6050, который обеспечивает как ускорение, так и вращение во всех трех осях (основы MP26050 I2C). Ардуино использует это, чтобы знать текущую ориентацию робота. Корректирующим элементом является комбинация двигателя и колеса.
В итоге должен получиться примерно такой друг:
Схема робота
Сначала подключите MPU6050 к Ардуино и проверьте соединение, используя коды в этом учебном руководстве по интерфейсу IMU. Если данные теперь отображаются на последовательном мониторе, вы молодец!
Внимание! Если вы планируете использовать напряжение питания более 12 В для модуля L298N, вам необходимо удалить перемычку чуть выше входа +12 В.Создание робота
Корпус робота изготовлен в основном из акрилового пластика с двумя редукторными двигателями постоянного тока:
Основная печатная плата, состоящая из Arduino Nano и MPU6050:
Модуль драйвера двигателя L298N:
Мотор редуктора постоянного тока с колесом:
Самобалансирующийся робот по существу является перевернутым маятником. Он может быть лучше сбалансирован, если центр массы выше относительно колесных осей. Высший центр масс означает более высокий момент инерции массы, что соответствует более низкому угловому ускорению (более медленное падение). Вот почему мы положили батарейный блок на верх. Однако высота робота была выбрана исходя из наличия материалов 🙂
Завершенный вариант самостоятельно балансирующего робота можно посмотреть на рисунке выше. В верхней части находятся шесть Ni-Cd-батарей для питания печатной платы. В промежутках между моторами используется 9-вольтовая батарея для драйвера двигателя.
Теория
В теории управления, удерживая некоторую переменную (в данном случае позицию робота), требуется специальный контроллер, называемый ПИД (пропорциональная интегральная производная). Каждый из этих параметров имеет «прирост», обычно называемый Kp, Ki и Kd. PID обеспечивает коррекцию между желаемым значением (или входом) и фактическим значением (или выходом). Разница между входом и выходом называется «ошибкой».
ПИД-регулятор уменьшает погрешность до наименьшего возможного значения, постоянно регулируя выход. В нашем самобалансирующем роботе Arduino вход (который является желаемым наклоном в градусах) устанавливается программным обеспечением. MPU6050 считывает текущий наклон робота и подает его на алгоритм PID, который выполняет вычисления для управления двигателем и удерживает робота в вертикальном положении.
PID требует, чтобы значения Kp, Ki и Kd были настроены на оптимальные значения. Инженеры используют программное обеспечение, такое как MATLAB, для автоматического вычисления этих значений. К сожалению, мы не можем использовать MATLAB в нашем случае, потому что это еще больше усложнит проект. Вместо этого мы будем настраивать значения PID. Вот как это сделать:
- Сделайте Kp, Ki и Kd равными нулю.
- Отрегулируйте Kp. Слишком маленький Kp заставит робота упасть, потому что исправления недостаточно. Слишком много Kp заставляет робота идти дико вперед и назад. Хороший Kp сделает так, что робот будет совсем немного отклоняться назад и вперед (или немного осциллирует).
- Как только Kp установлен, отрегулируйте Kd. Хорошее значение Kd уменьшит колебания, пока робот не станет почти устойчивым. Кроме того, правильное Kd будет удерживать робота, даже если его толькать.
- Наконец, установите Ki. При включении робот будет колебаться, даже если Kp и Kd установлены, но будет стабилизироваться во времени. Правильное значение Ki сократит время, необходимое для стабилизации робота.
Поведение робота можно посмотреть ниже на видео:
Код Ардуино самобалансирующего робота
Нам понадобилось четыре внешних библиотеки, для создания нашего робота. Библиотека PID упрощает вычисление значений P, I и D. Библиотека LMotorController используется для управления двумя двигателями с модулем L298N. Библиотека I2Cdev и библиотека MPU6050_6_Axis_MotionApps20 предназначены для чтения данных с MPU6050. Вы можете загрузить код, включая библиотеки в этом репозитории.
Значения Kp, Ki, Kd могут работать или не работать. Если они этого не делают, выполните шаги, описанные выше. Обратите внимание, что наклона в коде установлен на 173 градуса.
Вы можете изменить это значение, если хотите, но обратите внимание, что это угол наклона, которым должен поддерживаться роботом. Кроме того, если ваши двигатели слишком быстры, вы можете отрегулировать значения:
Нам кажется что многие из вас находятся под сильным впечатлением от быстро развивающихся технологий современного мира, одними из впечатляющих технологий современности являются двигатели от RYNO и самобалансирующиеся скутеры от Segway. Мы думаем, что многих из вас посещала мысль создать что либо подобное. Поэтому в данной статье мы рассмотрим создание DIY (самодельного, своими руками) самобалансирующегося робота на основе платы Arduino. Во многом принципы работы данного робота будут основаны на алгоритмах PID (PID - proportional, integral, derivative - пропорционально-интегрально-дифференцирующий (ПИД) регулятор), используемых для построения самобалансирующихся скутеров.
Оказалось, что создание подобного робота является задачей не из легких и дело здесь не ограничивается правильным выбором двигателей для робота и ввода необходимых значений в алгоритм PID. Оказалось, что для создания подобного рода необходимо учитывать и много других вещей, например, тип батареи, позиция батареи, захват колеса, тип драйвера мотора, поддержание центра тяжести и многое другое. Но мы все таки попробуем создать такого робота. Итак, начнем.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Приводной двигатель постоянного тока желтого цвета (Geared DC motor (Yellow coloured) ) – 2 шт.
- Модуль драйвера мотора L298N (L298N Motor Driver Module) (купить на AliExpress).
- Гироскоп MPU6050 (купить на AliExpress).
- Два колеса.
- 7.4V Li-ion Battery (литий-ионная батарея или литий-полимерная батарея) (купить на AliExpress).
- Соединительные провода.
- Напечатанный на 3D принтере скелет (остов) робота.
Микроконтроллер: в качестве управляющего микроконтроллера в данном проекте мы выбрали плату Arduino UNO потому что с ней просто работать. Вы можете также использовать платы Arduino Nano или Arduino mini, но мы все таки рекомендовали использовать бы Arduino UNO потому что ее можно программировать без использования внешнего аппаратного обеспечения.
Двигатели: конечно, лучшим выбором для построения самобалансирующегося робота были бы шаговые двигатели, но в целях упрощения проекта мы использовали приводные двигатели (gear motor) постоянного тока желтого цвета – они значительно проще и дешевле чем шаговые.
Драйвер мотора (Motor Driver): если вы, как и мы, выбрали приводные двигатели постоянного тока, то вы можете использовать модуль драйвера мотора L298N или даже L293D (с ним проект будет также работать отлично). Более подробно об управлении электродвигателем постоянного тока с помощью платы Arduino и драйвера мотора L293D можно прочитать в этой статье.
Колеса: не стоит недооценивать эти элементы конструкции робота. У нас достаточно долго не получалось настроить баланс робота пока мы не поняли что проблема состоит в колесах. Колеса для построения самобалансирующегося робота должны иметь очень хорошее сцепление с полом и ни в коем случае они не должны проскальзывать при движении по полу.
Акселерометр и гироскоп: наилучшим выбором в качестве акселерометра и гироскопа для нашего проекта будет модуль MPU6050 – на нашем сайте вы можете прочитать статью о его подключении к плате Arduino. Ни в коем случае не пытайтесь создать подобного робота с использованием обычного акселерометра, например, ADXL345 или подобного ему – это не будет работать. Более подробно объяснение этого фактора будет приведено в конце статьи.
Батарея: для проекта необходима батарея, которая по возможности будет максимально легкой и ее напряжение должно быть больше 5V чтобы мы могли запитать от нее плату Arduino непосредственно, без использования повышающего напряжения модуля. Идеальным выбором в данном случае будет 7.4V Li-polymer (литий-полимерная) батарея. Но в нашем распоряжении была только 7.4V литий-ионная батарея, поэтому мы ее и использовали при создании робота. Но помните о том, что литий-полимерная батарея в данном случае будет все таки лучше чем литий-ионная.
Шасси робота: еще один элемент робота, при создании которого неуместны компромиссы. Для изготовления шасси робота вы можете использовать листы картона, дерево, пластик и т.п. Но помните о том, что шасси должно быть достаточно прочным и не изгибаться когда робот пытается балансировать. Мы для изготовления шасси робота использовали 3D принтер, ссылки на необходимые файлы для него будут приведены далее в статье.
3D печать и сборка шасси робота
Если вы хотите использовать (напечатать) то же самое шасси, которое использовали и мы, то вы можете скачать необходимые для его печати STL файлы с сервиса thingiverse. Мы также добавили туда файлы дизайна чтобы вы могли изменить внешний вид компонентов шасси по своему желанию.
Компоненты данного шасси робота не имею нависающих структур, поэтому вы без особых проблем можете напечатать их на практически любом 3D принтере. Мы для этой цели использовали программное обеспечение Cura и 3D принтер Tevo Tarantula, установки для печати компонентов показаны на следующем рисунке.
Вам необходимо напечатать скелет робота и 4 компонента для крепления двигателей. Для сборки робота можно использовать 3 мм болты (шурупы). После сборки у вас должна получиться конструкция примерно следующего вида:
Изначально дизайн робота предусматривал размещение модуля драйвера мотора L298N в нижнем отсеке робота и батарею на его верху как показано на приведенном выше рисунке. Этот дизайн робота также является рабочим и вы можете его использовать, в этом случае вы можете непосредственно скрепить части робота, используя специально выделенные для этого отверстия.
Но мы в дальнейшем решили немного изменить дизайн робота и поменяли место расположения батареи и платы Arduino UNO для упрощения ее программирования. Для обеспечения соединений в схеме мы использовали перфорированную плату. Внешний вид самобалансирующегося робота для данного расположения элементов показан на следующем рисунке.
Работа схемы
Схема самобалансирующегося робота на основе платы Arduino UNO представлена на следующем рисунке.
Как видите, схема достаточно проста и в ней вам всего лишь необходимо подключить гироскоп MPU6050 и драйвер мотора к плате Arduino, а также соединить двигатели с драйвером мотора. Схема запитывается от литий-ионной батареи на 7.4V.
Плата Arduino и модуль драйвер мотора L298N непосредственно запитываются через контакты Vin и 12V соответственно. Встроенный в плату Arduino регулятор напряжения преобразует входное напряжение 7.4V в напряжение 5V, с помощью которого и запитывается микроконтроллер ATmega на плате и гироскоп MPU6050. Электродвигатели постоянного тока могут запитываться от напряжения от 5V до 12V, в нашем случае они будут работать от напряжения 7.4V.
Распиновка подключения контактов гироскопа MPU6050 представлена в следующей таблице.
MPU6050 | контакт Arduino |
Vcc | +5V |
Ground | Gnd |
SCL | A5 |
SDA | A4 |
INT | D2 |
Распиновка подключения контактов драйвера мотора L298N представлена в следующей таблице.
L298N | контакт Arduino |
IN1 | D6 |
IN2 | D9 |
IN3 | D10 |
IN4 | D11 |
Гироскоп MPU6050 взаимодействует с платой Arduino через интерфейс I2C, поэтому для его подключения мы использовали SPI контакты A4 и A5 платы Arduino. Двигатели постоянного тока управляются с помощью ШИМ (широтно-импульсная модуляция) контактов D6, D9, D10 и D11. ШИМ сигнал в данном случае необходим для управления скоростью вращения двигателей.
Программирование самобалансирующегося робота
Как мы уже видели, схема нашего проекта достаточно проста, но вся "магия" нашего проекта будет как раз заключаться в его программе для платы Arduino UNO. В программе мы с помощью гироскопа MPU6050 будем проверять наклоняется ли робот вперед или назад. Если робот будет наклоняться вперед, то нам необходимо вращать колеса в прямом направлении (прямо) для удержания баланса, а если он будет наклоняться назад, то нам необходимо будет вращать колеса в обратном направлении.
В это же самое время мы должны будем управлять скоростью вращения колес – если робот будет слегка дезориентирован от центрального положения колеса будут вращаться немного медленнее и скорость будет увеличиваться по мере удаления от центрального положения. Для управления подобной логикой робота мы использовали PID алгоритм, в котором центральное положение рассматривается как исходная точка, а уровень дезориентации является выходом.
Для определения текущего положения робота в нашем проекте мы используем модуль MPU6050, который является 6-осевым акселерометром и гироскопом одновременно. Для того чтобы получить надежное значение позиции робота нам необходимо получать значения одновременно и от акселерометра, и от гироскопа поскольку значения от акселерометра обычно зашумлены, а значения от гироскопа имеют тенденцию смещаться (дрифтовать) с течением времени. То есть в программе мы будем комбинировать значения с контактов yaw, pitch и roll гироскопа, а использовать будем только значение с выхода yaw.
На первый взгляд задача создания подобного робота в домашних условиях звучит как невозможная, неправда ли? Но благодаря сообществу Arduino у нас в распоряжении уже есть готовая библиотека, способная выполнять вычисления по алгоритму PID, а также библиотека для работы с гироскопом MPU6050. Эти библиотеки разработаны авторами br3ttb и jrowberg соответственно. Перед началом написания программы вам необходимо их скачать по ниже приведенным ссылкам и добавить в папку с библиотеками Arduino на вашем компьютере.
После того, как эти библиотеки добавлены в соответствующую папку, приступим к написанию программы для нашего самобалансирующегося робота. Полный код программы для этого робота приведен в конце данной статьи, здесь же сначала рассмотрим наиболее важные фрагменты этого кода.
Первым делом в программе мы должны подключить используемые библиотеки - I2C library, PID Library и MPU6050 Library (последние две мы как раз скачали).
Читайте также: