Robot shield with arduino

Робот, ездящий по линии под управлением Arduino

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

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

В нашем примере будет собран робот на лёгкой платформе с двумя колёсами и двумя датчиками линии, расположенными на днище робота перед колёсами.

В результате выглядеть он будет так:

Что понадобится

Для нашего примера понадобятся следующие детали:

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

Собираем робота

Сначала соберём робота, установим всю механику и электронику.

Собираем платформу

Для начала прикрепим колёса к моторам.

Затем с помощью пластиковых П-образных креплений прикручиваем моторчики к платформе. Обратите внимание на взаимное расположение крепления и моторчики: в креплении есть небольшие углубления, так что если всё соединить правильно, то моторчики будут крепко держаться и никуда не выскочат.

Теперь крепим балансировочный шар.

Отлично! Платформа собрана. Если вам кажется, что колёсам отведено слишком мало места и они трутся о платформу, то скорее всего вам нужно посильнее надавить на колёса, чтобы они плотнее сели на вал мотора.

Крепим сенсоры

Закрепим их, как показано на фото:

Можно было бы выбрать и другое место. Это могло бы сделать контроль проще или сложнее, а самого робота более или менее эффективным. Оптимальное расположение — вопрос серии экспериментов. Для этого проекта просто был выбран такой способ крепления.

Крепим Arduino

Arduino закрепим с противоположной стороны двумя винтиками и гайками.

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

Крепим Motor Shield и соединительные провода

Установим Motor Shield на Arduino и подсоединим соединительные провода. Обратите внимание, чтобы соотвествовать программному коду из примера ниже, моторчики соединены с Motor Shield так: правый — к клеммам M1 с прямой полярностью (плюс к плюсу), а левый — к M2 с обратной (плюс к минусу).

В этом проекте, для экономии времени концы соединительных проводов просто скручены с контактами моторов. При работе «начисто» стоит жёстко припаять провода к моторам.

Крепим Troyka Shield

Присоединяем сверху Troyka Shield и подключаем датчики к 8 и 9 цифровым контактам. В итоге получаем следующую конструкцию:

Программирование

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

Основная идея алгоритма

Пусть у нас усть белое поле, и на нём чёрным нарисован трек для нашего робота. Используемые датчики линии выдают логический ноль, когда «видят» чёрное и единицу, когда «видят» белое.

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

При повороте траектории направо, правый сенсор наезжает на трек и начинает показывать логический ноль. При повороте налево, ноль показывает левый сенсор.

Таким образом получаем простую систему с тремя состояниями:

На вход системы поступает информация с сенсоров. Получаем следующую логику переходов:

Левый Правый Целевое состояние
0 0 STATE_FORWARD
0 1 STATE_RIGHT
1 0 STATE_LEFT
1 1 STATE_FORWARD

Реализация на Arduino

Проблема инертности и её решение

Однако если выставить скорость моторов побольше, мы столкнёмся со следующей проблемой: наш робот будет вылетать с трека, не успевая отреагировать на поворот. Это связано с тем, что наши моторчики не умеют тормозить мгновенно.

В этом легко убедиться поставив следующий эксперимент: с заданной скоростью робот будет двигаться по поверхности, и в некоторый момент будет установлена нулевая скорость и измерен тормозной путь робота. Пусть робот разгоняется по монотонной поверхности и тормозится при фиксировании импровизированной стоп-линии.

Эксперимент проведём для разных скоростей. Код программы для эксперимента таков:

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

Таким образом, начиная с некоторого момента у нашего робота нет никакой возможности успеть среагировать и остаться на треке.

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

Для того, чтобы понять зависимость расстояния при заднем ходе от времени, был проведён ещё один замер:

На скорости 50, например, робот проделывал путь, зависящий от времени следующим образом:

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

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

Адаптивное поведение

Перед финальным экспериментом произведём ещё несколько поправок.

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

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

В итоге наш код будет выглядит следующим образом:

Результат

Что дальше?

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

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

Источник

Робот на Arduino, Motor Shield L293D и ультразвуковом датчике HC-SR04

Устранение препятствий – это одно из существенных центральных проблем при разработке мобильных роботов. В этом документе представлена конструкция умной машины на базе ардуина , которая самостоятельно может определять препятствия и объезжать их , принимая разумные решения. Это роботизированная машинка собирается на мотор шилде (Adafruit Motor Shield), поэтому для ее сборки не нужно ничего паять. Для сервопривода, который вращает сенсор (глаза робота), предусмотрен также вывод.

Для обеспечения необходимых автономных функций использовалось программное обеспечение, написанном на языке Arduino. Интеграция ультразвукового датчика расстояния HC-SR04 , установленного на серводвигателе, позволила этому роботу обнаруживать окружающие препятствия.

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

Автономный робот — это тот, который имеет какие-то встроенные функции искусственного интеллекта.

Для создания робота на Arduino, Motor Shield L293D и ультразвуковом датчике HC-SR04 понадобиться:

Ultrasonic Sensor — HC-SR04 (Generic)

RGB Diffused Common Cathode

Автор рассказывает из каких компонентов сделана робот и предоставляет схему подключения.

Так же необходимо наличие 2 библиотек в среде Arduino IDE:

Скачать код для машины на на Arduino, Motor Shield L293D и ультразвуковом датчике HC-SR04.

Более подробная информация на странице проекта.

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

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока. И до встречи в следующем проекте.

Понравилась статья? Поделитесь ею с друзьями:

Источник

Ведроид-мобиль — робот на Arduino — Часть 2. Подключаем Motor Shield

GeekElectronics » Arduino от А до Я » Ведроид-мобиль — робот на Arduino — Часть 2. Подключаем Motor Shield

В этой статье я опишу процесс подключения к Arduino Mega 2560 платы Motor Shield, управление четырьмя электродвигателями и одним сервоприводом MG995.

В предыдущей статье я описал процесс сборки мотоплатформы для будущего Arduino робота и поделился планами на будущее.

Основная задача на сегодня — заставить Ведроид-мобиль двигаться и управлять сервоприводом.

Подключение Motor Shield к Arduino Mega 2560

Не будем тянуть время и приступим. Снимаем верхнюю часть платформы и припаиваем провода ко всем четырём двигателям. Соблюдайте полярность. У меня на всех верхних контактах синий провод, а на нижних — желтый.

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

Сразу закрепим сервопривод MG995 и аккуратно уложим провода внутри мотоплатформы, чтобы они не цеплялись за колеса и нам больше не пришлось снимать её верхнюю часть.

Затем устанавливаем корпус для элементов питания и закрепляем его. У меня пока есть блок на 4 элемента.

Если у вас есть тумблер и ненужный разъем, через который будет осуществляться зарядка аккумуляторов, то установите их сейчас. К сожалению, у меня под рукой их не оказалось.

Сразу выводим все провода через отверстия наверх.

Теперь закрепляем снаружи на верхней части платформы Arduino Mega 2560 и вставляем в нее наш Motor Drive Shield 2x L293D. Устанавливаем верхнюю часть платформы на место и закрепляем её болтами.

Теперь пришло время подключить двигатели к Motor Shield.

Передние двигатели я подключил к клемам M3 и M4. M4 — передний правый двигатель, M3 — передний левый. Arduino при креплении к верхней крышке стала наоборот, поэтому получился такой сдвиг.

M2 — задний правый двигатель. M1 — задний левый, Соблюдайте полярность подключения электродвигателей

Подключаем сервопривод MG995.

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

Проблему решил путем подключения питающего провода сервопривода напрямую к источнику питания.

Подключаем провода питания к контактам на Motor Shield. На плюсовую клемму также подключаем провод от сервопривода

Прошу вас сразу обратить внимание на перемычку. Если ее убрать, то питание на контроллер Arduino придется подавать отдельно. На рисунке приведена схема, поясняющая электрические соединения шин питания контроллера Arduino и модуля Motor Shield.

Любуемся нашим шедевром.

На этом с аппаратной частью на сегодня мы заканчиваем и переходим к написанию тестового скетча для робота.

Занятость портов Arduino при подключенном Motor Shield

После подключения Motor Shield к Arduino некоторые порты нам больше не доступны для работы, так как их использует Motor Shield.

Более подробно об этом расписано на сайте Arduino Shield List.

Пример скетча для работы Arduino с Motor Shield реализующий управление четырьмя двигателями и одним сервоприводом

Основная задача — разобраться с управлением четырьмя двигателями и вращением одного сервопривода.

Сразу давайте обсудим первоначальный функционал нашего тестового скетча.

Предлагаю реализовать такой алгоритм:

  • Движение вперед в течении 5 секунд с поворотом сервы на угол 90 градусов
  • Поворот вправо в течении 2 секунд с поворотом сервы на угол 180 градусов
  • Движение назад в течении 5 секунд с поворотом сервы на угол 90 градусов
  • Поворот влево в течении 2 секунд с поворотом сервы на угол 0 градусов
  • Остановка двигателей на 3 секунды с поворотом сервы на угол 90 градусов

Задача поставлена — можно приступать.

Для начала нам необходимо установить библиотеку AFMotor.

afmotor.rar (9,2 KiB, 3 455 hits)

Скачайте архив и распакуйте его содержимое в \arduino-1.XX\libraries\

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

//Создаем объекты для двигателей
AF_DCMotor motor1(1); //канал М1 на Motor Shield — задний левый
AF_DCMotor motor2(2); //канал М2 на Motor Shield — задний правый
AF_DCMotor motor3(3); //канал М3 на Motor Shield — передний левый
AF_DCMotor motor4(4); //канал М4 на Motor Shield — передний правый

// Создаем объект для сервопривода
Servo myservo;

void setup() <
// Выбираем пин к которому подключен сервопривод
myservo.attach(9); // или 10, если воткнули в крайний разъём
// Поворачиваем сервопривод в положение 0 градусов при каждом включении
myservo.write(0);
// Пауза 5 секунд
delay(5000);
>

void loop() <
//Устанавливаем скорость 100% (0-255)
motor1.setSpeed(255);
motor2.setSpeed(255);
motor3.setSpeed(255);
motor4.setSpeed(255);

// Задаем направление движение
// FORWARD — вперед
// BACKWARD — назад
// RELEASE — стоп

// Движение вперед в течении 5 секунд с поворотом сервы на угол 90 градусов
motor1.run(FORWARD);
motor2.run(FORWARD);
motor3.run(FORWARD);
motor4.run(FORWARD);
myservo.write(90); // Поворот сервы на угол 90 градусов
delay(5000);

// Поворот вправо в течении 2 секунд с поворотом сервы на угол 180 градусов

motor1.run(FORWARD);
motor2.run(BACKWARD);
motor3.run(FORWARD);
motor4.run(BACKWARD);
myservo.write(180); // Поворот сервы на угол 180 градусов
delay(2000);

// Движение назад в течении 5 секунд с поворотом сервы на угол 90 градусов
motor1.run(BACKWARD);
motor2.run(BACKWARD);
motor3.run(BACKWARD);
motor4.run(BACKWARD);
myservo.write(90); // Поворот сервы на угол 90 градусов
delay(5000);

//Поворот влево в течении 2 секунд с поворотом сервы на угол 0 градусов

motor1.run(BACKWARD);
motor2.run(FORWARD);
motor3.run(BACKWARD);
motor4.run(FORWARD);

myservo.write(0); // Поворот сервы на угол 0 градусов
delay(2000);

// Остановка двигателей на 3 секунды с поворотом сервы на угол 90 градусов
motor1.run(RELEASE);
motor2.run(RELEASE);
motor3.run(RELEASE);
motor4.run(RELEASE);
myservo.write(90); // Поворот сервы на угол 90 градусов
delay(3000);
>

Демонстрация работы

В следующий раз я попробую реализовать управление Ведроид-мобилем по Bluetooth со смартфона на Android.

Источник

Adblock
detector