Робот, следующий вдоль линии (белой или черной), является одним из самым популярных проектов робототехники для начинающих. В данной статье мы рассмотрим создание подобного робота на основе платы MSP430G2 launchpad от компании Texas Instruments. В нашем проекте он будет следовать вдоль черной линии. Если вы только начинаете свое знакомство с платой MSP430G2 рекомендуем прочитать статью про начало работы с ней.
Ранее на нашем сайте мы уже рассматривали создание подобного робота на основе других микроконтроллеров (плат):
Необходимые компоненты
- Плата MSP430G2 LaunchPad (купить на AliExpress).
- Модуль драйвера двигателя L298D.
- Инфракрасные датчики (купить на AliExpress).
- Шасси робота.
- Соединительные провода.
- Источники питания 3.3v и 5v-12v.
Внешний вид компонентов для сборки робота показан на следующем рисунке.
Принцип работы робота следующего вдоль линии
Принцип работы нашего робота, следующего вдоль линии, будет основан на различных принципах отражения света от темной и светлой поверхности. Когда свет падает на светлую поверхность он практически полностью отражается от нее, а когда он падает на темную поверхность – он практически полностью поглощается ей. Эти принципы взаимодействия света с темной и светлой поверхностями более наглядно показаны на следующем рисунке.
В нашем следующем вдоль линии роботом на основе платы MSP430G2 мы будем использовать инфракрасные передатчики и инфракрасные приемники, также известные как фотодиоды. Они будут использоваться для передачи и приема света. Инфракрасные передатчики будут передавать инфракрасные лучи. Когда эти лучи будут падать на светлую поверхность, они будут отражаться от нее и улавливаться фотодиодами, которые будут при этом формировать на своих выходах определенные уровни напряжения. Когда инфракрасные лучи будут падать на темную поверхность, они будут поглощаться ей и в этом случае они уже не будут улавливаться фотодиодами.
В нашем проекте при обнаружении инфракрасными датчиками светлой поверхности на микроконтроллер MSP430 будет подаваться логическая 1, а при обнаружении темной поверхности – логический 0.
Общие принципы работы проекта
Структурная схема работы нашего проекта робота, следующего вдоль линии, показана на следующем рисунке.
Рассмотрим назначение основных элементов данной структурной схемы.
Секция датчиков. Данная секция содержит инфракрасные диоды, потенциометр, компаратор на операционном усилителе и светодиоды. Потенциометр используется для установки опорного напряжения на компараторе – с ним происходит сравнение напряжения, поступающего с инфракрасного датчика.
Секция управления. Плата MSP430 Launchpad управляет всеми процессами в нашем роботе. Сигналы с выходов компараторов поступают на ее входы P1_3 и P1_4, она считывает их и дает соответствующие команды на управление роботом.
Секция двигателей. Содержит драйвер двигателей и два электродвигателя постоянного тока. Драйвер двигателей необходим в нашей схеме в связи с тем что контакты платы MSP430 Launchpad не могут обеспечить достаточный ток для управления двигателями. В качестве дайвера двигателей мы используем микросхему L298d.
Движения робота
Принцип работы робота, следующего вдоль линии, достаточно прост. Датчики робота обнаруживают (чувствуют) линию и передают соответствующие сигналы на MSP430. А плата MSP430 в соответствии с этими сигналами управляет двумя моторами, движущими робота.
Если ни один из датчиков не будет обнаруживать черную линию, то робот будет двигаться прямо. Эта ситуация показана на нижеприведенном рисунке.
Если левый датчик обнаруживает черную линию, то робот поворачивает влево.
Если правый датчик обнаруживает черную линию, то робот поворачивает вправо..
Если оба датчика обнаруживают черную линию, робот останавливается.
В нашем проекте мы использовали два инфракрасных датчика (сенсора), которые мы назовем левым датчиком и правым датчиком. Когда оба датчика видят перед собой белый цвет робот движется прямо.
Схема проекта
Схема следующего вдоль линии робота на основе платы MSP430G2 представлена на следующем рисунке.
Внешний вид собранной конструкции проекта показан на следующем рисунке.
Также вместо готовых модулей инфракрасных датчиков вы можете собрать их самостоятельно, используя, например, следующую схему:
Объяснение кода программы
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
В программе первым делом мы дадим осмысленные имена используемым контактам, с которых производится считывание сигналов с инфракрасных датчиков и управление двигателями.
Примечание: датчики могут быть активными в состоянии low или high, поэтому первым делом уточните тип выхода датчика, после этого закомментируйте/раскомментируйте соответствующий activeLowMode. Для активного состояния HIGH закомментируйте макрос activeLowMode.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#define l_sensor P1_3 #define r_sensor P1_4 int pins[4]={P1_5,P2_0,P2_1,P2_2}; #define forward 0x05 #define left 0x06 #define right 0x09 #define stop 0x00 //#define activeLowMode #ifdef activeLowMode int res[4]={forward,left,right,stop}; #else int res[4]={stop,right,left,forward}; #endif |
Далее, в функции setup, мы задаем режим (направление) работы для используемых контактов. А затем, в функции loop, мы проверяем выходы с инфракрасных датчиков и передаем соответствующие управляющие сигналы на вращение двигателей.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
void setup() { for(int i=0;i<4;i++) pinMode(pins[i], OUTPUT); pinMode(l_sensor, INPUT); pinMode(r_sensor, INPUT); } void loop() { int sense=(digitalRead(l_sensor)<<1) | digitalRead(r_sensor); for(int i=0;i<4;i++) digitalWrite(pins[i], (res[sense]>>i) & 0x01); } |
Логика управления двигателями нашего робота представлена в следующей таблице.
Исходный код программы
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 |
#define l_sensor P1_3 #define r_sensor P1_4 int pins[4]={P1_5,P2_0,P2_1,P2_2}; #define forward 0x05 #define left 0x06 #define right 0x09 #define stop 0x00 //#define activeLowMode #ifdef activeLowMode int res[4]={forward,left,right,stop}; #else int res[4]={stop,right,left,forward}; #endif void setup() { for(int i=0;i<4;i++) pinMode(pins[i], OUTPUT); pinMode(l_sensor, INPUT); pinMode(r_sensor, INPUT); } void loop() { int sense=(digitalRead(l_sensor)<<1) | digitalRead(r_sensor); for(int i=0;i<4;i++) digitalWrite(pins[i], (res[sense]>>i) & 0x01); } |