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

Нам кажется что многие из вас находятся под сильным впечатлением от быстро развивающихся технологий современного мира, одними из впечатляющих технологий современности являются двигатели от RYNO и самобалансирующиеся скутеры от Segway. Мы думаем, что многих из вас посещала мысль создать что либо подобное. Поэтому в данной статье мы рассмотрим создание DIY (самодельного, своими руками) самобалансирующегося робота на основе платы Arduino. Во многом принципы работы данного робота будут основаны на алгоритмах PID (PID — proportional, integral, derivative — пропорционально-интегрально-дифференцирующий (ПИД) регулятор),  используемых для построения самобалансирующихся скутеров.

Внешний вид самобалансирующегося робота на Arduino Uno

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

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

  1. Плата Arduino Uno.
  2. Приводной двигатель постоянного тока желтого цвета (Geared DC motor (Yellow coloured) ) – 2 шт.
  3. Модуль драйвера мотора L298N (L298N Motor Driver Module).
  4. Гироскоп MPU6050.
  5. Два колеса.
  6. 7.4V Li-ion Battery (литий-ионная батарея).
  7. Соединительные провода.
  8. Напечатанный на 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, установки для печати компонентов показаны на следующем рисунке.

Настройки 3D печати для компонентов самобалансирующегося робота

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

Конструкция робота после сборки

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

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

Альтернативная конструкция самобалансирующегося робота

Работа схемы

Схема самобалансирующегося робота на основе платы 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 на вашем компьютере.

https://github.com/br3ttb/Arduino-PID-Library/blob/master/PID_v1.h
https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050

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

Первым делом в программе мы должны подключить используемые библиотеки — I2C library, PID Library и MPU6050 Library (последние две мы как раз скачали).

Затем мы объявим переменные, которые будут нам необходимы для получения данных с датчика MPU6050. Мы будем считывать и вектор гравитации, и значения кватерниона, и затем вычислять значения yaw (отклонение от курса), pitch (угол наклона) и roll (вращение) для нашего робота. Наглядная картинка про все эти параметры, чтобы вам было лучше понятно, есть в статье про подключение гироскопа MPU6050 к плате Arduino. Эти три параметра будут записываться в результирующий массив вещественного типа float ypr[3].

Далее необходимо настроить параметры, которые позволят роботу балансировать – на это может уйти достаточно продолжительное время. Если ваш робот создан с «идеальным» центром тяжести и все его компоненты симметрично расположены на нем (хотя в большинстве случаев это не будет выполняться), тогда исходной точке setpoint можно установить значение 180. Если это не так, то подсоедините вашего робота кабелем к компьютеру, наклоняйте его постоянно из стороны в сторону до тех пор пока не добьетесь состояния идеального баланса – все это контролируйте с помощью монитора последовательной связи (serial monitor) и когда добьетесь состояния баланса, это и будет ваше значения setpoint. Также во время этих манипуляций необходимо определить и значения параметров Kp, Kd и Ki для вашего робота. Даже для двух одинаковых с виду роботов эти значения будут отличаться. Более подробно весь процесс определения данных параметров показан на видео, приведенном в конце статьи.

В следующей команде мы инициализируем вызов алгоритма PID, передав ему в качестве входных переменных input, output, set point, Kp, Ki и Kd. Значения параметров set-point Kp, Ki и Kd мы уже установили выше в программе. Значение параметра input будет текущим значением yaw (отклонение от курса), которое считывается с гироскопа MPU6050. А значение параметра output будет рассчитываться с помощью PID алгоритма. Этот параметр output будет рассчитываться PID алгоритмом чтобы потом на его основе скорректировать значение параметра input чтобы оно было как можно ближе к исходной точке (set point).

Внутри функции void setup мы инициализируем датчик MPU6050 при помощи конфигурации DMP (Digital Motion Processor – процессор цифрового движения). Это поможет нам в объединении данных акселерометра и гироскопа и обеспечить надежные (стабильные) значения Yaw, Pitch и Roll. Мы не будем слишком глубоко погружаться в эту проблему из-за ограниченности объема статьи. Еще в функции void setup необходимо установить значения сдвига для гироскопа. Каждый датчик MPU6050 имеет свои значения сдвига, для определения которых можно использовать соответствующий скетч для Arduino, после их определения необходимо внести соответствующие изменения в программу.

Также мы должны инициализировать контакты ШИМ, которые используются нами для подключения двигателей. В нашем случае это контакты D6, D9, D10 и D11. Мы зададим для этих контактов режим работы на вывод данных и запишем в них по умолчанию значения напряжений низкого уровня (LOW).

Внутри основной функции loop мы будем проверять готовы ли к считыванию данные из датчика MPU6050. Если готовы, то мы будем использовать их для вычисления значения PID и отображать значения input и output из алгоритма PID в окне монитора последовательной связи для целей отладки проекта. Затем, основываясь на значении output мы будем решать необходимо ли роботу двигаться вперед или назад или оставаться на месте.

Мы будем предполагать что датчик MPU6050 будет возвращать значение 180 когда робот находится в строго вертикальном положении. Мы будем получать положительные корректировочные значения когда робот будет падать (заваливаться) вперед и отрицательные корректировочные значения когда робот будет падать (заваливаться) назад. Мы будем проверять эти значения и вызывать соответствующие функции чтобы робот начал движение вперед или назад.

Переменная output с выхода PID алгоритма также определяет как быстро двигатель должен вращаться. Если робот только начала падать мы осуществляем незначительную коррекцию медленно вращая колеса. Если эта незначительная коррекция не помогла и робот продолжает падать мы увеличиваем скорость вращения двигателя. Значение скорости, с которой должны вращаться колеса, определяется PID алгоритмом. При этом в функции вращения колес в обратную сторону (назад) мы просто умножаем значение переменной output на -1 чтобы преобразовать отрицательные значения в положительные.

Тестирование работы самобалансирующегося робота

Тестирование работы робота

После того как вы соберете всю конструкцию загрузите код программы в плату Arduino. Проверьте надежность всех соединений и после этого можете подавать питание на схему. Также откройте окно монитора последовательной связи (serial monitor). Если плата Arduino успешно взаимодействует с датчиком MPU6050 и все работает так, как это и задумывалось, вы должны увидеть на экране монитора примерно следующую картину:

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

На экране мы видим входные и выходные значения PID алгоритма в формате input => output. Если у робота отличный (совершенный) баланс, то значение переменной output будет равно 0. Входное значение (input) – это текущее значение с датчика MPU6050. Буква “F” на экране монитора будет обозначать что робот движется вперед, а “R” – назад.

Во время первоначальных этапов работы PID алгоритма мы рекомендуем оставить подключенным кабель к плате Arduino чтобы вам было просто контролировать значения переменных input и output, а также скорректировать значения параметров Kp, Ki и Kd чтобы потом загрузить их уточненные значения с программой в плату Arduino. Более подробно все эти процессы показаны на видео, приведенном в конце статьи.

Надеемся, что приведенная статья поможет вам в конструировании собственного самобалансирующегося робота.

Исходный код программы (скетча)

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

Видео, демонстрирующее работу робота

Видео как правильно настраивать значения для PID алгоритма

Источник статьи

(Проголосуй первым!)
Загрузка...
44 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *