Меню

Самобалансирующийся робот своими руками

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

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

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

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

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



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

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

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

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

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

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


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

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

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

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

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

5,

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

9,

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

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

12,

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

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

15

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

16.

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

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

17,

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

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

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

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

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

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

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

23,

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

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

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

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

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

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

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

28 28

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

Читайте также:  Реставрация медного самовара своими руками

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

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

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

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

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

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

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

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

Источник

Самобалансирующийся робот на Arduino Uno

diy self balancing robot using arduino

Оказалось, что создание подобного робота является задачей не из легких и дело здесь не ограничивается правильным выбором двигателей для робота и ввода необходимых значений в алгоритм PID. Оказалось, что для создания подобного рода необходимо учитывать и много других вещей, например, тип батареи, позиция батареи, захват колеса, тип драйвера мотора, поддержание центра тяжести и многое другое. Но мы все таки попробуем создать такого робота. Итак, начнем.

Необходимые компоненты

Микроконтроллер: в качестве управляющего микроконтроллера в данном проекте мы выбрали плату 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, установки для печати компонентов показаны на следующем рисунке.

manual setting in cura for self balancing robot

Вам необходимо напечатать скелет робота и 4 компонента для крепления двигателей. Для сборки робота можно использовать 3 мм болты (шурупы). После сборки у вас должна получиться конструкция примерно следующего вида:

assembled diy self balancing robot using arduino

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

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

circuit hardware for diy self balancing robot using arduino

Работа схемы

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

circuit diagram for diy self balancing robot using arduino

Как видите, схема достаточно проста и в ней вам всего лишь необходимо подключить гироскоп 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 на вашем компьютере.

Читайте также:  Ремонт мехатроника dsg 7 своими руками

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

Источник

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

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

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

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

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

robot balans

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

naklon robota

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

Схема робота

shema robota

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

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

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

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

osnova robota

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

plata robota

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

driver

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

koleso

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

robot balans 1

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

Теория

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

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

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

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

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

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

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

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

Источник

Adblock
detector