Робот который ходит по линии

Робот который ходит по линии


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

Примечание: для выполнения этого проекта, использовалась платформа EasyEDA (проект PICTO92 Line follower), поэтому проект легко повторить заказав изготовление платы.

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

При этом, любой робот обладает такими важными чертами, как: датчики, акутаторы, энергия, интеллект.

Шаг 1: Что такое робот следующий по линии?



Робот называется следующий по линии (line follower), потому, что он выполняет задачу следования по чёрной дорожке (которую вы для него нарисуете).
Чтобы робот двигался, потребуются два двигателя постоянного тока, и, разумеется, некоторые датчики, такие как ИК-приёмопередатчик, который обнаруживает линию и позволяет следовать за ней.
В качестве контроллера, можно использовать Arduino Nano, но можно использовать и другие контроллеры, чтобы иметь возможность управлять колёсами, в зависимости от сигналов датчиков.
Для управления двигателями, потребуется драйвер двигателей — микросхема L293, которая позволяет контролировать направление и скорость вращения двигателей постоянного тока.
Например, если вы захотите, чтобы робот повернул налево, вы должны замедлить работу левого двигателя и ускорить работу правого двигателя. Если сделать наоборот, то робот повернёт направо, а если поддерживать одинаковую скорость вращение двигателей, то робот будет ехать прямо.


Но как найти чёрную линию?
Чтобы робот мог следовать по линии, используются ИК-датчики.
Чёрная поверхность линии сильнее поглощает свет, а окружающая белая поверхность, наоборот, его отражает.
Установка пары датчиков на передней стороне робота, позволит удерживать чёрную линию в промежутке между ними. Сравнивая показания датчиков, можно определить, что они не получают отраженный свет, компаратор датчика выставляет логическую 1 на ножке микроконтроллера, а микроконтроллер, в свою очередь, включает двигатель, связанный с этим датчиком.
И наоборот, когда какой-либо из датчиков окажется над черной линией, то микроконтроллер останавливает двигатель, связанный с этим датчиком, и тем самым поворачивает робота в направлении чёрной линии.

Когда робот достигает конечной точки (финиша), то оба датчика определяют чёрную поверхность, что приводит к остановке робота.


Шаг 2. Дизайн механизма

Робот должен иметь какую-нибудь механическую структуру (хотя бы для удержания электронных деталей из которых он сделан), поэтому был разработан дизайн механики робота. Для этого, автор использовал программное обеспечение SolidWorks, чтобы сделать верхнюю и нижнюю базовые пластины для робота.
Для повторения, доступны dxf-файлы, по которым на ЧПУ-станке для лазерной резки можно изготовить свою версию механики.

Шаг 3: Дизайн печатной платы с использованием платформы EasyEDA

Получить схему и печатную плату

О EasyEDA
EasyEDA — это бесплатное онлайн-сообщество автоматизации проектирования, которое позволяет создавать, тестировать и редактировать схемы и печатные платы. Cсылка на платформу EasyEDA.

Онлайн-программа EasyEDA, поддерживается на всех платформах (включая Android) с её помощью можно редактировать свои электрические схемы, есть симулятор схем, онлайн-трассировщик и редактор топологии, с возможностью импорта файлов схемы и топологии.
Мы можем создать свою схему, как в онлайн-редакторе, так и нарисовать её в какой-либо другой программе, а потом загрузить gerber-файлы в easyEDA, чтобы сразу же заказать изготовление.


Как изготовить печатную плату с помощью EasyEDA
Сначала, нужно запустить платформу EasyEDA, затем запустить новый проект и импортировать необходимые компоненты, такие как Arduino Nano, драйвер двигателя L293, пины и т.д.
Теперь, нужно соединить их вместе, чтобы получилась схема, как на картинке, после чего просто нажать на Конвертировать проект в PCB. Вы получите область дизайна печатной платы.
Нажмите на следующую ссылку, чтобы получить уже готовые схемы: PICTO92 Line follower

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

Закончив дизайн, остаётся перейти к выпуску продукции, где можно задать параметры изготовления плат, например, чёрный цвет маски. Осталось оплатить изготовление и дождаться доставки.


Через несколько дней, можно получить готовые печатные платы, которые с чёрной маской и своей круглой формой действительно смотрятся потрясающе. Можно видеть, выполненное название робота PICTO92 и другую полезную информацию. EasyEDA действительно впечатляет высоким качеством изготовления.

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


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

Пластины робота из оргстекла
Плата от EasyEDA
Два двигателя постоянного тока с двумя колесами
Контроллер Arduino Nano
Четыре инфракрасных датчика (TCRT5000)
Драйвер двигателя L293
Четыре светодиода 3 мм
Четыре резистора 330 Ом
Пины для подключения Arduino
9В батарейка для питания

Шаг 5: Сборка

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

Читайте также:  Сколько битов информации содержит любое трехзначное число


После этого, используйте винты, чтобы прикрепить двигатели постоянного тока и ИК-датчики к структуре из оргстекла. Для подключения датчиков и двигателей к печатной плате, понадобится использовать провода и соединители разъемов.


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

Шаг 6: Проверка кода и тестирование

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


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

Автор проекта DIY Line Follower Robot — Mohamed Belkhir

Принципиальная схема робота

Прошивка робота для следования по линии

Вот мы и добрались до «крайней» возможности посылки из Китая – следование по полосе.
Теоретически эта функция проще Сонара, чего не скажешь о практической реализации…
Но все по порядку.

Необходимо:
— Модуль слежения за полосой с датчикам — 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 LineSensorMiddle = 18; // вход центрального датчика линии
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); // считываем сигнал с правого датичка полосы


Я показал пример следования по полосе на примере четырех колесного робота.
Но как правило, роботы для движения по полосе строят трехколесные – они больше всего подходят для управления «реверсом» колес. Хотя и выглядит это смешно – как трясогузка 🙂
По началу РОБОТягу был таким:

Ну вот и все!
Стандартный «пакет опций» заложенный фасовщиком посылки я попробовал.
Но это не предел его возможностей!
Об этом я расскажу отдельно – если кому то будет интересно.

Читайте также:  Как удалить пунктирную линию в ворде

1. PID — это простой, но очень эффективный метод управления, в котором контролируется конкретная физическая либо электрическая величина и устанавливается равной заданному значению, называемому «установкой». В этом случае мы будем контролировать скорость правого и левого двигателей робота, чтобы робот следовал за центром черной линии, используя Arduino. Это делается путем вычисления величины отклонения робота от центра линии с помощью ИК-датчиков.

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

  • 5 цифровых ИК-датчиков
  • Arduino Board (например UNO)
  • 2 электродвигателя постоянного тока
  • Драйвер двигателей, например на базе L298N
  • Провода для перемычек

3. Подключение

• Подключите 5 цифровых ИК-датчиков к аналоговым входам (вы можете считывать цифровые значения с аналоговых входов).
• Подключите левый двигатель двигателя к цифровым контактам 7 и 6
• Подсоедините правильные выводы двигателя к цифровым контактам 5 и 4
• Подключите штыри ШИМ к контактам 9 и 3
Так же проверьте подключения по схеме ниже

4. Создание программы

Поскольку мы используем цифровые ИК-датчики, выход датчиков будет 0, если он обнаружит белый и 1, если он обнаружит черный цвет. Итак, помните об этом:

Значение датчика Позиция
0 0 1 0 0 Центр линии
1 0 0 0 0 Право линии
0 0 0 0 1 Слева от линии

4.1. Объявление и инициализация переменных

Давайте инициализируем все переменные в 0 и пусть начальная скорость двигателя будет равна 100. Также инициализируем порты. Можно так же использовать последовательный монитор для просмотра значений разных переменных. Это будет полезно для настройки.

Код объявление и инициализация переменных

4.2 Расчет ошибок:

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

Значения массива датчиков Значение ошибки
0 0 0 0 1 4
0 0 0 1 1 3
0 0 0 1 0 2
0 0 1 1 0 1
0 0 1 0 0
0 1 1 0 0 -1
0 1 0 0 0 -2
1 1 0 0 0 -3
1 0 0 0 0 -4
0 0 0 0 0

-5 или 5 (в зависимости от предыдущего значения)

Код для расчета ошибок:

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

4.3 Вычисление значения PID

Теперь значение из переменной Error, которая рассчитывается в функции read_sensor_values() следует обработать в calculate_pid, которая будет вычислять значение PID и отправлять это значение на двигатель. Ошибка будет добавляться к интегральному члену на каждой итерации. Кроме того, текущее значение «error» должно стать значением «previous_error» для следующей итерации.

Код для вычисления PID

4.4 Блок управления двигателем

Значение PID_value может быть положительным или отрицательным. Поэтому, если оно отрицательное, то скорость левого двигателя увеличивается, а скорость правого двигателя уменьшается, и наоборот, если значение PID положительное.

Код для управления двигателем:

4.5. Функция цикла loop()

Давайте объединим все функции в главном цикле loop (). Помните, что порядок, в котором вы помещаете свои функции в функцию loop, очень важен.

5. Настройка значений Kp, Ki, Kd

Это самая важная часть вашей программы. Константы PID, т. е. Kp, Ki и Kd, настраиваются только методом проб и ошибок. Эти значения будут разными для каждого робота и для каждой конфигурации. Попробуйте этот метод во время настройки:

Это самая важная часть вашей программы. Константы PID, то есть., Kp, ki и KD значения настраиваются только методом проб и ошибок. Эти значения будут различны для каждого робота и для каждой конфигурации.

  • Попробуйте следующий метод для настройки:
  • Начните с Kp, Ki и Kd равными 0 и работать с Kp в первую очередь. Попробуйте установить значение Kp равным 1 и понаблюдайте за роботом. Цель состоит в том, чтобы заставить робота следовать по линии, даже если линия очень узкая или нечеткая. Если робот потеряет линию, уменьшите значение Kp. Если робот не сможет поворачивать или Вам кажется, что робот долго ищет направление поворота , увеличьте значение Kp.
  • Как только робот сможет немного двигаться по линии, присвойте Kd значение 1 (пропустите настройку Ki в данный момент). Попробуйте увеличить это значение, пока не увидите меньшее количество колебаний робота на линии.
  • После того, как робот будет достаточно устойчив при движении по линии, присвойте Ki значение от 0,5 до 1,0. Если значение Ki слишком велико, робот будет часто дергаться влево и вправо. Поскольку Интеграл является кумулятивным, значение Ki оказывает значительное влияние. Вы можете регулировать Ki с шагом 0.01.
  • После того, как робот будет двигаться по линии с хорошей точностью, вы можете увеличить скорость и посмотреть, сможет ли он по-прежнему следовать по линии. Скорость влияет на регулятор PID и будет требовать настройки по мере того как изменяется скорость.

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

Ссылка на основную публикацию
Регулятор громкости для автомагнитолы
Бывший хозяин видимо пытаясь снять магнитолу за рукоятку громкости, сломал её. В результате громкость не регулировалась, а отпаявшиеся контакты энкодера...
Работа с far manager
Фар менеджер - один из самых удобных файловых менеджеров, рассчитанный на работу с файлами и папками на дисках, прежде всего,...
Работа с классами python
Серия контента: Этот контент является частью # из серии # статей: Этот контент является частью серии: Следите за выходом новых...
Регулярные выражения perl примеры
Regular expressions, или регулярные выражения - способ определения символьной маски для последующего сравнения с ней строки символов или для обработки...
Adblock detector