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

  1. Микроконтроллер Arduino UNO.
  2. Драйвер двигателя L298N.
  3. Цифровой датчик линии AMP-B018 (2 шт).

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

Решение проблемы нашлось не сразу. Есть два возможных пути. Первый описан на официальном сайте. Мы же воспользовались вторым: на вход Reset подали 5 вольт. В этом случае при записи скетча на плату, необходимо размыкать цепь. В качестве источников питания используем две батарейки «Крона». Плата Arduino, драйвер двигателя и датчики линий питаются от одной, а двигатели от второй. Основой для машинки будет служить пластинка из оргстекла. Далее просверливаем в оргстекле необходимые отверстия и закрепляем на нём все составляющие.

image

image

Закрепляем макетную плату и собираем всю схему до конца следующим образом:

image

Как работать с драйвером двигателя L298N можно почитать вот тут.

Вот что получилось:

image

image

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

image

L( R) – соответствует единичному уровню сигнала с левого (правого) датчика.
~L (~R) – нулевому уровню.

Вот собственно код:

Код
int RightSensor = 4;
int LeftSensor = 11;
int ENB = 5;
int In4 = 6;
int In3 = 7;
int In2 = 8;
int In1 = 9;
int ENA = 10;

int prevState = 0;
int curState;

void turnOnRightEngine(int val, boolean Direction){
  if(Direction){
    digitalWrite(In2, LOW);  
    digitalWrite(In1, HIGH);
  } 
  else{
    digitalWrite(In2, HIGH);  
    digitalWrite(In1, LOW);     
  }
  analogWrite(ENA, val);
}

void turnOnLeftEngine(int val, boolean Direction){
  if(Direction){
    digitalWrite(In3, LOW);  
    digitalWrite(In4, HIGH);
  } 
  else{
    digitalWrite(In3, HIGH);  
    digitalWrite(In4, LOW);     
  }
  analogWrite(ENB, val);
}

void turnOffRightEngine(){
    digitalWrite(In2, LOW);  
    digitalWrite(In1, LOW);
    analogWrite(ENA,0);
}

void turnOffLeftEngine(){
    digitalWrite(In3, LOW);  
    digitalWrite(In4, LOW);
    analogWrite(ENB,0);
}

void setup() 
{ 
  pinMode(RightSensor, INPUT);
  pinMode(LeftSensor, INPUT);
  pinMode(ENA, OUTPUT);
  pinMode(ENB, OUTPUT);
  pinMode(In1, OUTPUT);
  pinMode(In2, OUTPUT);
  pinMode(In3, OUTPUT);
  pinMode(In4, OUTPUT);
}  

void changeState(int state){
   switch(state){
    case 0:
    {
      turnOffLeftEngine();
      turnOffRightEngine();
      break; 
    }
    case 1:
    {
      turnOffLeftEngine();
      turnOnRightEngine(150, true);
      break; 
    }
    case 2:
    {
      turnOffRightEngine();
      turnOnLeftEngine(150, true);
      break; 
    }
    case 3:
    {
      turnOnLeftEngine(150, true);
      turnOnRightEngine(150, true);
      break; 
    }
  }
}

void loop()
{
  int rs = digitalRead(RightSensor);
  int ls = digitalRead(LeftSensor);
  int state = prevState;
  
  switch(state){
    case 0:
    {
      if(ls == 1 && rs == 0)
        curState = 3;
      else
        curState = 0;
      break; 
    }
    case 1:
    {
      if(ls == 0 && rs == 0)
        curState = 1;
      else if(rs == 1)
        curState = 2;
      else if(ls == 1 && rs == 0)
        curState = 3;
      break; 
    }
    case 2:
    {
      if(ls == 0 && rs == 0)
        curState = 2;
      else if(rs == 1)
        curState = 2;
      else if(ls == 1 && rs == 0)
        curState = 3;
      break; 
    }
    case 3:
    {
      if(ls == 0 && rs == 0)
        curState = 1;
      else if(rs == 1)
        curState = 2;
      else if(ls == 1 && rs == 0)
        curState = 3;
      break; 
    }
  }
  changeState(curState);
  prevState = curState;
}



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

Итоги:
  1. Arduino действительно крутая штука для создания любительских устройств.
  2. Машинка получилась не самая лучшая, но с задачей справляется.

Над проектом работали:

Стукалов А. И
Рынкевич Е.С.

Комментарии (8)


  1. alexpp
    02.02.2016 15:45
    +3

    Простите, это какой курс? Работа получила какую-то оценку?
    Мое мнение, что соединение проводками двух плат, пары двигателей и батареек, и заливка готового скетча не тянет на курсовую от слова никак.


    1. Vurtatoo
      02.02.2016 15:57
      +1

      Если я не ошибся, то 4 курс. БГУИР — КСИС — ВМСИС., Парни поступили в 2012 году.
      Ужасно от того, что это так просто гуглится.


  1. IronHead
    02.02.2016 16:12
    +4

    <sаrcasm>
    Читайте в скором времени новые статьи в блоге БГУИР:
    — Мы собрали пазл из 5000 элементов, а чего в жизни добился ты?
    — Конструктор ЛЕГО, сборка лунной базы за 2 вечера только по картинке с коробки.
    И
    — Выбираю тему для докторской: ESP8266 или SIM900, что посоветуете.
    </sаrcasm>