Робот, следующий по линии slide

Движение робота по линии

Описание Движение робота по линии

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


 

Внешний вид датчика

датчик линии Arduino


Принцип работы датчиков


датчик линии Ардуино


 

Для определения белого или черного поля используется электронный компонент, состоящий из инфракрасного светодиода(ИК) и инфракрасного фотодиода. ИК светодиод излучает свет в инфракрасном диапазоне с длиной волны порядка 940 нанометра.  Такой диапазон света используется для защиты от помех, создаваемых осветительными лампами, солнечным светом.

Рассмотрим два варианта возможных событий.

 

  1. Датчик находится над белым полем.
 
Отраженный от белого поля свет попадает на фотодиод. Далее уже оцифрованный компаратором электрический сигнал поступает на вход контроллера.  Контроллер исходя из написанной программы воспринимает этот сигнал именно, как белое поле.
  1. Датчик находится над черным полем.

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



компаратор черной линии


Подключение датчиков

Устанавливаем датчики линии и подключаем их к блоку управления R-5. Контакты GND на датчиках соединяем проводками с контактами GND на блоке R-5( в разъеме J3 правый ряд контактов). Контакт VCC на датчиках соединяем с контактами +5V на блоке R-5 ( средний ряд контактов). Контакты OUT левого и правого датчиков подключаем к контактам разъема J3. К каким контактам подключим выходы датчиков, такие и надо будет нам указывать в нашей программе.
Помним, что контакты D2-D5 у нас заняты уже драйвером моторов.
Подключим датчики следующим образом.
Левый датчик – D6
Правый датчик – D7

робот, следующий по линии



движение робота по линии


Пишем код.
 
Перед написанием кода рассмотрим на рисунке ситуации, которые могут возникать при движении робота.
ШАГ1.  Датчики робота «видят» белое поле. Контроллер принимает решение включить оба мотора и двигаться прямо.
ШАГ2. Робот правым датчиком наезжает на черную линию.  Для выравнивания положения необходимо притормозить правое колесо.
ШАГ3. Робот наезжает левым датчиком на черную линию. Для выравнивания положения необходимо притормозить вращение левого колеса.

робот. следование по линии


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


#define LS 6      //  левый датчик
#define RS 7      // правый датчик
 
#define DIR_R   2
#define SPEED_R  3 
#define DIR_L  4     
#define SPEED_L  5

void setup()
{
  pinMode(LS, INPUT);
  pinMode(RS, INPUT);
  pinMode(DIR_R , OUTPUT);
  pinMode(SPEED_R , OUTPUT);
  pinMode(DIR_L , OUTPUT);
  pinMode(SPEED_L, OUTPUT);
}
void loop()
{
  if(digitalRead(LS==HIGH) && digitalRead(RS==HIGH))    
// Движение вперед
  {
    digitalWrite(DIR_R , HIGH);
    digitalWrite(SPEED_R ,HIGH);
    digitalWrite(DIR_L , HIGH);
    digitalWrite(SPEED_L ,HIGH);
  }
  
  if((digitalRead(LS==LOW)) && digitalRead(RS==HIGH))    
// Поворот направо
  {
   digitalWrite(DIR_R , HIGH);
    digitalWrite(SPEED_R ,LOW);
    digitalWrite(DIR_L , HIGH);
    digitalWrite(SPEED_L ,HIGH);


  }
  
  if(digitalRead(LS==HIGH) && (digitalRead(RS==LOW))    
// Поворот влево
  {
    digitalWrite(DIR_R , HIGH);
    digitalWrite(SPEED_R ,HIGH);
    digitalWrite(DIR_L , HIGH);
    digitalWrite(SPEED_L ,LOW);
 }
  
  if(digitalRead(LS==LOW) && (digitalRead(RS==LOW))    
// остановка
  { digitalWrite(DIR_R , HIGH);
    digitalWrite(SPEED_R ,HIGH);
    digitalWrite(DIR_L , HIGH);
    digitalWrite(SPEED_L ,HIGH);
 }
}





 

Другие проекты