Робот проходящий лабиринт arduino как сделать
Библиотека 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, в зависимости от тона поверхности, на которой она находится.
В этой статье я опишу процесс создания шилда управления роботом, подключение ультразвукового дальномера и реализацию алгоритма объезда препятствий. На выходе у нас должен получиться полностью автономный робот.
А прошлой статье я описывал процесс реализации управления роботом по Bluetooth через смартфон на Android. Это был первый режим работы робота. После этой статьи у нас появится второй режим. В будущем я планирую добавить еще несколько.
Создание шилда управления роботом
Для переключения между различными режимами работы я решил сделать отдельный шилд. В прошлый раз я уже использовал Proto Shield. Сегодня я его немного модернизирую под свои потребности.
Для этого нам понадобятся следующие детали:
- Светодиоды - 7 штук
- Кнопки - 3 штуки
- Резисторы на 220 Ом - 6 штук
- Резисторы на 10 кОм - 2 штуки
- Перемычки - 5 штук
- Разъём PBS (мама) на 16 контактов - 1 штука
- Миниатюрная макетная плата - 1 штука
Все компоненты запаиваем на Proto Shield по указанной схеме (вид со стороны деталей):
Размещение элементов на плате:
В левом нижнем углу я вывел кнопку RESET. Она замыкает выводы RESET и GND. В левом верхнем - разъем подключения сервоприводов. Вверху светодиод с 13 дискретного вывода. Справа 2 кнопки переключения режимов (след / пред).
Каждая кнопка подтянута к земле резистором на 10 кОм.
Далее размещены 6 светодиодов, которые подключены к панельке контактов через резисторы на 220 Ом.
Светодиоды будут служить индикаторами режимов работы робота.
Для разводки дополнительных модулей, я еще решил добавить в шилд управления миниатюрную макетную плату.
Подключение шилда управления роботом
Подключим провода к разъему на 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
Подключение ультразвукового дальномера HC-SR04
Процесс подключения ультразвукового дальномера HC-SR04 к Arduino и работу с ним я описывал ранее. В тонкости в этот раз вдаваться не буду, а лучше подробно распишу как я его закрепил на сервоприводе.
Для создания крепления под ультразвуковой дальномер HC-SR04 я использовал кусок платы от Proto Shield и панельку контактов.
Откусил от панельки контактов две части по 4 контакта и запаял их на плату параллельно.
Перед подключением дальномера я сперва “раскорячил” его контакты, чтобы они плотно держались в разъеме.
Проковырял в плате дырку под болт.
Закрепил модуль на сервоприводе.
В результате у меня получился такой девайс.
Осталось только подключить провода к контактной панельке на плате дальномера и завести их на контакты 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
Читайте также: