Движение робота ардуино по черной линии

3 марта 2019 - Администратор

Сборка  робота ардуино для движения по черной линии 

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

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

Для движения мобильного робота ардуино по черной линии возьмем за основу подвижную платформу мобильного робота Ардуино, схема которого разобрана на уроке мобильный робот Arduino.
Световые датчики или датчики черной линии подсоединяются к плате ардуино следующим образом: порт датчика черной линии GND подсоединяется к  GND через макетной платы, порт датчика VCC подсоединяется к шине питания через макетную плату в 5V, А0 подсоединяется к аналоговым портам платы ардуино A0, A1.  Чтобы считать данные со светового датчика, используется команда 
analogRead (номер пина);
Эта команда считывает значение датчика с номером пина.
Подробнее о работе светового датчика описано на уроке Считывание и калибровка датчиков Arduino.

Алгоритм движения по черной линии мобильного робота Ардуино

Если робот ардуино заезжает левым датчиком на черную линию, то он поворачивается определенное количество времени налево.
Если робот ардуино  заезжает правым датчиком на черную линию, то он поворачивается определенное количество времени направо.
Если оба датчика белые, то тогда робот едет  определенное количество времени вперед.
Мы разбираем пример без остановки на перекрестке. Если оба датчика черные, то тогда робот едет на определенное количество времени вперед.
Чтобы понять, что датчик заехал на черную линию, нужно считать данные с датчика и сравнить его с откалиброванным значением. Если значение считанное с датчика черной линии больше откалиброванного значения, то мы заехали на черную линию, если меньше, то на белую (Это зависит от работы конкретного датчика черной линии).  Чтобы выполнялось одновремменоо два условия необходимо использовать оператор условия и логическую операции И && Подробонее об условиях и логических операциях в Си.
Разберем алгоритм движения по черной линии робота адрдуино
Left_1 = analogRead (LeftSensor_1); //Считываем данные с левого датчика
Right_1 = analogRead (RightSensor_1);//Считываем данные с правого датчика
Таким образом, при заезде мобильного робота Ардуино левым датчиком на черную линию:
Left_1 = analogRead (LeftSensor_1); //Считываем данные с левого датчика
Right_1 = analogRead (RightSensor_1);//Считываем данные с правого датчика

//Если левый датчик видит черныйа правый белый, то поворачиваем налево
if ((Left_1 > sl1) && (Right_1 < sp1))) {
    analogWrite(SPEED_1, pov);
 digitalWrite(DIR_1,LOW);
 analogWrite(SPEED_2,povt);
 digitalWrite(DIR_2, HIGH);
 delay(1);
}

При заезде мобильного робота Arduino на черную линию правым датчиком: 
Left_1 = analogRead (LeftSensor_1); //Считываем данные с левого датчика
Right_1 = analogRead (RightSensor_1);//Считываем данные с правого датчика

// Если правый датчик видит черный, а левый датчик белый, то поворачиваем направо
if ((Right_1 > sp1) && (Left_1 < sl1)) {
analogWrite(SPEED_1, povt);
 digitalWrite(DIR_1,HIGH);
 analogWrite(SPEED_2,pov);
 digitalWrite(DIR_2, LOW);
 delay(1);
}

Когда оба датчика мобильного робота Ардуино видят белую линию:
Left_1 = analogRead (LeftSensor_1); //Считываем данные с левого датчика
Right_1 = analogRead (RightSensor_1);//Считываем данные с правого датчика

//Если оба датчика белые, то едем вперед
if ((Left_1 < sl1) && (Right_1 < sp1)) {
  analogWrite(SPEED_1,v);
 digitalWrite(DIR_1,HIGH);
 analogWrite(SPEED_2,v);
 digitalWrite(DIR_2, HIGH);
 delay(1);
}

Когда оба датчика мобильного робота Adruino видят черную линию:
Left_1 = analogRead (LeftSensor_1); //Считываем данные с левого датчика
Right_1 = analogRead (RightSensor_1);//Считываем данные с правого датчика

//Если оба датчика черные, то едем вперед
if ((Left_1 > sl1) && (Right_1 > sp1)) {
  analogWrite(SPEED_1,v);
 digitalWrite(DIR_1,HIGH);
 analogWrite(SPEED_2,v);
 digitalWrite(DIR_2, HIGH);
 delay(1);
}

Мы создадим процедуру движения по черной линии мобильного робота ардуина назовём ее lin
Чтобы робот ехал по черной линии бесконечно мы должны вызывать процедуру в теле основной программы
void loop() {
lin();
}

Полный текст программы для движения робота arduino по черной линии

#define SPEED_1      6 // скорость первого мотора
#define DIR_1        7 // направление первого мотора
#define DIR_2        4 // направление второго мотора
#define SPEED_2      5 // скорость второго мотора

int Left_1; // прописываем левый датчик
int Right_1; // прописываем правый датчик

//  Подсоединение к пинам
#define RightSensor_1 A0
#define LeftSensor_1 A1

// Сюда записываем данные с калибровки датчиков
int sl1=193;// Средняя освещённость левого датчика
int sp1=206;// Средняя освещёность правого датчика

// Переменные для регулировки скорости робота
int povt=30;
int pov=60;
int v=70;

void setup() {
Serial.begin(9600); 
for(int i = 4; i < 8; i++) // определяем порты для моторов   
 pinMode(i, OUTPUT);
  pinMode(A0, INPUT);// настраиваем порты для датчиков черной линии
  pinMode(A1, INPUT);
  delay(1000);
}
void lin() { 
Left_1 = analogRead (LeftSensor_1);
Right_1 = analogRead (RightSensor_1);
//Если левый датчик видит черный, то поворачиваем налево
if ((Left_1 > sl1) && (Right_1 < sp1)) {
    analogWrite(SPEED_1, pov);
 digitalWrite(DIR_1,LOW);
 analogWrite(SPEED_2,povt);
 digitalWrite(DIR_2, HIGH);
 delay(1);
}
Left_1 = analogRead (LeftSensor_1);
Right_1 = analogRead (RightSensor_1);
// Если правый датчик видит черный, по поворачиваем направо
if ((Right_1 > sp1) && (Left_1 < sl1)) {
analogWrite(SPEED_1, povt);
 digitalWrite(DIR_1,HIGH);
 analogWrite(SPEED_2,pov);
 digitalWrite(DIR_2, LOW);
 delay(1);
}
Left_1 = analogRead (LeftSensor_1);
Right_1 = analogRead (RightSensor_1);
//Если оба датчика черные, то едем вперед
if ((Left_1 > sl1) && (Right_1 > sp1)) {
  analogWrite(SPEED_1,v);
 digitalWrite(DIR_1,HIGH);
 analogWrite(SPEED_2,v);
 digitalWrite(DIR_2, HIGH);
 delay(1);
}
Left_1 = analogRead (LeftSensor_1);
Right_1 = analogRead (RightSensor_1);
//Если оба датчика белые, то едем вперед
if ((Left_1 < sl1) && (Right_1 < sp1)) {
  analogWrite(SPEED_1,v);
 digitalWrite(DIR_1,HIGH);
 analogWrite(SPEED_2,v);
 digitalWrite(DIR_2, HIGH);
 delay(1);
}
}

void loop() {
lin();
}

Вернуться к содержанию

Комментарии (2)
Владимир Иванов # 6 марта 2019 в 15:27 0
что этот if делает?
if ((Left_1 < sl1) && (Right_1 < sp1)) {
analogWrite(SPEED_1,v);
digitalWrite(DIR_1,HIGH);
analogWrite(SPEED_2,v);
digitalWrite(DIR_2, HIGH);
delay(1);
}
Администратор # 7 марта 2019 в 07:26 0
Если оба датчика видят белое поле, то едем вперед if ((Left_1 < sl1) && (Right_1 < sp1))