Робот проходящий лабиринт arduino как сделать

Добавил пользователь Евгений Кузнецов
Обновлено: 19.09.2024

Библиотека Robot включена в среду разработки Ардуино, начиная с версии 1.0.5.

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

Робот состоит из двух плат - платы приводов (Motor Board) и управляющей платы (Control Board), у каждой из которых есть свой микроконтроллер.

Библиотека Robot позволяет работать с различными датчиками и периферийными устройствами, расположенными на управляющей плате:

  • потенциометром
  • 5 кнопками
  • цветным экраном с разрешением 160x120 пикселей
  • памятью EEPROM объемом 512 Кбит
  • динамиком
  • компасом
  • 3 разъемами I2C
  • 8 входными разъемами TinkerKit

А еще библиотека может работать с платой приводов и позволяет:

  • управлять скоростью и направлением вращения двигателя
  • измерять ток, потребялемый каждым двигателем
  • считывать состояние 5 датчиков на днице (их еще называют датчиками линии)
  • работать с выводами общего назначения на плате
  • управлять портом I2C
  • считывать сигнал с 4 входов TinkerKit

Для получения дополнительной информации об Arduino Robot, посетите страницу с описанием устройства или руководство к началу работы с устройством.

Структура библиотеки

Библиотека существенно упрощает работу с периферийными устройствами Arduino Robot. Она построена на базе нескольких библиотек: Fat16, EasyTransfer, Squawk, IRRemote (это сторонние библиотеки), а также TFT, SPI и Wire (библиотеки Ардуино). Чтобы уменьшить общий размер программы, основные функции этих библиотек продублированы в библиотеке Robot.

Вообще, запрограммировать можно не только управляющую плату (Control Board), но и плату приводов (Motor Board). Однако новичкам лучше оставить ее на потом и начать с программирования управляющей платы. Библиотека предоставляет доступ к датчикам обеих плат через один объект.

Для управления роботом существует два основных класса:

  • RobotControl: работает с управляющей платой (Control Board), в частности с выводами общего назначения и двигателями на Motor Board со стандартной прошивкой.
  • RobotMotor: работает с платой приводов (Motor Board). Используйте этот класс для создания собственных прошивок для Motor Board.

Примеры

Перечисленные примеры демонстрируют основные возможности робота и помогут вам быстро его освоить:

Класс RobotControl

Работает с управляющей платой (Control Board), в частности, со всеми выводами общего назначения, а также двигателями, расположенными на нижней плате робота со стандартной прошивкой.

ПРОХОЖДЕНИЕ "РОБОТОМ" ЛАБИРИНТА: Правило "правой руки"

С глубокой древности лабиринты несли ощущение тайны и загадки. Один из первых лабиринтов, известных человечеству, описывает Геродот - это был египетский Лабиринт, в котором было 5000 комнат. Со временем лабиринты утратили свое религиозно-мистическое значение и стали объектами развлечений, превратившись в сады и парки в виде зеленых изгородей сложной конфигурации.

Разгадывание лабиринтов всегда являлось увлекательнейшим занятием, но еще более увлекательным является создание машин, способных пройти Лабиринт.

Попробуем описать робота, действующего в соответствии с правилом "правой руки".

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

Блок-схема алгоритма для робота, работающего по правилу "правой руки", представлена на рисунке.

Попробуем проверить работу данного алгоритма и напишем для него программу. Для этой цели обратимся к среде программирования GameLogo. Эта среда является удобным средством для моделирования различных алгоритмов, связанных с управлением роботами. В ней есть исполнитель черепаха, который по своей сути является не чем иным, как самым настоящим роботом. Черепаха располагает очень удобным набором команд - вперед, направо, налево, назад. Кроме того, в центре черепахи есть датчик, принимающий значение от 0 до 100, в зависимости от тона поверхности, на которой она находится.

arduino робот

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

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

Создание шилда управления роботом

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

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

  • Светодиоды - 7 штук
  • Кнопки - 3 штуки
  • Резисторы на 220 Ом - 6 штук
  • Резисторы на 10 кОм - 2 штуки
  • Перемычки - 5 штук
  • Разъём PBS (мама) на 16 контактов - 1 штука
  • Миниатюрная макетная плата - 1 штука

arduino робот

Все компоненты запаиваем на Proto Shield по указанной схеме (вид со стороны деталей):

Размещение элементов на плате:

arduino робот

В левом нижнем углу я вывел кнопку RESET. Она замыкает выводы RESET и GND. В левом верхнем - разъем подключения сервоприводов. Вверху светодиод с 13 дискретного вывода. Справа 2 кнопки переключения режимов (след / пред).

Каждая кнопка подтянута к земле резистором на 10 кОм.

arduino робот

Далее размещены 6 светодиодов, которые подключены к панельке контактов через резисторы на 220 Ом.

arduino робот

Светодиоды будут служить индикаторами режимов работы робота.

Для разводки дополнительных модулей, я еще решил добавить в шилд управления миниатюрную макетную плату.

arduino робот

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

Подключим провода к разъему на 16 контактов. Описывать буду назначение контактов сверху вниз. LED 1..6 - выводы светодиодов, BTN 1..2 - кнопки.

  • 1 - LED 1 - к 22 дискретному выводу Arduino
  • 2
  • 3
  • 4 - LED 2 - к 23 дискретному выводу Arduino Mega 2560
  • 5
  • 6 - BTN 1 - к 28 дискретному выводу Arduino Mega 2560
  • 7 - LED 3 - к 24 дискретному выводу Arduino Mega 2560
  • 8 - GND - к GND Arduino Mega 2560
  • 9 - +5 V - к +5 V Arduino Mega 2560
  • 10 - LED 4 - к 25 дискретному выводу Arduino Mega 2560
  • 11 - BTN 2 - к 29 дискретному выводу Arduino Mega 2560
  • 12
  • 13 - LED 5 - к 26 дискретному выводу Arduino Mega 2560
  • 14
  • 15
  • 16 - LED 6 - к 27 дискретному выводу Arduino Mega 2560
  • VCC на JY-MCU подключаем к +5В Arduino
  • GND на JY-MCU подключаем к GND Arduino
  • TXT на JY-MCU подключаем к дискретному PIN 50 на Arduino
  • RXD на JY-MCU подключаем к дискретному PIN 51 на Arduino

arduino робот

Подключение ультразвукового дальномера HC-SR04

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

Для создания крепления под ультразвуковой дальномер HC-SR04 я использовал кусок платы от Proto Shield и панельку контактов.

arduino робот

Откусил от панельки контактов две части по 4 контакта и запаял их на плату параллельно.

arduino робот

arduino робот

Перед подключением дальномера я сперва “раскорячил” его контакты, чтобы они плотно держались в разъеме.

arduino робот

Проковырял в плате дырку под болт.

arduino робот

Закрепил модуль на сервоприводе.

arduino робот

В результате у меня получился такой девайс.

arduino робот

Осталось только подключить провода к контактной панельке на плате дальномера и завести их на контакты Arduino Mega 2560. Этим и займемся.

  • VCC HC-SR04 подключим к +5V на Arduino Mega 2560
  • Trig HC-SR04 к цифровому пину 31 на Arduino Mega 2560
  • Echo HC-SR04 к цифровому пину 30 на Arduino Mega 2560
  • GND HC-SR04 к GND на Arduino Mega 2560

Алгоритм объезда препятствий

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

Из исходного положения проверяем расстояние впереди. Если оно больше 30 сантиметров, то продолжаем двигаться вперед, иначе:

  • останавливаем двигатели
  • поворачиваем сервопривод на углы от 0 до 180 градусов с шагом в 15 градусов и измеряем расстояния на этих углах
  • заносим полученные значения в массив
  • поворачиваем сервопривод на угол 90 градусов (прямо)
  • ищем в массиве позицию с максимальным значением данных
  • если это значение меньше 30 сантиметров, то едем назад
  • если это значение больше 30 сантиметров, то проверяем какому углу поворота сервопривода оно соответствует и в зависимости от этого поворачиваем влево или вправо

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

Скетч реализации алгоритма объезда препятствий

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

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

В следующий раз я попробую реализовать алгоритм прохождения лабиринта по правилу правой руки или движение по белой линии.

Похожие записи

Комментариев: 83

Блин, у меня машина живёт своей жизнью, я правда переделал код под РУ машину.

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

Не, у меня преобразователь из 7.4 в 6. Всё нормально работало.

Хотя да! Наверно дело в питании, потому что у тебя на видео серва быстро крутиться, а у меня slow.

Полезная статья, спасибо. Разбирался тут в вашем коде. Особенно мне полезно было унать про программную часть использования этого дальнометра (у меня такой же). Всё, что хотел узнать, понял. А конструкцию
int vHC_SR04() const int vTrig = 31;
const int vEcho = 30;
unsigned int vdistance_sm=0;
unsigned int vtime_us=0;
digitalWrite(vTrig, HIGH);
delayMicroseconds(10);
digitalWrite(vTrig, LOW);
vtime_us=pulseIn(vEcho, HIGH);
vdistance_sm=vtime_us/58;
return vdistance_sm;
>
нужно писать каждый раз, когда требуется узнать показания? Понятно, циклы никто не отменял, но это - единственный способ замерить показания?

это функция определения расстояния - написать ее надо только 1 раз
чтобы ее использовать просто пишите vHC_SR04()
это ее вызовет в нужном месте и вернет вам результаты измерений

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

Поменяйте в скетче номера портов на свои.
У меня просто нет UNO - сам не могу проверить.

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

Полезная статья.Спасибо Вам.
Попробовал Ваш скетч откомпелировать но он выдал вот такие ошибки:
In file included from sketch_nov28b.ino:3:
C:\arduino-1.0.2\libraries\SoftwareSerial/SoftwareSerial.h:52: error: conflicting return type specified for 'virtual void SoftwareSerial::write(uint8_t)'
C:\arduino-1.0.2\hardware\arduino\cores\arduino/Print.h:48: error: overriding 'virtual size_t Print::write(uint8_t)'
Ни как не могу побороть. Не подскажете причину ?
Использую Arduino IDE 1.0.2.

у меня версия 1.0.5
перепроверил скетч - в строках кода, на которые ругается компилятор замените тире на минусы.

Все проверил ошибка осталась, но добавилась еще одна sketch_nov28a.cpp: In function 'void vbluetoothmode()':
sketch_nov28a:193: error: 'class SoftwareSerial' has no member named 'available'

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

а возможно сделать чтоб робот сам переключался между режимами например потерял соединение с блютуз и переключился на датчик?

Хорошая идея. Благодарю за подсказку.

А можешь пожалуйста скинуть код с режимом объезжать все препятствия только без bluetooth, сервопривода, светодиодов.

К сожалению нет. Без сервопривода никак. У меня поиск проезда завязан на измерении расстояний по сторонам.

Было бы прикольно, если бы игрушка составляла что-то на подобии карты, где можно передвигаться (примерно как у роботов-пылесосов).

Здравствуйте! Подскажите будете реализовывать следующие функции
Возможность движения по загруженному GPS треку
Запись маршрута движения в файл

Пока не готов вам ответить. Думал об этом, но пока отвлекся на другой проект.

//Создаем объекты для двигателей
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 vservo;
// Создаем переменные для запоминания скорости левых и правых двигателей
int vspdL, vspdR;
/* Создаем переменную, на значение которой будет уменьшаться скорость при плавных поворотах.
Текущая скорость должна быть больше этого значения. В противном случае двигатели со стороны направления поворота просто не будут вращаться */
const int vspd = 200;
// Массив для хранения углов поворота сервопривода (шаг 15 градусов)
const int vservo_array[13]= 0,15,30,45,60,75,90,105,120,135,150,165,180>;
// Массив для хранения данных о расстоянии под различными углами поворота сервопривода
int vHC_SR04_array[13];
// Пины, используемые ультразвуковым дальномером
const int vTrig = 31;
const int vEcho = 30;
// Переменные, для хранения данных с дальномера
unsigned int vtime_us=0;
unsigned int vdistance_sm=0;
// Минимальное расстояние в сантиметрах, при котором нужно искать новый маршрут движения
const int vmindistance = 30;
// Переменная для циклов перебора значения массивов vservo_array и vHC_SR04_array
int vservo_int;
// Переменные для цикла поиска максимального значения в массивах
int vmaxarrayindex_int;
int vmaxarrayvalue_int;

void setup() // Устанавливаем скорость передачи данных по кабелю
Serial.begin(9600);
// Выбираем пин к которому подключен сервопривод
vservo.attach(9); // или 10, если воткнули в крайний разъём
// Поворачиваем сервопривод в положение 90 градусов при каждом включении
vservo.write(90);
// Устанавливаем максимальную скорость вращения двигателей
vspeed(255,255);
// Устанавливаем значение для пинов, к которым подключен ультразвуковой дальномер
pinMode(vTrig, OUTPUT);
pinMode(vEcho, INPUT);
>
void loop() <>
/* Режим работы с использованием ультразвукового дальномера */
void vultrasoundmode() vservo.write(90);
delay(200);
Serial.print("Now ");
Serial.println(vHC_SR04());
// Если расстояние меньше наименьшего, то
if (vHC_SR04() vspd) vspeed(vspdL,vspdR-vspd);
>
else
vspeed(vspdL,0);
>
vforwardRL();
>

// Изменение скорости
void vspeed(int spdL,int spdR) if (spdL == spdR) vspdL=spdL;
vspdR=spdR;
>
motor1.setSpeed(spdL);
motor2.setSpeed(spdR);
motor3.setSpeed(spdL);
motor4.setSpeed(spdR);
>

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

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

Концентрация и действие

Адаптивное планирование и постоянный анализ

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

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

Тупик, ошибка — это полезный опыт

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

Сколько потребуется алгоритму с вычислительными способностями обычного человека, чтобы добиться успеха и стать выдающейся личностью?

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

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

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


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

На первом этапе отрабатывалась работа кнопок, запуск лазеров и контроль приемников лазеров.

Вторым этапом было изучение сдвиговых регистров для работы 7-ми сигментных индикаторов.

В результате изучил программу SPrintLayout и методом ЛУТа изготовил свои первые в жизни платы для работы 7-ми сегментных индикаторов.

Третий этап — озвучка всего этого хозяйства. Реализовывалось на шилде wtv020-sd-16p, который с трудом удалось запустить по причинам, с которыми сталкиваются в первый раз все начинающие ардуинщики.

Четвертый этап — сборка всего этого добра в корпус и поиском решения разъемов коммутации всех устройств.

Что же в результате всего получилось и как это выглядит в финале.

Реализовано:
— система построена на Arduino MEGA;
— 10 лазеров и приемников — с зеркалами 20 лучей;
— 3 уровня сложности;
— подсветка активных клавиш;
— отдельный плей лист на каждый уровень;
— режим настройки лазеров ;
— вывод на 2 табло счетчик касаний, номер уровня и секундомер;
— восстановление выключенных лазеров при проходе половины дистанции;
— при задевании лазера проигрывание короткого тревожного сигнала;
— реализована статистика количества стартов, финиша, ресетов, и призовых финиширований (проход атракциона без касания лазеров).

Также сформирован новый список доделок, переделок и реализации новых функций. Таких, как:
— увеличение количества лазеров до 30 шт;
— подключение табло по RS-485:
— подключение модулей GSM и WIFI для ведении статистики на отдельный сервер;
— реализация режима динамической презентации;
— подключение ТВ и запуска рекламных роликов в период простоя, а в режиме игры — ее трансляция;
— автоматический режим работы дым-машины
и много другого…

Вот, таким получился мой первый проект на Arduino.


Уникальных посетителей темы: 226

Читайте также: