Рубрики
Схемы на Arduino

Движущийся вдоль линии робот на Arduino

Движущийся вдоль линии робот представляет собой механизм, который способен следовать вдоль черной или белой линии. Существуют две разновидности подобных роботов: одна предназначена для следования вдоль черной линии, а другая – вдоль белой. Фактически, робот как бы «чувствует» линию едет вдоль нее.

Также на нашем сайте можно прочитать статью о роботе, следующем вдоль линии, построенном на микроконтроллере AVR ATmega16.

Принцип работы робота движущегося вдоль линии

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

В нашем роботе на Arduino, следующем вдоль линии, мы будем использовать инфракрасные передатчики и приемники, которые также называются фотодиодами. Они будут использоваться для передачи и приема света. Допустим, инфракрасный передатчик передал (излучил) свет. Когда эти инфракрасные лучи падают на белую поверхность, они отражаются от нее и улавливаются фотодиодами, которые в результате этого формируют на своем выходе определенное напряжение. А когда инфракрасные лучи падают на черную поверхность, то они поглощаются ею и в результате фотодиоды не улавливают отраженный от поверхности свет (как в предыдущем случае).

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

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

Arduino

В нашем проекте мы использовали микроконтроллер для управления всем процессом движения робота, в данном случае его роль выполняет плата Arduino, которая является универсальной платформой для разработки приложений различного назначения. Мы применили плату Arduino pro mini (купить на AliExpress) поскольку она небольшая по размерам и легко интегрируется с макетной платой.

Драйвер мотора L293D

L293D представляет собой микросхему драйвера мотора (motor driver), имеющую в своем составе 2 канала для управления двумя двигателями. Микросхема L293D имеет две транзисторные пары Дарлингтона для усиления и раздельного управления мощностью двигателей, подключаемых к ее выходам.

Инфракрасный модуль

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

Также в схему добавлен регулятор напряжения на 5 В, а питание устройства осуществляется от батарейки 9 В.

Работа схемы

Схема устройства представлена на следующем рисунке.

Как вы можете видеть из представленной схемы выходы компараторов напрямую подсоединены к цифровым выводам Arduino 2 и 3. Входные контакты драйвера мотора 2, 7, 10 и 15 соединены с цифровыми контактами Arduino 4, 5, 6 и 7 соответственно. Один из двигателей подсоединен к выходным контактам драйвера мотора 3 и 6, а второй двигатель – к его контактам 11 и 14.

Всю конструкцию нашего робота, движущегося вдоль линии, можно условно разделить на 3 части: модуль датчиков, модуль управления и модуль движения.

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

Модуль управления построен на основе платы Arduino Pro Mini, которая будет контролировать весь процесс движения робота. Выходы компараторов подсоединены к цифровым контактам 2 и 3 платы Arduino. Плата Arduino считывает эти сигналы и посылает команды управления модулю движения.

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

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

Если ни один из датчиков не будет обнаруживать черную линию, то робот будет двигаться прямо. Эта ситуация показана на нижеприведенном рисунке.

Если левый датчик обнаруживает черную линию, то робот поворачивает влево.

Если правый датчик обнаруживает черную линию, то робот поворачивает вправо..

Если оба датчика обнаруживают черную линию, робот останавливается.

В нашем проекте мы использовали два инфракрасных датчика (сенсора), которые мы назовем левым датчиком и правым датчиком. Когда оба датчика видят перед собой белый цвет робот движется прямо.

Исходный код программы

В программе первым делом мы инициализируем входные и выходные контакты, а затем в цикле программы мы будем проверять сигналы на входных контактах и формировать соответствующие управляющие сигналы на выходных контактах, которые будут управлять вращением двигателей. Для проверки сигналов на входных контактах мы будем использовать операторы “if”.

В следующей таблице представлены 4 условия, согласно которым осуществляется управление нашим роботом.

Далее приведен полный текст программы с комментариями.

/*---инициализируем входные контакты------*/
#define LS 2 // левый датчик
#define RS 3 // правый датчик
/*--- инициализируем выходные контакты ---*/
#define LM1 4 // левый двигатель
#define LM2 5 // левый двигатель
#define RM1 6 // правый двигатель
#define RM2 7 // правый двигатель
void setup()
{
pinMode(LS, INPUT);
pinMode(RS, INPUT);
pinMode(LM1, OUTPUT);
pinMode(LM2, OUTPUT);
pinMode(RM1, OUTPUT);
pinMode(RM2, OUTPUT);
}
void loop()
{
if(digitalRead(LS) && digitalRead(RS)) // движение вперед
{
digitalWrite(LM1, HIGH);
digitalWrite(LM2, LOW);
digitalWrite(RM1, HIGH);
digitalWrite(RM2, LOW);
}

if(!(digitalRead(LS)) && digitalRead(RS)) // поворачиваем направо
{
digitalWrite(LM1, LOW);
digitalWrite(LM2, LOW);
digitalWrite(RM1, HIGH);
digitalWrite(RM2, LOW);
}

if(digitalRead(LS) && !(digitalRead(RS))) // поворачиваем налево
{
digitalWrite(LM1, HIGH);
digitalWrite(LM2, LOW);
digitalWrite(RM1, LOW);
digitalWrite(RM2, LOW);
}

if(!(digitalRead(LS)) && !(digitalRead(RS))) // остановка
{
digitalWrite(LM1, LOW);
digitalWrite(LM2, LOW);
digitalWrite(RM1, LOW);
digitalWrite(RM2, LOW);
}
}

Видео, демонстрирующее работу схемы

5 ответов к “Движущийся вдоль линии робот на Arduino”

Спасибо что оценили мой труд. Почему то статья с подобным роботом на микроконтроллере AVR давно на сайте лежит, а на нее ни одного отклика. А эту на Arduino только недавно разместил и она сразу вызвала интерес

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *