Гонки по линии на маркерной доске
Гонки по линии на земле — слишком скучно!
Мы попробовали перенести классическую задачу езды робота по линии в другую плоскость: на магнитно-маркерную доску.
Шаг 1. Что понадобится
Чтобы собрать одного гоночного робота, нам понадобятся:
Шасси
- 1× Шасси для робота miniQ. miniQ — это отличная и недорогая платформа для создания простых двухколёсных роботов. Можно использовать платформу miniQ как от DFRobot, так и нашего производства.
- 2× Мотор-редуктор типоразмера N20 на 6 В с передаточным отношением 1:150. Обычно в комплекте с шасси miniQ идут мотор-редукторы c передаточным отношением 1:50. Вал мотора с таким редуктором вращается слишком быстро. Чем выше передаточное отношение редуктора, тем медленее робот будет ездить по доске. И тем меньше вероятность, что мотору не хватит сил для преодоления притяжения магнитов, а колёса будут проскальзывать. Чтобы увеличить крутящий момент на валу, стандартные мотор-редукторы лучше заменить на моторы с передаточным отношением 1:150 и выше.
- 4× Неодимовый магнит. Магнит должен быть высотой 3 мм и иметь зенковку под скрытый крепеж М3. Лучше всего использовать квадратные магниты со стороной от 12 мм, но подойдут и круглые аналогичного размера. Сила сцепления одного магнита должна быть приблизительно от 2 до 2,5 кг.
Электроника
- 1× Arduino Uno. Роботу понадобится бортовой контроллер. Сюда подойдёт любой микроконтроллер, но лучше всего использовать управляющую плату форм-фактора Uno — например, Iskra Uno.
- 1× Восьмиканальный датчик линии. Массив из восьми инфракрасных сенсоров — это глаза и фары вашего гоночного робота.
- 1× Драйвер моторов. Для управления двумя моторами на шасси miniQ подойдёт практически любая плата драйвера, однако удобнее всего использовать шилд формата Uno.
- 1× LiPo-аккумулятор 7,4 В (2S). Литий-полимерный аккумулятор для хобби-проектов. Напряжение двух банок находится в диапазоне от 7,4 до 8,4 вольт. Это подходит для питания 6-вольтовых моторов и для встроенного регулятора напряжения на плате Arduino. Чем больше ёмкость аккумулятора, тем дольше робот сможет гонять по линии. Однако чересчур ёмкий аккумулятор сделает вашего робота слишком тяжёлым. Лучше всего подбирать ёмкость в диапазоне от 800 до 1300 миллиампер-часов.
Прочее
- 4× Соединительный провод «мама-папа».
- 4× Стойка М3 «мама-папа» длиной 10 мм.
- 3× Стойка М3 «мама-папа» длиной 25 мм или более.
- 4× Винт М3 длиной 8 мм с потайной головкой и любым шлицем (DIN 963, DIN 965, ГОСТ 17475-80).
- 1× Нейлоновый винт М3.
- 1× Нейлоновая гайка М3.
- Прочий крепёж.
Для трассы
- Белая магнитно-маркерная доска.
- Толстые чёрные маркеры. Не перманентные, самые толстые, что можно найти: 5 мм и более.
- Стиратель для магнитно-маркерной доски.
- Зарядное устройство для LiPo-аккумуляторов.
Шаг 2. Переберите шасси
Сперва переберите платформу miniQ. Замените стандартные мотор-редукторы на моторы-редукторы с передаточным отношением 1:150. Используйте стандартные пластиковые крепеления платформы miniQ.
Шаг 3. Установите магниты
Установите четыре магнита, используя отверстия на платформе miniQ. Прикрепите магниты к платформе через стойки М3×10 и закрепите их винтами М3×8 с потайной головкой и гайками М3.
Важно! Используйте стойки длиной именно 10 мм. После установки магнитов протестируйте шасси на маркерной доске. Все четыре магнита должны плотно прилегать к доске, ни один не должен отходить от неё. Резиновые покрышки колёс платформы miniQ должны быть слегка прижаты, чтобы обеспечивать достаточное трение с доской.
Попробуйте руками порулить роботом по доске. Платформа должна двигаться с усилием. Если при движении шасси какой-либо магнит отходит от доски, это означает, что покрышки максимально поджаты, или резина покрышек слишком жёсткая, и силы магнитов недостаточно для оптимального прижатия. В этом случае попробуйте увеличить расстояние от платформы до магнитов на 0,5–1 мм. Это можно сделать, поставив проставочные шайбы М3 между платформой и стойками или между магнитами и стойками.
Шаг 4. Установите электронику
Установите плату Arduino Uno сверху шасси, используя стойки М3×25 и гайки. Не берите короткие стойки, оставьте под платой место для проводов и аккумулятора.
Установите шилд драйвера мотора на Arduino. Закрепите восьмиканальный датчик линии спереди гоночного робота. Прижмите плату датчика к шасси нейлоновым винтом и гайкой через контакты SDA и SCL, как показано на схеме.
Важно! Не используйте металлический крепёж для датчика линии. Он может вызвать короткое замыкание на контактах SDA и SCL.
Шаг 5. Схема подключения
Подключите все компоненты согласно схеме.
Восьмиканальный датчик линии общается с контроллером по протоколу I²C и подключается четырьмя проводами «мама-папа» (GND, 5V, SDA, SCL).
Подключите мотор-редукторы к колодкам платы драйвера моторов. Аккумуляторная батарея LiPo подключается к контактам внешнего питания моторов на плате драйвера. Также батарею нужно подключить к пинам VIN и GND на плате Arduino. Вместо пина VIN можно использовать силовой разьём питания 5,5×2,1 мм, распаянный на плате.
Для подключения драйверов моторов, совместимых с Uno, дополнительные провода не понадобятся. Например, для управления классическим драйвером моторов используются четыре пина: два ШИМ-пина, ответственных за скорость моторов, и два DIR-пина, ответственных за направление вращения. У платы Motor Shield это пины 4 и 5 (DIR и PWM для первого мотора), 7 и 6 (DIR и PWM для второго мотора).
Важно! Будьте очень аккуратны, поскольку LiPo-аккумуляторы способны отдавать большой ток и не обладают защитой от неправильного подключения! Случайное короткое замыкание положительного и отрицательного контакта заряженной батареи LiPo выведет её из строя и может стать причиной возгорания.
Шаг 6. XOD
Для программирования нашего гоночного робота мы воспользуемся визуальной средой XOD. Благодаря визуальному программированию создать программу сможет даже новичок.
Вся программа для гоночного робота находится в отдельной XOD-бибилиотеке gabbapeople/whiteboard-races
.
В этом проекте мы использовали библиотеку XOD для управления восьмиканальным датчиком линии amperka/octoliner
. Не забудьте добавить эту бибилиотеку в ваше рабочее пространство XOD.
Шаг 7. Программирование
Так выглядит итоговый патч программы гоночного робота:
Программа робота основана на ПИД-контроллере. Взглянём на основные ноды патча и разберёмся, как он работает.
Нода octoliner-line
Эта готовая нода из XOD-библиотеки amperka/octoliner
представляет восьмиканальный датчик линии. Нода отдаёт значение LINE
в диапазоне от -1
до 1
, которое показывает, где конкретно находится чёрная линия под платой датчика.
- Значение
0
означает, что чёрная линия находится ровно по центру датчика (линия между инфракрасными сенсорами на каналах CH3 и CH4). - Значение
-1
соотвествует крайнему левому положению (линия под инфракрасным сенсором на канале CH0). - Значение
1
соответствует крайнему правому положению (линия под инфракрасным сенсором на канале CH7).
При загрузке программы нода octoliner-line
инициализирует работу датчика линии, а также устанавливает стандартные настройки яркости инфракрасных излучателей и чувствительность инфракрасных приёмников.
Восьмиканальный датчик лиини общается с контроллером по I²C, и на входном пине ADDR
ноды octoliner-line
необходимо указать I²C-адрес устройства. По умолчанию датчик имеет адрес 0x1A
. Входной сигнал pulse
на пине UPD
проведёт новую серию измерений всех восьми сенсоров и обновит значение LINE
. Мы будем опрашивать датчик непрерывно, так что установим значение UPD
в continuous
.
После ноды octoliner-line
значение LINE
передается в ПИД-контоллер.
Нода pid-controller
Эта нода отвечает за реализацию работы ПИД-контроллера в XOD.
- На пине
IN
— входное значение контроллера. - На пине
TARG
устанавливается целевое значение, к которому должен стремиться выход ПИД-контроллера.
Мы хотим, чтобы линия в идеале всегда была по центру робота, поэтому устанавливаем значение TARG
равным 0
.
Пин RST
перезапускает контроллер, сбрасывая все накопленные интегрированием ошибки. В нашем случае перегрузим ПИД, если входное значение IN
равно 0
(достигнута целевая позиция линии точно по центру). Если входное значение IN
не равно 0
(линия не по центру), контроллер использует коэффициенты Kp
, Ki
, Kd
для расчёта значения скорости, необходимой для возврата робота к центру линии.
Коэффициенты ПИД-контроллера Kp
, Ki
, Kd
выявляются эмпирически, подбором. Для нашего гоночного робота оптимальные коэффициенты Kp
, Ki
, Kd
равны 1
, 0.2
, и 0,5
соответственно.
Скорость обновления ПИД-контроллера устанавливается на пине UPD
. Наш ПИД-контроллер будет работать непрерывно, поэтому устанавиваем пин UPD
в значение continuous
.
Полученное от ПИД-контроллера значение скорости вычитается из максимальной скорости вращения единицы и прибавляется к единице. Это сделано для того, чтобы валы левого и правого мотора вращались в разных направлениях, если линия потеряна. Единица же соотвествует максимальной скорости вращения моторов, то есть максимальному ШИМ на каналах драйвера. При желании максимальную скорость вращения можно уменьшить.
Ноды h-bridge-dc-motor
Две ноды h-bridge-dc-motor
контролируют правый и левый мотор робота. Здесь устанавливаются значения пинов PWM
и DIR
, через которые работает драйвер.
Загрузите патч на плату и протестируйте вашего гоночного робота на магнитной доске.
Шаг 8. Советы
Немного полезных советов:
- Нарисуйте маркерами на магнитной доске трассу для вашего гоночного робота. Попробуйте придумать интересную трассу со множеством поворотов и прямых участков для разгона. Однако не стоит рисовать слишком крутые повороты: велика вероятность, что при высокой скорости робот не впишется в поворот и уйдёт с трассы.
- Используйте новые и свежие чёрные маркеры для трассы. Старайтесь нарисовать как можно более контрастную и толстую чёрную линию.
- Попробуйте собрать гоночного робота на других шасси, помимо платформы miniQ, или вовсе сделать шасси самостоятельно. Главная идея — это магниты!
- Сделайте несколько одинаковых роботов и устройте им драг-рейсинг!