Робот для прохождения лабиринтов на Arduino


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

Робот для прохождения лабиринтов на Arduino

Также на нашем сайте вы можете посмотреть и другие похожие проекты роботов на основе Arduino:

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

  1. Плата Arduino Uno (купить на AliExpress).
  2. Плата расширения для управления двигателями на Arduino UNO.
  3. Инфракрасные датчики - 3 шт. (купить на AliExpress).
  4. Шасси автомобиля с приводом на два колеса.
  5. Колесико на ролике.
  6. Моторы Bo с соответствующими колесами - 2 шт.
  7. Литий-ионный аккумуляторный блок 2S с BMS.
  8. Соединительные провода.
  9. Винты, гайки и прокладки.

Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158

Источник питания

Хотя источник питания достаточно гибкий, рекомендуется использовать напряжение от 5 до 12 В. Батарея на 9 В также подойдет, но любое напряжение выше 5 В и ниже 12 В идеально подходит для обеспечения стабильного питания, особенно для двигателей. Более высокое напряжение гарантирует, что даже если двигатели потребляют значительную мощность, падение напряжения не повлияет на функциональность Arduino (что может привести к перезапуску).

Шасси

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

Имея эти компоненты, вы готовы начать сборку своего робота!

Что представляет собой робот для прохождения лабиринтов

Это робот, предназначенный для автономного перемещения по лабиринту и поиска выхода. Он использует датчики, такие как ультразвуковые, инфракрасные или камеры, для обнаружения препятствий и составления карты окружающей местности. Затем робот применяет различные алгоритмы, такие как поиск в глубину (Depth First Search, DFS), поиск в ширину (Breadth First Search, BFS) или следование вдоль стен, чтобы составить карту лабиринта и выбрать оптимальный путь. Обычно он перемещается на основе обратной связи в реальном времени и принимает решения, чтобы избегать стен и достичь пункта назначения. 

Демонстрация работы робота для прохождения лабиринтов на основе Arduino

В этом проекте мы будем создавать простого робота для прохождения лабиринтов на основе Arduino. Робот использует ИК-датчик для обнаружения лабиринта и алгоритм, называемый правилом «рука о стену», для навигации по лабиринту и поиска выхода. Обратите внимание, что мы использовали линии для создания лабиринта вместо строительства стен. Как показано на GIF-анимации выше, мы можем легко создать несколько вариантов лабиринтов и протестировать робота. Такие роботы, осуществляющие прохождение лабиринтов по прямой линии, также называются роботами, следующими по линии

Алгоритм робота для прохождения лабиринтов

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

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

Пример лабиринта для нашего робота для прохождения лабиринтов

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

Этот подход имитирует поведение человека при перемещении в темных или незнакомых пространствах, где прикосновение к стене дает направление и ощущение границ. Просто, эффективно и гениально!

Надеюсь, вы поняли основную концепцию этого алгоритма.

Основная логика работы робота

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

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

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

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

Таблица истинности для робота для прохождения лабиринтов

Схема проекта

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

Схема робота для прохождения лабиринтов на основе платы Arduino

Поскольку мы используем плату расширения для двигателей версии 1, мы ограничены использованием аналоговых выводов. Поэтому я использую A0, A1 и A2 в качестве цифровых входов для левого, переднего и правого датчиков. Это единственные выводы с отдельными контактными площадками, что упрощает пайку. Левый и правый двигатели подключены к выходам M1 и M2 платы расширения. Во время программирования вы можете проверить направление вращения двигателей. Если потребуется внести какие-либо изменения, вы можете просто изменить полярность двигателей.

Наконец, у нас есть источник питания, который имеет решающее значение. Мы используем старый аккумуляторный блок 2S, обеспечивающий выходное напряжение от 5,6 В до 8,4 В. Этого более чем достаточно для нашего проекта. Если вы выберете другой двигатель, вам, возможно, потребуется заменить источник питания.

Разъем для подключения внешнего питания на плате Arduino UNO

Кроме того, необходимо убедиться в правильном подключении к выводам PWR модуля управления двигателем, как показано на изображении выше. Эти выводы отвечают за подключение входа батареи к выводу Vin платы Arduino. Если это подключение отсутствует, плата Arduino UNO не будет получать питание.

Сборка конструкции робота

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

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

Расположение компонентов в собранной конструкции робота

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

Объяснение работы кода программы

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

Робот для прохождения лабиринтов использует ИК-датчики для обнаружения препятствий и применяет алгоритм логического принятия решений для навигации по лабиринту. Движение робота управляется двигателями постоянного тока, подключенными к плате Arduino Motor Shield V1. Обратите внимание, что приведенный код предназначен только для поиска выхода из лабиринта и не предназначен для поиска кратчайшего пути. Однако, при желании, вы можете реализовать собственный алгоритм для поиска кратчайшего пути. 

Используемые библиотеки

AFMotor: Эта библиотека управляет двигателями постоянного тока с помощью платы Arduino Motor Shield V1. Она упрощает управление двигателями благодаря таким функциям, как setSpeed() и run() .

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

ИК-датчики подключены к аналоговым выводам A0, A1 и A2, которые соответствуют левому, переднему и правому датчикам соответственно. Скорость вращения двигателей и задержки поворота также задаются с помощью констант для точного управления движением.

Функция настройки

Функция setup() инициализирует ИК-датчики как устройства ввода для обнаружения препятствий и устанавливает последовательную связь для целей отладки.

Главный цикл

Функция loop() непрерывно считывает данные с ИК-датчиков и определяет движения робота, используя логику switch-case. Значения датчиков (0 или 1) объединяются в двоичное представление для определения текущего состояния лабиринта (например, путь доступен впереди, налево, направо или пути нет). В зависимости от состояния вызываются специальные функции управления движением, такие как moveForward(), turnLeft(), turnRight() или uTurn().

Принцип работы робота для прохождения лабиринтов

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

Шаг 1: Исходное положение

  • Робот начинает движение от входа в лабиринт.
  • Оно следует правилу левой руки, то есть всегда будет прижимать левый датчик или боковую сторону к стене.

Начало движения робота

Шаг 2: Принятие решения на перекрестке

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

Движение робота на перекрестке

Шаг 3: Повороты на углах

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

Движение робота на углах

Шаг 4 : Принятие решения на втором перекрестке

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

Движение робота на сложном перекрестке

Шаг 5: Поворот на повороте

Как и в предыдущих поворотах, робот повернет за угол в правильном направлении.

Прохождение роботом череды поворотов

Шаг 6: Заключительное движение

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

Завершение тестирования робота

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

Вы можете сопоставить движения робота с таблицей истинности, предоставленной в коде. Робот работает как ожидалось, успешно проходя лабиринт.

Репозиторий GitHub с кодом и схемой

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

Схема и код проекта робота для прохождения лабиринтов на Arduino

Заключение и дальнейшие улучшения

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

Полный код проекта

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

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

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

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