Как сделать робота на ардуино

1

Intro

После того, как стали популярными самобалансирующие скутеры Segway, я
всегда хотел создать нечто подобное. Вдохновившись ими, я решил построить Self Balancing Robot,
используя Arduino. Таким образом, я захотел понять основный принцип работы всех этих скутеров,
а также узнать, как работает алгоритм ПИД-регулирования.

Robot arduino

Как только я начал работу над ним, я понял, что этот робот — немного сложнее нежели я думал.
Существует так много подводных камней, которые
следует учитывать — тип батареи, положение батареи, сцепление с колесом, тип драйвера двигателя,
поддержание CoG (центр тяжести) и многое другое.

Но как только вы его сделаете, вы согласитесь, что это не так сложно,
как кажется. Итак, давайте посмотрим правде в глаза, в этом уроке я опишу свой опыт по созданию
робота для самостоятельной балансировки. Вы можете быть абсолютным новичком, который только
начинает работать или, возможно, приземлился здесь после долгого разочарования, когда питались заставить вашего робота балансировать.
Итак, давайте начнем …

2

Выбор електроники для вашего бота

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

  • Arduino UNO
  • Двигатели постоянного тока с редуктором – 2Nos
  • L298N Motor Driver Module
  • MPU6050
  • Пара колес
  • 7.4V Li-ion Battery
  • Купа проводов
  • Каркас напечатанный на 3D принтере

Контроллер: Контроллер, который я использовал здесь, это Arduino UNO, почему, потому что он просто прост в использовании. Вы также можете использовать Arduino Nano или Arduino mini, но я бы рекомендовал вам придерживаться UNO, так как мы можем запрограммировать его напрямую без какого-либо внешнего оборудования.

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

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

Колеса: не недооценивайте этих парней; Мне было трудно понять, что проблема была в моих колесах. Поэтому убедитесь, что ваши колеса хорошо сцеплены с полом, который вы используете.

Акселерометр и гироскоп: лучшим выбором акселерометра и гироскопа для вашего робота будет MPU6050. Поэтому не пытайтесь построить его с обычным акселерометром, например ADXL345, или что-то в этом роде, он просто не сработает. Вы узнаете, почему в конце этой статьи. Вы также можете использовать эту статью для изучения MPU6050 и его подключения к Arduino.

Battery: Нам нужна батарея как можно более легкая, а рабочее напряжение должно быть больше 5 В, чтобы мы могли напрямую управлять нашим Arduino без модуля повышения. Таким образом, идеальным выбором будет литий-полимерный аккумулятор 7.4V. Поскольку у меня была литий-ионная аккумуляторная батарея 7,4 В, я ее использовал. Но помните, что Li-po лучше, чем Li-ion.

Chassis: Еще одно место, где вы не должны идти на компромисс, — это шасси вашего робота. Вы можете использовать картон, дерево, пластик, с которым вы хорошо справляетесь. Но только убедитесь, что шасси прочное и оно не должно люфтить, когда робот пытается балансировать. Я разработал собственное шасси в программе Solidworks. Если у вас есть принтер, вы также можете распечатать проект, его файлы будут прикреплены внизу статьи.

3

3D-печать и сборка робота

Если вы решили напечатать то же самое шасси, которое я использую, чтобы построить моего робота, тогда скачайте STL-файлы. Я также добавил файлы проетка вместе с ним, чтобы вы также могли изменить его в соответствии с вашими предпочтениями.

Детали не имеют нависающих частей, поэтому вы можете легко распечатать их без каких-либо опор, а заполнение на 25% будет вполне достаточно. Конструкция довольно простая, и любой базовый принтер должен легко справиться с ее частями. Я использовал программное обеспечение Cura, чтобы подготовить модель и напечатать ее с помощью Tevo Tarantula, настройка показана ниже.

Вам придется распечатать одну часть корпуса, а также четыре части крепления двигателей. Сборка довольно проста; используйте гайки и болты 3 мм для крепления двигателя и шасси между собой. После сборки он должен выглядеть примерно так, как показано на рисунке ниже.

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

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

4

Принципиальная электрическая схема

Соединение частей этого робота между собой задача не сложная. Нам просто нужно подключить MPU6050 к Arduino и подключить двигатели, через модуль драйвера двигателя. Вся конструкция рассчитана на питание от литиево-ионного аккумулятора 7.4V. Схема показана ниже….

Модуль управления двигателем Arduino и L298N напрямую питается через вывод Vin и 12-вольтовый вход соответственно. Встроенный регулятор на плате Arduino преобразует входное напряжение 7.4V в 5V, и ATmega IC и MPU6050 будут питаться от него.

MPU6050 Pin Arduino Pin
Vcc +5V
Ground Gnd
SCL A5
SDA A4
INT D2

Двигатели постоянного тока могут работать от напряжения 5 В до 12 В. Но мы будем подключать положительный провод 7.4V от батареи до 12 В входного разъема модуля драйвера двигателя. Это заставит двигатели работать с 7.4V. В следующей таблице будет показано, как модуль драйвера двигателя L298N подключен к Arduino.

L298N Pin Arduino Pin
IN1 D6
IN2 D9
IN3 D10
IN4 D11

MPU6050 взаимодействует с интерфейсом Arduino через интерфейс I2C, поэтому мы используем штыри SPI A4 и A5 от Arduino. Двигатели постоянного тока подключаются к штырям PWM D6, D9 D10 и D11 соответственно. Нам нужно подключить их к контактам PWM, потому что мы будем контролировать скорость двигателя постоянного тока, изменяя рабочий цикл сигналов ШИМ. Если вы не знакомы с этими двумя компонентами, рекомендуется прочитать руководство по интерфейсу MPU6050 Interfacing и L298N Motor.

5

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

Теперь нам нужно запрограммировать нашу Arduino UNO, чтобы сбалансировать робота. Здесь происходит вся магия; концепция, стоящая за ней, проста. Мы должны проверить, наклоняется ли бот к передней или к задней части с помощью MPU6050, а затем, если он наклоняется к передней части, мы должны вращать колеса в прямом направлении, и если он наклоняется к задней части, мы должны вращать колеса в обратном направлении.

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

Чтобы узнать текущее положение бота, мы используем MPU6050, который представляет собой 6-осевой акселерометр и датчик гироскопа. Чтобы получить достоверное значение положения от датчика, нам нужно использовать значение как акселерометра, так и гироскопа, поскольку значения от акселерометра имеют проблемы с шумом, а значения из гироскопа со временем дрейфуют. Таким образом, мы должны объединить оба и получить значение шага рыскания и крена нашего робота, из которого мы будем использовать только значение рыскания.

Теперь у нас есть библиотеки, добавленные в нашу среду разработки Arduino. Давайте начнем программирование для нашего Self-балансирующего робота. Как и всегда, полный код для проекта приведен в конце этой страницы, здесь я просто объясняю наиболее важные фрагменты кода. Ранее сообщалось, что код построен поверх примера кода MPU6050, мы просто собираемся оптимизировать код для нашей цели и добавить PID и технологию управления для нашего самобалансирующегося робота.

Сначала мы включаем библиотеки, которые необходимы для работы этой программы. Они включают встроенную библиотеку I2C, библиотеку PID и библиотеку MPU6050, которые мы только что загрузили.

Затем мы объявляем переменные, которые необходимы для получения данных от датчика MPU6050. Мы читаем как значения гравитационного вектора, так и значения кватерниона, а затем вычисляем значение угла и угла поворота бота. Конечный результат будет иметь массив float ypr [3].

Далее идет очень важный сегмент кода, и именно здесь вы будете тратить много времени на настройку нужного набора значений. Если ваш робот построен с очень хорошим центром тяжести, а компоненты симметрично расположены (что в большинстве случаев нет), тогда значение вашего уставки будет равно 180. Просто подключите ваш бот к серийному монитору Arduino и наклоните его до положения балансировки, прочитайте значение, отображаемое на последовательном мониторе, и это ваше заданное значение. Значение Kp, Kd и Ki должно быть настроено в соответствии с вашим ботом. Никакие два одинаковых бота не будут иметь одинаковых значений Kp, Kd и Ki, поэтому от него не уйти.

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

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

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

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

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

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

6

Работа робота Self Balancing Arduino

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

Arduino serial terminal

Здесь мы видим входные и выходные значения ПИД-алгоритма в формате input => output. Если бот отлично сбалансирован, значение выхода будет равно 0. Входное значение — это текущее значение от датчика MPU6050. Символ «F» означает, что бот движется вперед, а «R» означает, что бот обратно.

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

Надеюсь, это поможет создать собственный робот-балансировщик =).

Похожие публикации

Комментарии