Merhaba arkadaşlar. Bu yazımızda “Çizgi İzleyen Robot nedir, nasıl yapılır?” konularından bahsedeceğiz.

Çizgi izleyen robotu yap, sonra engelden kaçanı da yapmanı tavsiye ederiz 🙂 >>>>Engelden Kaçan Robotu Da Yap!

Çizgi İzleyen Robot Nedir?

Çizgi izleyen robot, gideceği yolu otonom olarak takip eden robot tipidir. Takip edeceği yol, siyah düzlemin üstünde beyaz çizgi veya beyaz düzlemin üstünde siyah çizgi olacak şekilde hazırlanabilir. Robot bu takip etme işlemini sensörleri vasıtasıyla renk farkını algılayarak yapmaktadır.

Yarışmalar için hazırlanmış bir çizgi izleyen robotun yol takibinin iyi olması dışında yolu kısa sürede tamamlayabilmesi için hızlı olması gerekir. Hızlı bir robotun anlık yol takibi yapabilmesi için dengesinin de iyi olması gerekir. Bu yüzden kullandığınız gövde, sensör ve motor seçimi de önemlidir.

Endüstriyel sektörde de çizgi izleyen robot mantığında robotlar bulunmakta fakat biz bu yazımızda hobi amaçlı çizgi izleyen robotları inceleyeceğiz.

Arduino ile Çizgi İzleyen Robot Nasıl Yapılır?

Robotumuz, 3 adet kızılötesi sensör ile hangi yöne gitmesi gerektiğini belirleyecek. Robotumuzun hızını ve yönünü bir motor sürücü ile kontrol edeceğiz.

Gerekli Malzemeler

Çizgi İzleyen Robot Devresi

 

 

çizgi izleyen robot devresi

Her şey tamamsa robotumuzun montajına başlayabiliriz.

Öncelikle Arduinomuzu, sürücümüzü, sensörlerimizi ve pilimizi robot platformunda nereye yerleştireceğimize karar vermeliyiz. Sonrasında ise platformu kılavuzdaki adımları takip ederek monte ediyoruz. Devre bağlantılarını da gerçekleştirdikten sonra robotumuz programlanmaya hazır hale geliyor.

Gövde Montajı

Çizgi İzleyen Robot Montajı

Sensörleri 90 derece açı ile aşağıya bükmemiz gerekiyor ki yüzeydeki rengi sağlıklı bir şekilde görebilsin.

Arduino Programı

Arduino programını yazmadan önce çizgi izleyen sensörün çalışma mantığından bahsetmek istiyorum. Kullanacağımız sensörler dijital çıkış verdiklerinden dolayı siyah ve beyaz gördüklerinde çıkış sinyalleri 0 veya 1 olacaktır. Sensör siyah gördüğünde hangi değeri verdiğini bu yazılım ile test edebilirsiniz:

#define SensorSol 10
#define SensorOrta 11   // Sensör pinlerini tanımlıyoruz.
#define SensorSag 12

void setup() {

  pinMode(SensorSol, INPUT);
  pinMode(SensorOrta, INPUT); //Sensörlerimizi giriş olarak tanımlıyoruz.
  pinMode(SensorSag, INPUT);
  Serial.begin(9600);  //Seri haberleşmeyi başlatıyoruz.
  Serial.println("Cizgi Sensoru Testi");
  delay(2000);
}

void loop() {
  Serial.print(digitalRead(SensorSol));
  Serial.print(",");
  Serial.print(digitalRead(SensorOrta));
  Serial.print(",");
  Serial.println(digitalRead(SensorOrta));
  delay(100);
}

Sensörlerimizin siyah görüğünde “1” çıkış değerini aldığında oluşan mantık tablodaki gibidir.

Bu mantığa göre programlamaya başlıyoruz.

#define SensorSol 10
#define SensorOrta 11   // Sensör pinlerini tanımlıyoruz.
#define SensorSag 12

#define MotorR1 7
#define MotorR2 6
#define MotorRE 9  // Motor pinlerini tanımlıyoruz.
#define MotorL1 5
#define MotorL2 4
#define MotorLE 3


void setup() {

  pinMode(SensorSol, INPUT);
  pinMode(SensorOrta, INPUT); //Sensörlerimizi giriş olarak tanımlıyoruz.
  pinMode(SensorSag, INPUT);

  pinMode(MotorL1, OUTPUT);
  pinMode(MotorL2, OUTPUT);
  pinMode(MotorLE, OUTPUT); //Motorlarımızı çıkış olarak tanımlıyoruz.
  pinMode(MotorR1, OUTPUT);
  pinMode(MotorR2, OUTPUT);
  pinMode(MotorRE, OUTPUT);

}

void loop() {   // ROBOTUN HAREKET FONKSİYONLARINI "void loop" FONKSİYONUNUN ALTINDA GÖREBİLİRSİNİZ.

  if (digitalRead(SensorSol) == 0 && digitalRead(SensorOrta) == 0 && digitalRead(SensorSag) == 0 ) // Sensörler siyah görmüyor ise
  {
    left(); // Parabolik şekilde sola dön.
  }
  if (digitalRead(SensorSol) == 0 && digitalRead(SensorOrta) == 0 && digitalRead(SensorSag) == 1 ) // Sağ sensör siyah görüyor ise
  {
    turn_right(); //Sağa dön.
  }
  if (digitalRead(SensorSol) == 0 && digitalRead(SensorOrta) == 1 && digitalRead(SensorSag) == 0 ) // Orta sensör siyah görüyor ise
  {
    go_forward(); // Düz git.
  }
  if (digitalRead(SensorSol) == 0 && digitalRead(SensorOrta) == 1 && digitalRead(SensorSag) == 1 ) // Sağ ve orta sensör siyah görüyor ise
  {
    go_forward(); // Düz git.
  }
  if (digitalRead(SensorSol) == 1 && digitalRead(SensorOrta) == 0 && digitalRead(SensorSag) == 0 ) // Sol sensör siyah görüyor ise
  {
    turn_left(); // Sola dön.
  }
  if (digitalRead(SensorSol) == 1 && digitalRead(SensorOrta) == 0 && digitalRead(SensorSag) == 1 ) //İmkansız durum.
  {
    dur();
  }
  if (digitalRead(SensorSol) == 1 && digitalRead(SensorOrta) == 1 && digitalRead(SensorSag) == 0 ) // Sol ve orta sensör siyah görüyor ise
  {
    go_forward(); // Düz git.
  }
  if (digitalRead(SensorSol) == 1 && digitalRead(SensorOrta) == 1 && digitalRead(SensorSag) == 1 ) //Finish
  {
    dur();
  }
}

void motor_left(String dir, int spd) // sol motor kontrolü
{ // yön(dir) ve hız(spd) için değişkenler.
  if ( dir == "FORWARD")             // FORWARD komutu ileri hareket için.
  {
    digitalWrite(MotorL1, LOW);
    digitalWrite(MotorL2, HIGH);
    analogWrite(MotorLE, spd);
  }

  if ( dir == "BACKWARD")           //BACKWARD komutu geriye hareket için.
  {
    digitalWrite(MotorL1, HIGH);
    digitalWrite(MotorL2, LOW);
    analogWrite(MotorLE, spd);
  }

  if ( dir == "STOP")             // STOP komutu motorun durması için.
  {
    digitalWrite(MotorL1, LOW);
    digitalWrite(MotorL2, LOW);
    digitalWrite(MotorLE, LOW);
  }
}

void motor_right(String dir, int spd)// sağ motor kontrolü
{ // yön(dir) ve hız(spd) için değişkenler.
  if ( dir == "FORWARD")             // FORWARD komutu ileri hareket için.
  {
    digitalWrite(MotorR1, HIGH);
    digitalWrite(MotorR2, LOW);
    analogWrite(MotorRE, spd);
  }

  if ( dir == "BACKWARD")           //BACKWARD komutu geriye hareket için.
  {
    digitalWrite(MotorR1, LOW);
    digitalWrite(MotorR2, HIGH);
    analogWrite(MotorRE, spd);
  }

  if ( dir == "STOP")             // STOP komutu motorun durması için.
  {
    digitalWrite(MotorR1, LOW);
    digitalWrite(MotorR2, LOW);
    digitalWrite(MotorRE, LOW);
  }
}

void go_forward() // Robot ileri gitsin.
{
  motor_right("FORWARD", 100); // Sağ ve sol motorlar ileri yönde 200 hızında
  motor_left("FORWARD", 100);
}

void go_backward() // Robot geri gitsin.
{
  motor_right("BACKWARD", 100); // Sağ ve sol motorlar geri yönde 200 hızında
  motor_left("BACKWARD", 100);
}

void turn_right() // Robot sağa dönsün.
{
  motor_right("BACKWARD", 100); //Sağ motor 200 hızında geri
  motor_left("FORWARD", 100); //Sol motor 200 hızında ileri
}

void turn_left() // Robot sola dönsün.
{
  motor_right("FORWARD", 100); //Sağ motor 200 hızında ileri
  motor_left("BACKWARD", 100); //Sol motor 200 hızında geri
}

void left() // Robot virajlı şekilde sola dönsün.
{
  motor_right("FORWARD", 150); //Sağ motor 200 hızında ileri
  motor_left("FORWARD", 100); //Sol motor 200 hızında ileri
}

void dur()
{
  motor_right("STOP", 0); //Sağ motor 200 hızında ileri
  motor_left("STOP", 0); //Sol motor 200 hızında ileri
}


Bu yazımızda bir çizgi izleyen robotun temel bileşenlerinden ve çalışma mantığından bahsederek basit bir uygulama yaptık. Yaptığımız robot öğretici amaçlı olup herhangi bir yarışma amacı taşımamaktadır. İsterseniz farklı gövde ve devre elemanları kullanarak da robotunuzun görünüşünü ve performansını değiştirebilirsiniz. Başka bir projede görüşmek dileğiyle, takipte kalın 🙂

CEVAP VER