Рассмотрим простейший алгоритм движения по черной линии на одном датчике цвета на EV3.
Данный алгоритм является самым медленным, но самым стабильным.
Робот будет двигаться не строго по черной линии, а по ее границе, подворачивая то влево, то вправо и постепенно перемещаясь вперед.
Алгоритм очень простой: если датчик видит черный цвет, то робот поворачивает в одну сторону, если белый — в другую.
Реализация в среде Lego Mindstorms EV3
В обоих блоках движения выбираем режим «включить». Переключатель настраиваем на датчик цвета — измерение — цвет. В нижней части не забудьте изменить «нет цвета» на белый. Также, необходимо правильно указать все порты.
Не забудьте добавить цикл, без него робот никуда не поедет.
Проверьте. Для достижения лучшего результата попробуйте изменить значения рулевого управления и мощности.
Движение с двумя датчиками:
Вы уже знаете алгоритм движения робота по черной линии с использованием одного датчика. Сегодня рассмотрим движение по линии с использованием двух датчиков цвета.
Датчики нужно установить таким образом, чтобы черная линия проходила между ними.
Алгоритм будет следующий:
• Если оба датчика видят белый цвет – двигаемся вперед;
• Если один из датчиков видит белый, а другой черный – поворачиваем в сторону черного;
• Если оба датчика видят черный цвет – мы на перекрестке (например, остановимся).
Для реализации алгоритма нам потребуется отслеживать показания обоих датчиков, и только после этого задавать движение роботу. Для этого будем использовать переключатели, вложенные в другой переключатель. Таким образом, мы опросим сначала первый датчик, а потом, независимо от показаний первого, опросим второй датчик, после чего зададим действие.
Подключим левый датчик к порту №1, правый – к порту №4.
Программа с комментариями:
Не забывайте, что моторы запускаем в режиме «Включить», чтобы они работали столько, сколько необходимо исходя из показаний датчиков. Также, часто забывают о необходимости цикла — без него программа сразу завершится.
Ссылка на сайт, откуда взята информация, и на котором можно найти еще много интересных объяснений:
Эта же программа для модели NXT:
Изучить программу движения. Запрограммировать робота. Переслать видео тестирования модели
Вот мы и добрались до «крайней» возможности посылки из Китая – следование по полосе.
Теоретически эта функция проще Сонара, чего не скажешь о практической реализации…
Но все по порядку.
Необходимо:
— Модуль слежения за полосой с датчикам — 4 x Line inductive module.
— Провода.
— Скотч двухсторонний.
— Изолета белая.
— Отвертка шлицевая малая.
Модуль слежения за полосой с датчикам.
В посылку входят датчики полосы 4 шт и контрольный модуль.
Датчики полосы скреплены – нам нужны 3 датчика, поэтому четвертый оставляем про запас.
Изоленту белую будем использовать в качестве ЛИНИИ по которой будет ехать робот… поэтому рекомендую брать с запасом – мало ли какую «трассу» вы решите построить.
Подключение:
Подключать нужно:
— датчики к модулю слежения;
— модуль слежения Arduino.
Подключение датчиков к модулю простое – у каждого датчика два контакта питания и один сигнальный, подключаем к соответствующим выводам модуля – на каждый датчик три провода.
Модуль слежения подключаем согласно таблице:
Установка:
Установка так же разбита на две части:
— установка датчиков слежения;
— установка модуля слежения.
Обе установки имеют свои особенности…
Датчики слежения.
Должны быть в передней части робота.
Я прикрепил их к верхней палубе, используя, опять-таки, конструктор ЛЕГО и скотч.
В нижней палубе сделал вырез – чтобы датчикам ничего не мешало.
Сразу скажу – пробовал их различное расположение – выше, ниже, перед передней осью, за передней осью – но наилучший эффект на выбранном мною положении.
Возможно, вы найдете лучшее положение – дайте мне знать.
Модуль слежения.
С его размещением есть проблемы. Дело в том, что нам нужен доступ к потенциометрам – регулируемым резисторам на этой плате – с помощью их мы будем настраивать чувствительность датчиков.
При использовании сервопривода из посылки – я разместил модуль за ним (фото в конце).
С доработанным сервоприводом, места для модуля не хватает – поэтому сняв «голову» расположил так:
Вы можете расположить как вам угодно – главное, что бы был доступ к потенциометрам и индикаторам на плате – они понадобятся нам для настройки.
Для крепления использовал двухсторонний скотч и ЛЕГО.
Настройка:
Это единственный случай, когда нам потребуется настройка!
Датчик состоит из двух элементов излучателя и приемника – сигнал от датчика «приемника» поступает в модуль слежения – откуда он уже поступает в Arduino. С помощью потенциометров – подстрочных резисторов можно отрегулировать, на что будет реагировать датчик.
В своих экспериментах я пришел к тому, что на моем линолеуме датчики лучше всего реагируют на белую изолету, чем на черную!
Поэтому полоса у меня белая! Если вы захотите поменять – ездить по «черной» полосе, вы можете изменить настройки на противоположные, а так же поменять скетч.
Самое главное, что нужно знать – для «черного» модуль выдает сигнал HIGH, а для «белого» — LOW!
И так, датчики и модуль подготовлены и подключены – ставим робот на покрытие по которому предстоит путешествовать РОБОТяге, и готовим образе «полосы».
И очень важно! Питание должно быть стабильное и полное! При просадке напряжения вы никогда не настроитесь/не добьетесь нормального результата!
А дальше работа не для слабонервных! Поворачиваем отверткой потенциометры, добиваясь того чтобы светодиод на модуле загорался только тогда, когда «полоса» оказывалась под датчиком:
Сразу предупреждаю – работа тонкая! Отвертку приходится не крутить, а чуть чуть «подталкивать» — что бы добиться необходимой чувствительности!
ВНИМАНИЕ! Для лиц со слабой нервной системой! Не расшатывайте ее дальше! Бросьте это дело!
Если у вас все получилось настроить датчики — 70% работы сделано! Теперь «чуть-чуть» настроить скетч…
Программирование:
Ну и для начала немного теории…
Вообще для того, что бы держать полосу достаточно двух датчиков!
В этом случае система настраивается таким образом, что сигнал от датчиков – отклонение и нужна коррекция.
В нашем случае, датчика три – в зависимости от комбинации сигналов от датчиков робот принимает действия:
— центральный датчик на белой полосе, остальные нет – все в порядке, едем вперед;
— центральный и один боковой на белой полосе – робот начал сбиваться с курса – нужно довернуть в противоположную сторону;
— боковой датчик на белой полосе – робот сбился с курса – нужно развернуться в противоположную сторону.
На случай если все датчики вне белой полосы – беда! Нужно искать полосу!
Логика достаточно простая, но случаи «доворота» и «разворота» в нужную сторону очень тонкие параметры. Если не «довернуть» — робот будет терять полосу… «перевернуть» будет нервным… или тоже потеряет полосу. По правильному, робот в случае отклонения должен стремиться довернуть, пока не поймает полосу и дальше продолжит движение вперед…
Но в моем случае использован «простой» вариант – параметры «доворота» и «разворота» заданы с помощью «задержек» и «скорости»…
В скетче параметры подбирались под конкретного РАБОТягу…
В вашем случае может потребоваться коррект.
И в зависимости от особенностей робота, настройка для движения по часовой и против часовой стрелки может отличаться – самые внимательные могут заметить это в моем скетче.
СКЕТЧ:
[code]//Робот с функцией следования по белой полосе "изоленте".
// *********************** Установка выводов моторов ************************
int MotorLeftSpeed = 5; // Левый (А) мотор СКОРОСТЬ — ENA
int MotorLeftForward = 4; // Левый (А) мотор ВПЕРЕД — IN1
int MotorLeftBack = 2; // Левый (А) мотор НАЗАД — IN2
int MotorRightForward = 8; // Правый (В) мотор ВПЕРЕД — IN3
int MotorRightBack = 7; // Правый (В) мотор НАЗАД — IN4
int MotorRightSpeed = 6; // Правый (В) мотор СКОРОСТЬ — ENB
int duration;
// ********************* Установка выводов датчиков линии *******************
const int LineSensorLeft = 19; // вход левого датчика линии
const int LineSensorM >const int LineSensorRight = 17; // вход правого датчика линии
int SL; // статус левого сенсора
int SM; // статус центрального сенсора
int SR; // статус правого сенсора
// *********************************** SETUP ********************************
void setup ()
<
//*************** Задаем контакты моторов
pinMode (MotorRightBack, OUTPUT); // Правый (В) мотор НАЗАД
pinMode (MotorRightForward, OUTPUT); // Правый (В) мотор ВПЕРЕД
pinMode (MotorLeftBack, OUTPUT); // Левый (А) мотор НАЗАД
pinMode (MotorLeftForward, OUTPUT); // Левый (А) мотор ВПЕРЕД
delay(duration);
//*************** Задаем контакты датчиков полосы
pinMode (LineSensorLeft, INPUT); // определением pin левого датчика линии
pinMode (LineSensorMiddle, INPUT);// определением pin центрального датчика линии
pinMode (LineSensorRight, INPUT); // определением pin правого датчика линии
>
// ****************** Основные команды движения ******************
void forward (int a, int sa) // ВПЕРЕД
<
digitalWrite (MotorRightBack, LOW);
digitalWrite (MotorRightForward, HIGH);
analogWrite (MotorRightSpeed, sa);
digitalWrite (MotorLeftBack, LOW);
digitalWrite (MotorLeftForward, HIGH);
analogWrite (MotorLeftSpeed, sa);
delay (a);
>
void right (int b, int sb) // ПОВОРОТ ВПРАВО (одна сторона)
<
digitalWrite (MotorRightBack, LOW);
digitalWrite (MotorRightForward, LOW);
digitalWrite (MotorLeftBack, LOW);
digitalWrite (MotorLeftForward, HIGH);
analogWrite (MotorLeftSpeed, sb);
delay (b);
>
void left (int k, int sk) // ПОВОРОТ ВЛЕВО (одна сторона)
<
digitalWrite (MotorRightBack, LOW);
digitalWrite (MotorRightForward, HIGH);
analogWrite (MotorRightSpeed, sk);
digitalWrite (MotorLeftBack, LOW);
digitalWrite (MotorLeftForward, LOW);
delay (k);
>
void turnR (int d, int sd) // БЫСТРЫЙ ПОВОРОТ ВПРАВО (обе стороны)
<
digitalWrite (MotorRightBack, HIGH);
digitalWrite (MotorRightForward, LOW);
analogWrite (MotorRightSpeed, sd);
digitalWrite (MotorLeftBack, LOW);
digitalWrite (MotorLeftForward, HIGH);
analogWrite (MotorLeftSpeed, sd);
delay (d);
>
void turnL (int e, int se) // БЫСТРЫЙ ПОВОРОТ ВЛЕВО (обе стороны)
<
digitalWrite (MotorRightBack, LOW);
digitalWrite (MotorRightForward, HIGH);
analogWrite (MotorRightSpeed, se);
digitalWrite (MotorLeftBack, HIGH);
digitalWrite (MotorLeftForward, LOW);
analogWrite (MotorLeftSpeed, se);
delay (e);
>
void back (int g, int sg) // НАЗАД
<
digitalWrite (MotorRightBack, HIGH);
digitalWrite (MotorRightForward, LOW);
analogWrite (MotorRightSpeed, sg);
digitalWrite (MotorLeftBack, HIGH);
digitalWrite (MotorLeftForward, LOW);
analogWrite (MotorLeftSpeed, sg);
delay (g);
>
void stopp (int f) // СТОП
<
digitalWrite (MotorRightBack, LOW);
digitalWrite (MotorRightForward, LOW);
digitalWrite (MotorLeftBack, LOW);
digitalWrite (MotorLeftForward, LOW);
delay (f);
>
// *********************************** LOOP *********************************
// ********************** Режим следования по ЛИНИИ *************************
void loop ()
<
SL = digitalRead (LineSensorLeft); // считываем сигнал с левого датчика полосы
SM = digitalRead (LineSensorMiddle); // считываем сигнал с центрального датчика полосы
SR = digitalRead (LineSensorRight); // считываем сигнал с правого датичка полосы
Я показал пример следования по полосе на примере четырех колесного робота.
Но как правило, роботы для движения по полосе строят трехколесные – они больше всего подходят для управления «реверсом» колес. Хотя и выглядит это смешно – как трясогузка :)
По началу РОБОТягу был таким:
Ну вот и все!
Стандартный «пакет опций» заложенный фасовщиком посылки я попробовал.
Но это не предел его возможностей!
Об этом я расскажу отдельно – если кому то будет интересно.
Описание презентации по отдельным слайдам:
“Алгоритм движения по черной линии с одним датчиком цвета” Кружок по «Робототехнике» Педагог до Езидов Ахмед Элиевич При МБУ ДО «Шелковской ЦТТ»
Для изучения алгоритма движения по черной линии, будет использоваться робот Lego Mindstorms EV3 с одним датчиком цвета
Датчик цвета Датчик цвета различает 7 цветов и может определить отсутствие цвета. Как и в NXT, он может работать как датчик освещенности. Поле для соревнований роботов "Линия S" Предлагаемый полигон с трассой в форме буквы "S" позволит вам провести еще одно интересное тестирование созданных роботов на скорость и реакцию.
Рассмотрим простейший алгоритм движения по черной линии на одном датчике цвета на EV3. Данный алгоритм является самым медленным, но самым стабильным. Робот будет двигаться не строго по черной линии, а по ее границе, подворачивая то влево, то вправо и постепенно перемещаясь вперед Алгоритм очень простой: если датчик видит черный цвет, то робот поворачивает в одну сторону, если белый — в другую.
Движение по линии в режиме яркости отраженного света с двумя датчиками Иногда датчик цвета недостаточно эффективно может различить черный и белый цвета. Решение этой проблемы заключается в использовании датчика не в режиме определения цвета, а в режиме определения яркости отраженного света. В этом режиме мы, зная значения датчика на темной и светлой поверхности, самостоятельно можем говорить, что будет считаться белым, а что черным.
Теперь определим значения яркости на белой и черной поверхностях. Для этого в меню блока EV3 находим вкладку «Приложения модуля» Теперь вы находитесь в окне просмотра портов и можете увидеть показания всех датчиков на текущий момент.
наши датчики должны подсветиться красным, что означает, что они работают в режиме определения яркости отраженного света. Если же они светят синим – в окне просмотра портов на нужном порте нажимаем центральную кнопку и выбираем режим COL-REFLECT. Теперь поставим робота так, чтобы оба датчика располагались над белой поверхностью. Смотрим на цифры в портах 1 и 4. В нашем случае, значения 66 и 71 соответственно. Это и будут значения белого у датчиков.
Теперь поставим робота так, чтобы датчики располагались над черной поверхностью. Снова посмотрим значения портов 1 и 4. У нас 5 и 6 соответственно. Это – значения черного.
Дальше, мы изменим предыдущую программу. А именно – изменим настройки переключателей. Пока у них установлено Датчик цвета -> Измерение -> Цвет.
Нам же требуется установить Датчик цвета -> Сравнение -> Яркость отраженного света Теперь мы должны установить «тип сравнения» и «пороговое значение». Пороговое значение – это значение некоторого «серого», значения меньше которого мы будем считать черным, а больше – белым. Для первого приближения удобно использовать среднее значение между белым и черным каждого датчика.
Таким образом, пороговое значение первого датчика (порт №1) будет (66+5)/2=35.5. Округлим до 35. Пороговое значение второго датчика (порт №4): (71+6)/2 = 38.5. Округлим до 38. Теперь выставляем эти значения в каждом переключателе соответственно. Вот и все, блоки с движениями остаются на своих местах без изменений, так как, если мы ставим в «типе сравнения» знак « 12 слайд
Это было краткое руководство по программированию робота Lego ev3, для движения по черной линии, с одним и двумя датчиками цвета
- Езидов Ахмед ЭлиевичНаписать 21315 27.02.2017
Номер материала: ДБ-231854
-
27.02.2017 380
-
27.02.2017 875
-
27.02.2017 329
-
27.02.2017 583
-
27.02.2017 205
-
27.02.2017 245
Не нашли то что искали?
Вам будут интересны эти курсы:
Все материалы, размещенные на сайте, созданы авторами сайта либо размещены пользователями сайта и представлены на сайте исключительно для ознакомления. Авторские права на материалы принадлежат их законным авторам. Частичное или полное копирование материалов сайта без письменного разрешения администрации сайта запрещено! Мнение редакции может не совпадать с точкой зрения авторов.
Ответственность за разрешение любых спорных моментов, касающихся самих материалов и их содержания, берут на себя пользователи, разместившие материал на сайте. Однако редакция сайта готова оказать всяческую поддержку в решении любых вопросов связанных с работой и содержанием сайта. Если Вы заметили, что на данном сайте незаконно используются материалы, сообщите об этом администрации сайта через форму обратной связи.