Робот на Ардуино, который передвигается по линии

Создадим робота на основе платы Ардуино Уно, который будет обнаруживать линию на полу и перемешаться по ней.

Это продолжение темы роботов, которые следуют линии или за хозяином. У нас уже было на сайте два урока:

Компоненты

Для создания робота, который будет следовать по линии на полу нам понадобятся следующие компоненты оборудования:

  1. Arduino UNO × 1
  2. Драйвер SparkFun Dual H-Bridge для двигателей L298 × 1
  3. Двигатель постоянного тока, 12 В × 1
  4. Держатель батареи, 18650 х 2 × 1

Ручные инструменты:

  • Паяльник (универсальный)
  • Дрель
  • Автоматический цифровой мультиметр
  • Мультитул, Отвертка
  • Плоскогубцы

Программное обеспечение

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

Схема соединения

Все компоненты мы подключаем согласно схеме ниже:

Скетч

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

int mr1=8;  //motor right 1
int mr2=9;  //motor right 2
int ml1=10; //motor left 1
int ml2=11; //motor left 2
int sr=6;   //sensor right
int sl=7;   //sensor left
int svr=0;
int svl=0;
int led=13;
int enr=3; 
int enl=5;

int vspeed=100;    
int tspeed=255;
int tdelay=20;

void setup()
{
 pinMode(mr1,OUTPUT);
 pinMode(mr2,OUTPUT);
 pinMode(ml1,OUTPUT);
 pinMode(ml2,OUTPUT);
 pinMode(led,OUTPUT);
 pinMode(sr,INPUT);
 pinMode(sl,INPUT);
 
 delay(5000);
}

void loop()
{
 svr=digitalRead(sr);
 svl=digitalRead(sl);
 
  if(svl==LOW && svr==LOW)
  {
  forward(); //maju
  }

  if(svl==HIGH && svr==LOW)
  {
  left(); //belok kiri
  }
 
  if(svl==LOW && svr==HIGH)
  { 
  right(); //belok kanan
  }
  
  if(svl==HIGH && svr==HIGH)
  {
  stop(); //berhenti
  }
}

void forward()
 {
  digitalWrite(mr1,HIGH);
  digitalWrite(mr2,LOW);
  digitalWrite(ml1,HIGH);
  digitalWrite(ml2,LOW);
  analogWrite (enr,vspeed);
  analogWrite (enl,vspeed);
 } 

void backward()
 {
  digitalWrite(mr1,LOW);
  digitalWrite(mr2,HIGH);
  digitalWrite(ml1,LOW);
  digitalWrite(ml2,HIGH);
  analogWrite (enr,vspeed);
  analogWrite (enl,vspeed);
 }

void right()
 {
  digitalWrite(mr1,LOW);
  digitalWrite(mr2,HIGH);
  digitalWrite(ml1,HIGH);
  digitalWrite(ml2,LOW);
  analogWrite (enr,tspeed);
  analogWrite (enl,tspeed);
  delay(tdelay);
 } 

void left()
 {
  digitalWrite(mr1,HIGH);
  digitalWrite(mr2,LOW);
  digitalWrite(ml1,LOW);
  digitalWrite(ml2,HIGH);
  analogWrite (enr,tspeed);
  analogWrite (enl,tspeed);
  delay(tdelay);
}  

void stop()
 {
  analogWrite (enr,0);
  analogWrite (enl,0);
 }

Также небольшой комментарий по поводу некоторых фрагментов кода. Вот этот блок:

int svr=0;
int svl=0;
int enr=3;
int enl=5;

int svr=0; - значение правого датчика.

int svl=0; - значение слева от датчика.

int enr=3; - включить правый двигатель (должен быть подключен к ШИМ-контактному разъему Arduino).

int enl=5; - включить левый двигатель (должен быть подключен к ШИМ-контактному разъему Arduino).

Также, в теории, можно было бы использовать некоторые ИК-датчики:

void loop() {
drive();
}

void drive(void){
bool sensor_right = digitalRead(SENSOR_R_D0);
bool sensor_left = digitalRead(SENSOR_L_D0);

if (!sensor_right && !sensor_left) goForward();
else if (sensor_right) goRight();
else goLeft();
}

На этом всё. Стоит сказать, что, скорее всего, с одним сенсором робот будет также вполне нормально работать.

16 июня 2020 в 15:38 | Обновлено 28 июля 2020 в 15:28 (редакция)
Опубликовано: | Оригинал
Уроки, ,

1 комментарий

  1. Виктор
    30 сентября 2020 в 15:12

    При компиляции выдаёт ошибку платы Arduino

    Ответить

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

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