Робот движущийся по линии своими руками

Добавил пользователь Валентин П.
Обновлено: 18.09.2024

Давненько хотел собрать робота. Самого простого, который только и умеет, что ходить по нарисованной чёрной линии. Но руки всё никак не доходили.

Идея робота не нова, первый такой робот появился аж в 1929 году (!) и носил название кибернетический Тузик. Впервые встретил схему и описание робота в книге "Юный кибернетик" 1979 года. Книга мне попала в руки, когда мне было примерно 10 лет, и робот убил меня наповал своей супермегаложностью.

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

Электрическую схему не буду даже приводить, она невероятно сложна и содержит сотни радиоэлементов. И единственное что робот умел, это ходить по линии. Что странно даже в то время, с имеющимися тогда в наличии транзисторами МП42, было возможно повторить предложенную ниже простейшую схему.

В детстве не хватало знаний, а потом не хватало времени, но тут помогла самоизоляция. Но вот беда под рукой слишком мало деталей для реализации задумки, а радиомагазин закрыт на карантин. На просторах интернета множество современных схем "простых" роботов. Простых в кавычках так-как для их реализации предлагают использовать Ардруино или микроконтроллеры. И даже сравнительно простые схемы содержат слишком много деталей. Я же решил упростить схему максимально и сделать её пригодной для повторения, даже тому, кто в первый раз взял в руки паяльник. В большинстве схем у подобных роботов 2 глаза-фотодадчика, мы же обойдёмся одним. И так схема.

Я даже сам до сих пор не верю, что настолько простая схема работает, но факт остаётся фактом. Схема представляет собой подобие простейшего фотореле. Когда фотодадчик ФР1 "видит" чёрную линию количество принимаемого света мало и реле Р1 выключено, работает мотор М1 разворачивая робота в сторону белой бумаги. Попадая на белую бумагу фотодадчик открывает транзистор Т1 , срабатывает реле Р1 и теперь работает мотор М2 разворачивая робота обратно в сторону к чёрной линии. Цикл бесконечно повторяется. По сути, робот не едет вперёд, а пытается повернуть то вправо то влево, из-за этого движение напоминает шаги, попеременно то правым, то левым колесом.

Моторы М1 и М2 любые от игрушек с редуктором понижающим обороты. Можно без проблем заказать с алиэкспресс. Я использовал бесшумные моторчики от неисправных новогодних переливающихся ламп. Стоит заметить, что чем медленнее движется робот, тем по более тонкой линии он способен ехать.

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

Транзистор Т1 подойдёт практически любой биполярный транзистор малой мощности n-p-n структуры. Я применил КТ315. При замене на аналоги необходимо учесть что будет другая цоколёвка.

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

Светодиод Д1 служит для подсветки и устанавливается вблизи фотодадчика ФР1 . Но между ними нужно установить непрозрачный барьер для исключения засветки. Вместо барьера светодиод и фотодадчик можно обернуть изолентой или надеть на них термоусадочную трубку. Для ограничения тока на светодиоде до 3х вольт установлен резистор R1 . Подойдёт любой, достаточно яркий, светодиод.

Реле Р1 подойдёт любого типа на ток срабатывания 3-5 вольт.

Батарея Б1 - 3 пальчиковые батарейки. Но можно использовать и аккумулятор от телефона.

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

Подписывайтесь на канал . Буду и дальше рассказывать о интересном и необычном в Норильске. Поддержать проект и приобрести Сувениры можно в магазине Norgame .

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 Расчет ошибок:

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

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

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

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

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

Код для вычисления 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.



Необходимо:
— Модуль слежения за полосой с датчикам — 4 x Line inductive module.
— Провода.
— Скотч двухсторонний.
— Изолета белая.
— Отвертка шлицевая малая.

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


Подключение:
Подключать нужно:
— датчики к модулю слежения;
— модуль слежения Arduino.

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



Модуль слежения подключаем согласно таблице:


Установка:
Установка так же разбита на две части:
— установка датчиков слежения;
— установка модуля слежения.
Обе установки имеют свои особенности…

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



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

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


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


СКЕТЧ:
[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); // считываем сигнал с правого датичка полосы


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

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

Вот так выглядит этот робот


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

Список нужных вам элементов

  • Пара транзисторов VT2 КТ972 (данный составной транзистор можете поменять на два обычных).




Примечание

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


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


Вот ещё одна фотка данного робота


Принцип работы этого работа: когда попадает свет на фотоэлемент начинается вращение моторчика.

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