Этот пример проекта робота на Arduino, следующего вдоль линии, демонстрирует профессиональные идеи робототехники на Arduino в процессе обучения на практике. Наша полная блок-схема робота-следопыта на основе платы Arduino UNO начинается с подробного объяснения аппаратных соединений, а затем переходит к объяснению логики программного обеспечения. Полный код робота-следопыта на Arduino, представленный здесь, был протестирован и надежно работает с указанными компонентами. Этот проект робота-следопыта на Arduino — отличная отправная точка для изучения более сложных роботов. Вы можете увеличить сложность, легко превратив его в робота-разгадывателя лабиринтов , который не только следует по линии, но и самостоятельно решает лабиринт, чтобы найти выход.

Для создания этого проекта вам потребуются базовые знания Arduino. Ориентировочное время сборки составляет 2-3 часа для начинающих или пользователей среднего уровня подготовки, а общая стоимость проекта составит от 25 до 30 долларов. Это всеобъемлющее руководство по проекту робота-следопыта на Arduino охватывает все аспекты, от базовой блок-схемы робота-следопыта на Arduino до оптимизации кода для продвинутого робота-следопыта на Arduino. Оно представляет собой профессиональное руководство по проекту робота-следопыта на Arduino.

Ранее на нашем сайте мы уже рассматривали проект движущегося вдоль линии робота на Arduino, но этот проект значительно более подробно объяснен и содержит способы увеличения эффективности подобного робота. Также мы рассматривали проекты подобного робота и на других аппаратных платформах:
- на микроконтроллере AVR;
- на микроконтроллере PIC;
- на плате MSP430G2;
- на плате Raspberry Pi;
- на плате Raspberry Pi Pico.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Инфракрасные датчики - 2 шт. (купить на AliExpress).
- Драйвер двигателей L293D (купить на AliExpress).
- Батарея 7,4 или 9 В.
- Двигатель BO - 2 шт.
- Моторное колесо - 2 шт.
- Колесики на роликах.
- Шасси для любительского робота.
- Соединительные провода.
- Винты.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Помимо перечисленных компонентов, вам также понадобятся несколько инструментов, таких как паяльник и припой, инструмент для зачистки проводов, набор отверток, клеевой пистолет и т. д. Также рекомендуется иметь несколько дополнительных компонентов, таких как монитор напряжения батареи, выключатель питания и дополнительный ИК-датчик, на случай, если вам понадобится устранить неполадки робота в дальнейшем.

Принцип работы робота следующего вдоль линии
Как уже говорилось ранее, робот-следопыт следует по линии, и для этого он должен сначала обнаружить линию. Теперь вопрос в том, как реализовать механизм обнаружения линии у робота. Всем известно, что отражение света от белой поверхности максимально, а от черной — минимально, поскольку черная поверхность поглощает максимальное количество света. Поэтому мы будем использовать это свойство света для обнаружения линии. Для обнаружения света можно использовать либо фоторезистор (LDR), либо инфракрасный датчик.
Для этого проекта мы используем ИК-датчик из-за его более высокой точности. Для обнаружения линии мы размещаем два ИК-датчика: один слева, а другой справа от робота, как показано на схеме ниже. Затем мы устанавливаем робота на линию так, чтобы линия проходила посередине между показаниями обоих датчиков.

Инфракрасные датчики состоят из двух элементов: передатчика и приемника. Передатчик представляет собой, по сути, ИК-светодиод, который генерирует сигнал, а ИК-приемник — фотодиод, который улавливает сигнал, генерируемый передатчиком. ИК-датчики излучают инфракрасный свет на объект; свет, попадающий на черную часть, поглощается, выдавая низкий выходной сигнал, а свет, попадающий на белую часть, отражается на передатчик, который затем детектирует инфракрасный приемник, выдавая аналоговый выходной сигнал. Используя описанный принцип, мы управляем движением робота, приводя в движение колеса, прикрепленные к двигателям, которые управляются микроконтроллером.
Как код робота на Arduino управляет навигацией
Типичный робот, следующий по линии, имеет два комплекта двигателей, назовем их левым и правым. Оба двигателя вращаются в зависимости от сигнала, получаемого от левого и правого датчиков соответственно. Роботу необходимо выполнить 4 типа движений, включая движение вперед, поворот налево, поворот направо и остановку. Описание каждого типа движений приведено ниже.
Движение вперед:

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

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

Этот случай аналогичен левому, но в этой ситуации линию обнаруживает только правый датчик, а это значит, что робот должен повернуть в нужном направлении. Чтобы повернуть робота вправо, левый двигатель вращается вперед, а правый — назад, и в результате робот поворачивает вправо.
Остановка:

В данном случае оба датчика расположены над линией и могут одновременно обнаруживать черную линию; микроконтроллер получает сигнал о необходимости остановки процесса. Следовательно, оба двигателя останавливаются, что приводит к остановке движения робота.
Схема робота
Схема робота, следующего вдоль линии, на основе платы Arduino, приведена на следующем рисунке.
Схема состоит в основном из четырех частей: двух ИК-датчиков, одного привода двигателя, двух двигателей, одной платы Arduino, батареи и нескольких соединительных проводов. Датчик улавливает ИК-свет, отраженный от поверхности, и подает выходной сигнал на встроенный операционный усилитель-компаратор. Когда датчик расположен на белом фоне, излучаемый им свет отражается от белого грунта и принимается приемником. Но когда датчик находится на черном фоне, свет от источника не отражается на датчик. Датчик измеряет интенсивность отраженного света и выдает выходной сигнал.
Выходной сигнал датчика поступает на микроконтроллер, который выдает команды драйверу двигателя для соответствующего управления двигателем. В нашем проекте Arduino Uno запрограммирован таким образом, чтобы робот двигался вперед, поворачивал направо или налево и останавливался в зависимости от входного сигнала, поступающего от датчика. Выходной сигнал Arduino поступает на драйвер двигателя.
Почему нам нужен драйвер двигателя?
Причина использования драйвера двигателя заключается в том, что выходного сигнала Arduino недостаточно для управления двигателем. Кроме того, нам необходимо вращать двигатели в обоих направлениях; поэтому мы используем драйвер двигателя для управления ими по мере необходимости, а также для обеспечения достаточного тока для работы двигателя. В данном случае мы используем драйвер двигателя L293D, который представляет собой двухканальный H-мостовой драйвер двигателя и подходит для наших двух двигателей.
Микросхема L293D имеет 16 выводов; расположение выводов L293D показано на схеме ниже.

Подключение драйвера двигателя к Arduino UNO
Контакты 1 и 9 являются контактами включения; для включения двигателя мы подключаем эти два контакта к входу 5 В.
Контакты 1A, 2A, 3A и 4A являются управляющими контактами.
Например, двигатель повернется вправо, если контакт 1A перейдет в низкое состояние, а контакт 2A — в высокое, и повернется влево, если контакт 1A перейдет в низкое состояние, а контакт 2A — в высокое. Поэтому мы подключаем эти контакты к выходным контактам декодера.
Контакты 1Y, 2Y, 3Y и 4Y — это контакты для подключения двигателя.
Примечание: Vcc2 — это вывод напряжения управления двигателем, и он используется только в том случае, если вы используете высоковольтный двигатель.
Подключение контактов Arduino Uno к драйверу двигателя осуществляется следующим образом:

Здесь для питания всей схемы используется литий-ионный аккумулятор емкостью 7,4 В. Вы можете использовать любой тип аккумулятора от 6 до 12 вольт. Для перемещения робота нам нужны двигатели с низкой частотой вращения, но достаточно высоким крутящим моментом, чтобы выдерживать вес робота. Поэтому для этого робота я выбрал два редукторных двигателя с частотой вращения 60 об/мин и напряжением 6 В, работающих от аккумулятора.
Драйвер двигателя L298N для робота, следующего по линии
При выборе драйвера двигателя для робота, следующего по линии, у нас есть два варианта. Первый — это модуль L293D, который мы уже обсуждали, а второй — модуль драйвера двигателя L298N. На момент создания этого проекта модуль L293D был наиболее популярным вариантом, но в последнее время стоимость модуля драйвера двигателя L298N значительно снизилась, поэтому мы обновляем этот проект, чтобы использовать модуль драйвера двигателя L298N. Схема для создания робота, следующего по линии, с использованием модуля драйвера двигателя L298N показана ниже.

Для упрощения соединений мы также пометили детали и обозначили провода. Вы можете просто следовать приведенной выше схеме и выполнить соединения. Теперь, когда вы понимаете схему робота, следующего по линии, давайте начнем его собирать.
Сравнение драйверов двигателей L293D и L298N
Сборка робота, следующего вдоль линии
Как только мы разберемся во взаимосвязи всех компонентов, мы можем приступить к сборке нашего робота. Подробная пошаговая процедура сборки робота представлена в видеоролике, размещенном в конце статьи.

Для создания этого робота сначала нам понадобится корпус; здесь я использую самодельное шасси. Вы можете использовать готовое шасси или сделать его самостоятельно. Теперь прикрепите двигатели BO к шасси с помощью горячего клея, как показано на изображении ниже.

Следующий шаг — установить драйвер двигателя на шасси, подключить провода двигателя к выходу драйвера, а также согнуть ИК-светодиод и датчик, как показано на изображении.

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

Теперь закрепите Arduino Uno с помощью клея и подключите выходные контакты датчика к цифровым контактам 2 и 4 Arduino.

Подключите контакты VCC к 5 вольтам, а контакты заземления — к земле. Теперь подключите контакты включения драйвера двигателя к контактам 5 и 8 Arduino, а входные контакты драйвера двигателя — к контактам 6, 7, 9 и 10 Arduino соответственно. Наконец, подключите батарею к схеме и установите её на шасси. Здесь я соединил всё перемычками. Для более надёжной фиксации можно просто всё спаять. Затем переверните плату вверх дном и с помощью клеевого пистолета прикрепите колёсики, как показано на изображении ниже.

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

Объяснение кода программы
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Код для робота-следопыта на Arduino разработан для начинающих, но при этом сохраняет профессиональную функциональность. Этот код реализует все четыре основных движения с понятными, прокомментированными функциями. Программирование робота-следопыта очень простое, и нам требуются только базовые функции Arduino.
Первый шаг — определить каждый используемый нами вывод Arduino. Я начал с управления выводами драйверов и выводами датчиков. Для вашего удобства я прокомментировал каждую строку кода.
|
1 2 3 4 5 6 7 8 |
#define enA 5 //Enable1 L293 Pin enA #define in1 6 //Motor1 L293 Pin in1 #define in2 7 //Motor1 L293 Pin in1 #define in3 9 //Motor2 L293Pin in1 #define in4 10 //Motor2 L293 Pin in1 #define enB 8 //Enable2 L298 Pin enB #define R_S 4 // Right sensor #define L_S 2 // Left sensor |
В разделе цикла объявите режимы работы каждого контакта. Здесь нам нужно считывать выходные сигналы ИК-датчиков; поэтому я определил эти контакты как входы. Двигатель должен управляться Arduino, поэтому контакты драйвера двигателя определены как выходы. Наконец, я слишком сильно подтянул вывод enable.
|
1 2 3 4 5 6 7 8 9 10 |
pinMode(R_S, INPUT); pinMode(L_S, INPUT); pinMode(enA, OUTPUT); pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(in3, OUTPUT); pinMode(in4, OUTPUT); pinMode(enB, OUTPUT); digitalWrite(enA, HIGH); digitalWrite(enB, HIGH); |
В разделе цикла мы сначала считываем значения ИК-датчиков, а затем используем условие «если» для управления движением двигателя в соответствии с нашими требованиями. Четыре условия движения описаны ниже.
Движение вперед
|
1 |
if((digitalRead(R_S) == 0)&&(digitalRead(L_S) == 0)){forward();} |
В этом случае, если правый и левый датчики расположены на белом фоне, робот должен двигаться вперед, поэтому мы вызываем функцию движения вперед.
Примечание: здесь 0 означает, что выходной сигнал ИК-датчика высокий, поскольку датчик находится на белой поверхности.
Поворот вправо
|
1 |
if((digitalRead(R_S) == 1)&&(digitalRead(L_S) == 0)){turnRight();} |
Если правый датчик обнаруживает черный цвет, а левый датчик не обнаруживает черную линию, то он вызовет функцию Right, инициируя протокол для выполнения правого поворота путем вызова функции turnRight.
Поворот влево
|
1 |
if((digitalRead(R_S) == 0)&&(digitalRead(L_S) == 1)){turnLeft();} |
Если правый датчик показывает белый цвет, а левый — черный, то будет вызвана функция turnLeft. Она инициирует шаги для поворота робота влево.
Остановка робота
|
1 |
if((digitalRead(R_S) == 1)&&(digitalRead(L_S) == 1)){Stop();} |
Если правый и левый датчики находятся на чёрном цвете, сработает функция остановки. В этом случае робот полностью остановится.
Мы определили 4 функции робота: движение вперёд, поворот налево, поворот направо и остановка. Код для выполнения этих функций приведён ниже.
Функция для движения вперед
|
1 2 3 4 5 6 |
void forward(){ digitalWrite(in1, HIGH); digitalWrite(in2, LOW); digitalWrite(in3, LOW); digitalWrite(in4, HIGH); } |
Этот код означает, что мы подаем слишком высокое напряжение на входы 1 и 4 драйвера двигателя, в результате чего оба двигателя будут двигаться вперед в одном и том же направлении.
Функция поворота направо
|
1 2 3 4 5 6 |
void turnRight(){ digitalWrite(in1, LOW); //Right Motor forword Pin digitalWrite(in2, HIGH); //Right Motor backword Pin digitalWrite(in3, LOW); //Left Motor backword Pin digitalWrite(in4, HIGH); //Left Motor forword Pin } |
Функция поворота налево
|
1 2 3 4 5 6 |
void turnLeft(){ digitalWrite(in1, HIGH); //Right Motor forword Pin digitalWrite(in2, LOW); //Right Motor backword Pin digitalWrite(in3, HIGH); //Left Motor backword Pin digitalWrite(in4, LOW); //Left Motor forword Pin } |
Функция остановки
|
1 2 3 4 5 |
void Stop(){ digitalWrite(in1, LOW); //Right Motor forword Pin digitalWrite(in2, LOW); //Right Motor backword Pin digitalWrite(in3, LOW); //Left Motor backword Pin digitalWrite(in4, LOW); //Left Motor forward Pin |
Итак, это все о программировании. Теперь нам нужно загрузить код на Arduino, а для этого подключите Arduino к компьютеру с помощью USB-кабеля и загрузите этот код с помощью Arduino IDE.
Тестирование и калибровка робота

Мы собрали робота и загрузили код, теперь пришло время посмотреть, как он работает. Если он не сможет следовать по линии, нам придётся его откалибровать. Для начала поместите робота на чёрную поверхность (оба датчика должны находиться на чёрной поверхности), затем отрегулируйте переменный резистор ИК-модуля до тех пор, пока светодиод на выходе ИК-модуля не погаснет. Затем поместите робота на белую поверхность и проверьте, загорается ли светодиод; если нет, просто отрегулируйте переменный резистор. Повторите процесс ещё раз, чтобы убедиться, что светодиод работает должным образом.
Теперь, когда мы откалибровали робота, все, что нам нужно сделать, это разместить робота на черной линии и посмотреть, как он работает. GIF-анимация ниже демонстрирует работу нашего робота, следующего по линии. Как видите, робот может следовать по линии без каких-либо проблем.

Устранение неполадок робота
Даже при тщательной сборке и программировании вы можете столкнуться с некоторыми распространенными проблемами в работе вашего робота-следопыта. Давайте рассмотрим эти проблемы и их решения, чтобы помочь вам добиться безупречной работы вашего робота.
Если ваш робот некорректно следует по линии, сначала проверьте калибровку ИК-датчика. Разместите датчики на белой поверхности и отрегулируйте потенциометр на модуле ИК-датчика до тех пор, пока светодиод не погаснет. Затем проверьте его на черной линии — светодиод должен ярко загореться. Оптимальная калибровка имеет решающее значение для надежного обнаружения линии.
Если ваш робот движется, но, кажется, игнорирует линию, проверьте высоту расположения датчиков. Если они находятся слишком далеко от земли (более 1 см), они не будут надежно обнаруживать линию. Аналогично, если они находятся слишком близко (менее 2 мм), они могут давать ложные показания. Идеальная высота составляет около 5 мм от поверхности.
Напряжение батареи существенно влияет на поведение робота. По мере разрядки батарей скорость вращения двигателя и чувствительность датчиков могут изменяться. Для обеспечения стабильной работы рекомендуется использовать монитор напряжения или стабилизированный источник питания. Для оптимальной работы новые батареи должны иметь напряжение от 7,4 В до 9 В.
На следующем рисунке показана сводная таблица по устранению неполадок нашего робота.
Дальнейшие модификации и обновления
После того, как ваш базовый робот-следопыт заработает, вы можете внедрить несколько интересных улучшений, чтобы расширить его возможности:
» Реализация ПИД-регулирования: добавьте в свой код ПИД-регулирование (пропорционально-интегрально-дифференциальное) для более плавного следования по линии. Этот усовершенствованный метод управления помогает вашему роботу выполнять более точные корректировки и лучше справляться с кривыми. Он заменяет простое управление «вкл/выкл» пропорциональными реакциями на положение линии.
» Система управления скоростью: добавьте потенциометр или переключатели для регулировки скорости двигателя постоянного тока с помощью Arduino. Это особенно полезно при тестировании робота на разных трассах. Вы можете реализовать несколько режимов скорости для прямых участков и поворотов.
» Интеграция ЖК-дисплея: добавьте 16x2 ЖК-дисплей к Arduino для отображения показаний датчиков, скорости вращения двигателей и напряжения батареи в режиме реального времени. Это помогает в отладке и делает вашего робота более интерактивным. Вы можете отображать различные параметры и даже создать систему меню для настройки параметров.
» Дополнительные датчики: рассмотрите возможность добавления третьего ИК-датчика посередине или ультразвуковых датчиков для обнаружения препятствий. Большее количество датчиков обеспечивает роботу лучшую осведомленность и позволяет выполнять более сложные действия, такие как избегание препятствий при следовании по линии.
Полный процесс создания робота, следующего по линии, также можно увидеть в видеоролике, ссылка на который находится внизу этой статьи.
Техническое описание и репозиторий GitHub
Технические описания, представленные в этом разделе, призваны пролить свет на аппаратные элементы, схемы и алгоритмы программирования, помогая разработчикам понять принцип работы всей системы. Кроме того, исходные коды, библиотеки и документацию можно загрузить по ссылке на GitHub, что упрощает настройку и адаптацию системы.
Часто задаваемые вопросы (FAQ) о роботах, следующих по линии
⇥ Что такое робот, следующий по линии, и как он работает?
Робот, следующий по линии, — это автономный робот, предназначенный для следования по видимой линии, нарисованной на земле. Он использует инфракрасные (ИК) датчики для обнаружения линии и следования по ней. Когда ИК-свет попадает на белую поверхность, он отражается от датчика, а когда попадает на черную линию, поглощает свет. Робот использует эту информацию для регулировки своих двигателей и следования по линии.
⇥ Какие компоненты мне нужны для создания простого робота, следующего по линии?
Минимальный набор компонентов для создания такого робота включает в себя плату разработки, например, Arduino UNO (или аналогичную), два ИК-датчика, драйвер двигателя L293D, два редукторных двигателя постоянного тока (60-100 об/мин), колеса, шасси, батарею (7,4 В или 9 В) и соединительные провода. Общая стоимость обычно составляет около 25-30 долларов, что делает этот проект доступным для начинающих.
⇥ Какой ИК-датчик лучше всего подходит для робота, следующего по линии?
Модуль ИК-датчика TCRT5000 настоятельно рекомендуется для роботов, следующих по линии, благодаря хорошему диапазону обнаружения (2-30 см), встроенному потенциометру для регулировки чувствительности и стабильной работе. Он также широко доступен и совместим с рабочим напряжением 5 В Arduino. Но в этом руководстве мы использовали универсальный модуль ИК-датчика, поскольку он более экономичен.
⇥ Зачем нужен драйвер двигателя в роботе, следующем по линии?
Драйвер двигателя необходим, потому что выходные контакты Arduino не могут обеспечить достаточный ток для непосредственного управления двигателями постоянного тока. Драйвер двигателя L293D выступает в качестве посредника, обеспечивая необходимое управление током и напряжением для двигателей, одновременно защищая Arduino от потенциальных повреждений.
⇥ Как улучшить производительность моего робота, следующего по линии?
Улучшить работу робота, следующего по линии, можно, внедрив ПИД-регулирование для более плавного движения, добавив больше датчиков для лучшего обнаружения линии, оптимизировав высоту датчиков (в идеале 5-10 мм от земли) и обеспечив надлежащее напряжение батареи.
⇥ Какие распространенные проблемы возникают у роботов, следующих по линии, и как их решить?
К распространенным проблемам относятся: непостоянное следование по линии (решение: корректировка калибровки датчиков), рывки (решение: настройка скорости двигателя или внедрение ПИД-регулирования), потеря линии на крутых поворотах (решение: оптимизация расположения датчиков или добавление дополнительных датчиков) и непредсказуемое поведение (решение: проверка напряжения батареи и соединений). Но если вы сталкиваетесь с другими проблемами, вы можете описать их в комментариях ниже, и мы вам поможем.
⇥ Может ли робот, следующий по линии, обнаруживать линии разных цветов?
Хотя базовые ИК-датчики лучше всего работают с черными линиями на белых поверхностях, вы можете модифицировать своего робота для обнаружения линий разных цветов, используя цветные датчики (TCS230) вместо ИК-датчиков. Однако это увеличивает сложность и стоимость, и не рекомендуется.
⇥ Какие навыки программирования необходимы для создания робота, следующего по линии?
Достаточно базовых знаний программирования Arduino (C++). Вам следует понимать принципы работы цифрового ввода-вывода, переменных, условных операторов if-else и основных функций. Наш учебник содержит полностью прокомментированный код, который легко понять и модифицировать. Кроме того, если вы хотите изучить программирование или робототехнику, это может стать лучшим проектом для начала вашего пути.
Полный код проекта
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
// Arduino Line Follower Robot Code //More Information: https://circuitdigest.com/microcontroller-projects/arduino-uno-line-follower-robot #define enA 5//Enable1 L293 Pin enA #define in1 6 //Motor1 L293 Pin in1 #define in2 7 //Motor1 L293 Pin in1 #define in3 9 //Motor2 L293 Pin in1 #define in4 10 //Motor2 L293 Pin in1 #define enB 8 //Enable2 L293 Pin enB #define R_S 4//ir sensor Right #define L_S 2 //ir sensor Left void setup(){ pinMode(R_S, INPUT); pinMode(L_S, INPUT); pinMode(enA, OUTPUT); pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(in3, OUTPUT); pinMode(in4, OUTPUT); pinMode(enB, OUTPUT); digitalWrite(enA, HIGH); digitalWrite(enB, HIGH); delay(1000); } void loop(){ if((digitalRead(R_S) == 0)&&(digitalRead(L_S) == 0)){forward();} //if Right Sensor and Left Sensor are at White color then it will call forword function if((digitalRead(R_S) == 1)&&(digitalRead(L_S) == 0)){turnRight();} //if Right Sensor is Black and Left Sensor is White then it will call turn Right function if((digitalRead(R_S) == 0)&&(digitalRead(L_S) == 1)){turnLeft();} //if Right Sensor is White and Left Sensor is Black then it will call turn Left function if((digitalRead(R_S) == 1)&&(digitalRead(L_S) == 1)){Stop();} //if Right Sensor and Left Sensor are at Black color then it will call Stop function } void forward(){ //forword digitalWrite(in1, HIGH); //Right Motor forword Pin digitalWrite(in2, LOW); //Right Motor backword Pin digitalWrite(in3, LOW); //Left Motor backword Pin digitalWrite(in4, HIGH); //Left Motor forword Pin } void turnRight(){ //turnRight digitalWrite(in1, LOW); //Right Motor forword Pin digitalWrite(in2, HIGH); //Right Motor backword Pin digitalWrite(in3, LOW); //Left Motor backword Pin digitalWrite(in4, HIGH); //Left Motor forword Pin } void turnLeft(){ //turnLeft digitalWrite(in1, HIGH); //Right Motor forword Pin digitalWrite(in2, LOW); //Right Motor backword Pin digitalWrite(in3, HIGH); //Left Motor backword Pin digitalWrite(in4, LOW); //Left Motor forword Pin } void Stop(){ //stop digitalWrite(in1, LOW); //Right Motor forword Pin digitalWrite(in2, LOW); //Right Motor backword Pin digitalWrite(in3, LOW); //Left Motor backword Pin digitalWrite(in4, LOW); //Left Motor forword Pin } |







