Çizgi Labirenti Çözerek Kısa Yoldan Çıkışı Bulan Robot

Herkese selam arkadaşlar.

Bu sefer Robotun Aklını okuyup size aktarmaya çalıştım. Labirent robotumuz labirenti nasıl çözdüğü sadeleştirmeyi nasıl yaparak çıkışın en kısa yolunu hesapladığını anlatmaya çalıştım. Videomu izleyerek “hmm demek böyle yapıyormuş bende bir şey sanmıştım .” diyeceksiniz. Aslında hayatta her şey öğrenene kadar zor öğrenince ise acayip kolaydır. Birde bugün bir videoda ki sözü paylaşmak istedim.

“Üşenme

Ertleme

Vazgeçme”

Bunları yaparsak yapamayacağımız şey yoktur.

 

  • Arduino uno

  • QTR  çizgi sensörü 6lı yeterli

  • L293d motor sürücü

  • led

  • 330 ohm

  • motor

  • gövde

 

 

#define sol_orta 3
#define sol_yakin 4
#define sol_uzak 5
#define sag_orta 2
#define sag_yakin 1
#define sag_uzak 0

int oku_sol_orta;
int oku_sol_yakin;
int oku_sol_uzak;
int oku_sag_orta;
int oku_sag_yakin;
int oku_sag_uzak;

int sol_durtmek;
int tekrarlama;
int sagl_durtmek;

#define sicrama_zamani 100

#define leftMotor1 10
#define leftMotor2  7

#define rightMotor1 13
#define rightMotor2 12


#define sag_led 9
#define sol_led 8

#define SolMotorHiz   11
#define SagMotorHiz 5

#define vcc_m 6
int ref = 300;

char yol[30] = {};
int yol_uzunlugu;
int uzunluk_okumak;

void setup() {
  Serial.begin(9600);
  pinMode(vcc_m , OUTPUT);
  pinMode(SolMotorHiz, OUTPUT);
  pinMode(SagMotorHiz, OUTPUT);
  pinMode(sol_orta, INPUT);
  pinMode(sol_yakin, INPUT);
  pinMode(sol_uzak, INPUT);
  pinMode(sag_orta, INPUT);
  pinMode(sag_yakin, INPUT);
  pinMode(sag_uzak, INPUT);

  pinMode(sag_led, OUTPUT);
  pinMode(sol_led, OUTPUT);

  pinMode(leftMotor1, OUTPUT);
  pinMode(leftMotor2, OUTPUT);
  pinMode(rightMotor1, OUTPUT);
  pinMode(rightMotor2, OUTPUT);



  digitalWrite(vcc_m , HIGH);

  for (int a = 0; a < 5; a++)
  {
    digitalWrite(sag_led, HIGH);
    digitalWrite(sol_led, LOW);
    delay (100);
    digitalWrite(sol_led, HIGH);
    digitalWrite(sag_led, LOW);
    delay (100);
  }

  digitalWrite(sag_led, LOW);
  digitalWrite(sol_led, LOW);

  analogWrite(SolMotorHiz, 255);
  analogWrite(SagMotorHiz, 255);


  delay(1000);
}

void loop() {

  sensor_oku();

  if (oku_sol_uzak < ref && oku_sag_uzak < ref && (oku_sol_orta > ref || oku_sag_orta > ref) )  //  0.-.2.2.-.0
  {
    duz();
  }
  else {   //  -.-.-.-.-.-
    digitalWrite(leftMotor1, LOW);
    digitalWrite(leftMotor2, LOW);
    digitalWrite(rightMotor1, LOW);
    digitalWrite(rightMotor2, LOW);

    digitalWrite(sag_led, HIGH);
    digitalWrite(sol_led, HIGH);
    delay(100);

    digitalWrite(sag_led, LOW);
    digitalWrite(sol_led, LOW);
    delay(100);
    sol_el_duvar();
  }
}

void sensor_oku() {

  oku_sol_orta = analogRead(sol_orta);
  oku_sol_yakin = analogRead(sol_yakin);
  oku_sol_uzak = analogRead(sol_uzak);
  oku_sag_orta = analogRead(sag_orta);
  oku_sag_yakin = analogRead(sag_yakin);
  oku_sag_uzak = analogRead(sag_uzak);

}


void sol_el_duvar() {

  //  if ( oku_sol_uzak > ref && oku_sag_uzak > ref) { //  1.-.-.-.-.1
  if (oku_sol_uzak > ref && oku_sol_orta > ref && oku_sag_orta > ref && oku_sag_uzak > ref && oku_sol_yakin > ref && oku_sag_yakin > ref) {//  1.1.1.1.1.1

    analogWrite(SolMotorHiz, 150);
    analogWrite(SagMotorHiz, 150);

    digitalWrite(leftMotor1, HIGH);
    digitalWrite(leftMotor2, LOW);
    digitalWrite(rightMotor1, HIGH);
    digitalWrite(rightMotor2, LOW);

    delay(sicrama_zamani);

    sensor_oku();

    if (oku_sol_uzak > ref && oku_sag_uzak > ref) { // || && yapıldı //  1.-.-.-.-.1

      tamam();
    }
    if (oku_sol_uzak < ref && oku_sag_uzak < ref) {  //  0.-.-.-.-.0
      sola_don();
    }

  }

  if (oku_sol_uzak > ref) { // SOLA DÖNEBİLİRSEN SOLA DÖN  1.-.-.-.-.-


    analogWrite(SolMotorHiz, 150);
    analogWrite(SagMotorHiz, 150);
    digitalWrite(leftMotor1, HIGH);
    digitalWrite(leftMotor2, LOW);
    digitalWrite(rightMotor1, HIGH);
    digitalWrite(rightMotor2, LOW);
    delay(sicrama_zamani);
    sensor_oku();

    if (oku_sol_uzak < ref && oku_sag_uzak < ref) {//  0.-.-.-.-.0
      sola_don();
    }


    else {
      tamam();
    }
  }

  if (oku_sag_uzak > ref) {  //  -.-.-.-.-.1


    analogWrite(SolMotorHiz, 150);
    analogWrite(SagMotorHiz, 150);
    digitalWrite(leftMotor1, HIGH);
    digitalWrite(leftMotor2, LOW);
    digitalWrite(rightMotor1, HIGH);
    digitalWrite(rightMotor2, LOW);

    delay(sicrama_zamani);

    sensor_oku();

    if (oku_sol_uzak > ref) { //  1.-.-.-.-.-
      delay(sicrama_zamani - 30);
      sensor_oku();

      if (oku_sag_uzak > ref && oku_sol_uzak > ref) {  //  1.-.-.-.-.1

        // if (oku_sol_uzak > ref && oku_sol_orta > ref && oku_sag_orta > ref && oku_sag_uzak > ref && oku_sol_yakin > ref && oku_sag_yakin > ref) {//  1.1.1.1.1.1
        tamam();
      }
      else {
        sola_don();
        return;
      }
    }
    delay(sicrama_zamani - 30);
    sensor_oku();
    if (oku_sol_uzak < ref && oku_sol_orta < ref && oku_sag_orta < ref && oku_sag_uzak < ref) {//  0.-.0.0.-.0

      saga_don();
      return;
    }
    yol[yol_uzunlugu] = 'S';
    yol_uzunlugu++;

    if (yol[yol_uzunlugu - 2] == 'B') {

      kisa_yol();
    }
    duz();
  }



  sensor_oku();
  if (oku_sol_uzak < ref && oku_sol_orta < ref && oku_sag_orta < ref && oku_sag_uzak < ref && oku_sol_yakin < ref && oku_sag_yakin < ref) {//  0.0.0.0.0.0
    arkani_don();
  }

}
void tamam() {
  digitalWrite(leftMotor1, LOW);
  digitalWrite(leftMotor2, LOW);
  digitalWrite(rightMotor1, LOW);
  digitalWrite(rightMotor2, LOW);

  tekrarlama = 1;
  yol[yol_uzunlugu] = 'D';
  yol_uzunlugu++;
  while (analogRead(sol_uzak) > ref) {

    digitalWrite(sag_led, HIGH);
    digitalWrite(sol_led, LOW);
    delay (100);
    digitalWrite(sag_led, LOW);
    digitalWrite(sol_led, HIGH);
    delay (100);
    Serial.print(oku_sol_orta);
    oku_sol_orta = analogRead(sol_orta);
    oku_sol_yakin = analogRead(sol_yakin);
    oku_sol_uzak = analogRead(sol_uzak);
    oku_sag_orta = analogRead(sag_orta);
    oku_sag_yakin = analogRead(sag_yakin);
    oku_sag_uzak = analogRead(sag_uzak);

    Serial.print(oku_sol_orta);
    Serial.print("   ");
    Serial.print(oku_sol_yakin);
    Serial.print("   ");
    Serial.print(oku_sol_uzak);
    Serial.print("   ");
    Serial.print(oku_sag_orta);
    Serial.print("   ");
    Serial.print(oku_sag_yakin);
    Serial.print("   ");
    Serial.println(oku_sag_uzak);



  }

  digitalWrite(sag_led, LOW);
  digitalWrite(sol_led, LOW);
  delay(2500);
  replay();
}

void sola_don() {

  analogWrite(SolMotorHiz, 190);
  analogWrite(SagMotorHiz, 190);
  while (analogRead(sag_orta) > ref || analogRead(sol_orta) > ref) {// -.-.1.1.-.-

    digitalWrite(leftMotor1, LOW);
    digitalWrite(leftMotor2, HIGH);
    digitalWrite(rightMotor1, HIGH);
    digitalWrite(rightMotor2, LOW);

    //    delay(2);
    //    digitalWrite(leftMotor1, LOW);
    //    digitalWrite(leftMotor2, LOW);
    //    digitalWrite(rightMotor1, LOW);
    //    digitalWrite(rightMotor2, LOW);
    //
    //    delay(1);
  }

  while (analogRead(sag_orta) < ref) {// -.-.-.0.-.-

    digitalWrite(leftMotor1, LOW);
    digitalWrite(leftMotor2, HIGH);
    digitalWrite(rightMotor1, HIGH);
    digitalWrite(rightMotor2, LOW);

    //    delay(2);
    //    digitalWrite(leftMotor1, LOW);
    //    digitalWrite(leftMotor2, LOW);
    //    digitalWrite(rightMotor1, LOW);
    //    digitalWrite(rightMotor2, LOW);
    //
    //    delay(1);
  }

  if (tekrarlama == 0) {
    yol[yol_uzunlugu] = 'L';
    yol_uzunlugu++;
    if (yol[yol_uzunlugu - 2] == 'B') {
      kisa_yol();
    }
  }
}

void saga_don() {

  analogWrite(SolMotorHiz, 190);
  analogWrite(SagMotorHiz, 190);
  while (analogRead(sag_orta) > ref) { // -.-.-.1.-.-
    digitalWrite(leftMotor1, HIGH);
    digitalWrite(leftMotor2, LOW);
    digitalWrite(rightMotor1, LOW);
    digitalWrite(rightMotor2, HIGH);

    //    delay(2);
    //    digitalWrite(leftMotor1, LOW);
    //    digitalWrite(leftMotor2, LOW);
    //    digitalWrite(rightMotor1, LOW);
    //    digitalWrite(rightMotor2, LOW);
    //
    //    delay(1);
  }
  while (analogRead(sag_orta) < ref) {
    digitalWrite(leftMotor1, HIGH);
    digitalWrite(leftMotor2, LOW);
    digitalWrite(rightMotor1, LOW);
    digitalWrite(rightMotor2, HIGH);

    //    delay(2);
    //    digitalWrite(leftMotor1, LOW);
    //    digitalWrite(leftMotor2, LOW);
    //    digitalWrite(rightMotor1, LOW);
    //    digitalWrite(rightMotor2, LOW);
    //
    //    delay(1);
  }
  while (analogRead(sol_orta) < ref) {
    digitalWrite(leftMotor1, HIGH);
    digitalWrite(leftMotor2, LOW);
    digitalWrite(rightMotor1, LOW);
    digitalWrite(rightMotor2, HIGH);

    //    delay(2);
    //    digitalWrite(leftMotor1, LOW);
    //    digitalWrite(leftMotor2, LOW);
    //    digitalWrite(rightMotor1, LOW);
    //    digitalWrite(rightMotor2, LOW);
    //
    //    delay(1);
  }

  if (tekrarlama == 0) {
    yol[yol_uzunlugu] = 'R';
    Serial.println("r");
    yol_uzunlugu++;
    Serial.print("yol length: ");
    Serial.println(yol_uzunlugu);
    if (yol[yol_uzunlugu - 2] == 'B') {
      Serial.println("kisa_ening yol");
      kisa_yol();
    }
  }

}
void duz() {
  if ( analogRead(sol_orta) < ref) {


    analogWrite(SolMotorHiz, 150);
    analogWrite(SagMotorHiz, 150);

    digitalWrite(leftMotor1, HIGH);
    digitalWrite(leftMotor2, LOW);
    digitalWrite(rightMotor1, LOW);
    digitalWrite(rightMotor2, HIGH);

    //    digitalWrite(leftMotor1, HIGH);
    //    digitalWrite(leftMotor2, LOW);
    //    digitalWrite(rightMotor1, HIGH);
    //    digitalWrite(rightMotor2, LOW);

    delay(1);
    //    digitalWrite(leftMotor1, HIGH);
    //    digitalWrite(leftMotor2, LOW);
    //    digitalWrite(rightMotor1, LOW);
    //    digitalWrite(rightMotor2, LOW);

    delay(3);


    return;
  }
  if (analogRead(sag_orta) < ref) {

    analogWrite(SolMotorHiz, 150);
    analogWrite(SagMotorHiz, 150);

    digitalWrite(leftMotor1, LOW);
    digitalWrite(leftMotor2, HIGH);
    digitalWrite(rightMotor1, HIGH);
    digitalWrite(rightMotor2, LOW);


    //    digitalWrite(leftMotor1, HIGH);
    //    digitalWrite(leftMotor2, LOW);
    //    digitalWrite(rightMotor1, HIGH);
    //    digitalWrite(rightMotor2, LOW);

    delay(1);
    //    digitalWrite(leftMotor1, LOW);
    //    digitalWrite(leftMotor2, LOW);
    //    digitalWrite(rightMotor1, HIGH);
    //    digitalWrite(rightMotor2, LOW);

    delay(3);

    return;
  }

  analogWrite(SolMotorHiz, 160);
  analogWrite(SagMotorHiz, 160);
  digitalWrite(leftMotor1, HIGH);
  digitalWrite(leftMotor2, LOW);
  digitalWrite(rightMotor1, HIGH);
  digitalWrite(rightMotor2, LOW);



}

void arkani_don() {

  analogWrite(SolMotorHiz, 150);
  analogWrite(SagMotorHiz, 150);
  digitalWrite(leftMotor1, HIGH);
  digitalWrite(leftMotor2, LOW);
  digitalWrite(rightMotor1, HIGH);
  digitalWrite(rightMotor2, LOW);

  delay(50);
  while (analogRead(sol_orta) < ref) {

    analogWrite(SolMotorHiz, 150);
    analogWrite(SagMotorHiz, 150);
    digitalWrite(leftMotor1, LOW);
    digitalWrite(leftMotor2, HIGH);
    digitalWrite(rightMotor1, HIGH);
    digitalWrite(rightMotor2, LOW);

    //    delay(2);
    //    digitalWrite(leftMotor1, LOW);
    //    digitalWrite(leftMotor2, LOW);
    //    digitalWrite(rightMotor1, LOW);
    //    digitalWrite(rightMotor2, LOW);
    //
    //    delay(1);
  }
  yol[yol_uzunlugu] = 'B';
  yol_uzunlugu++;
  duz();
  //Serial.println("b");
  //Serial.print("yol length: ");
  //Serial.println(yol_uzunlugu);
}

void kisa_yol() {
  int kisa_tamam = 0;
  if (yol[yol_uzunlugu - 3] == 'L' && yol[yol_uzunlugu - 1] == 'R') {
    yol_uzunlugu -= 3;
    yol[yol_uzunlugu] = 'B';
    //Serial.println("test1");
    kisa_tamam = 1;
  }

  if (yol[yol_uzunlugu - 3] == 'L' && yol[yol_uzunlugu - 1] == 'S' && kisa_tamam == 0) {
    yol_uzunlugu -= 3;
    yol[yol_uzunlugu] = 'R';
    //Serial.println("test2");
    kisa_tamam = 1;
  }

  if (yol[yol_uzunlugu - 3] == 'R' && yol[yol_uzunlugu - 1] == 'L' && kisa_tamam == 0) {
    yol_uzunlugu -= 3;
    yol[yol_uzunlugu] = 'B';
    //Serial.println("test3");
    kisa_tamam = 1;
  }


  if (yol[yol_uzunlugu - 3] == 'S' && yol[yol_uzunlugu - 1] == 'L' && kisa_tamam == 0) {
    yol_uzunlugu -= 3;
    yol[yol_uzunlugu] = 'R';
    //Serial.println("test4");
    kisa_tamam = 1;
  }

  if (yol[yol_uzunlugu - 3] == 'S' && yol[yol_uzunlugu - 1] == 'S' && kisa_tamam == 0) {
    yol_uzunlugu -= 3;
    yol[yol_uzunlugu] = 'B';
    //Serial.println("test5");
    kisa_tamam = 1;
  }
  if (yol[yol_uzunlugu - 3] == 'L' && yol[yol_uzunlugu - 1] == 'L' && kisa_tamam == 0) {
    yol_uzunlugu -= 3;
    yol[yol_uzunlugu] = 'S';
    //Serial.println("test6");
    kisa_tamam = 1;
  }

  yol[yol_uzunlugu + 1] = 'D';
  yol[yol_uzunlugu + 2] = 'D';
  yol_uzunlugu++;
  //Serial.print("yol length: ");
  //Serial.println(yol_uzunlugu);
  //printyol();
}

void printyol() {
  Serial.println("+++++++++++++++++");
  int x;
  while (x <= yol_uzunlugu) {
    Serial.println(yol[x]);
    x++;
  }
  Serial.println("+++++++++++++++++");
}

void replay() {

  sensor_oku();
  if (oku_sol_uzak < ref && oku_sag_uzak < ref) {
    duz();
  }
  else {
    if (yol[uzunluk_okumak] == 'D') {


      analogWrite(SolMotorHiz, 150);
      analogWrite(SagMotorHiz, 150);
      digitalWrite(leftMotor1, HIGH);
      digitalWrite(leftMotor2, LOW);
      digitalWrite(rightMotor1, HIGH);
      digitalWrite(rightMotor2, LOW);

      delay(50);
      digitalWrite(leftMotor1, LOW);
      digitalWrite(leftMotor2, LOW);
      digitalWrite(rightMotor1, LOW);
      digitalWrite(rightMotor2, LOW);

      //  tamam();// sürekli döngü devam eder
      son_hareket();
    }
    if (yol[uzunluk_okumak] == 'L') {


      analogWrite(SolMotorHiz, 150);
      analogWrite(SagMotorHiz, 150);
      digitalWrite(leftMotor1, HIGH);
      digitalWrite(leftMotor2, LOW);
      digitalWrite(rightMotor1, HIGH);
      digitalWrite(rightMotor2, LOW);

      delay(sicrama_zamani);

      sola_don();
    }
    if (yol[uzunluk_okumak] == 'R') {
      analogWrite(SolMotorHiz, 150);
      analogWrite(SagMotorHiz, 150);
      digitalWrite(leftMotor1, HIGH);
      digitalWrite(leftMotor2, LOW);
      digitalWrite(rightMotor1, HIGH);
      digitalWrite(rightMotor2, LOW);

      delay(sicrama_zamani);

      saga_don();
    }
    if (yol[uzunluk_okumak] == 'S') {

      analogWrite(SolMotorHiz, 150);
      analogWrite(SagMotorHiz, 150);
      digitalWrite(leftMotor1, HIGH);
      digitalWrite(leftMotor2, LOW);
      digitalWrite(rightMotor1, HIGH);
      digitalWrite(rightMotor2, LOW);

      delay(sicrama_zamani);
      duz();
    }

    uzunluk_okumak++;
  }

  replay();

}

void son_hareket() {
  Serial.print(oku_sol_orta);
  Serial.print("   ");
  Serial.print(oku_sol_yakin);
  Serial.print("   ");
  Serial.print(oku_sol_uzak);
  Serial.print("   ");
  Serial.print(oku_sag_orta);
  Serial.print("   ");
  Serial.print(oku_sag_yakin);
  Serial.print("   ");
  Serial.println(oku_sag_uzak);
  digitalWrite(sag_led, HIGH);
  digitalWrite(sol_led, HIGH);
  son_hareket();
}

Sosyal Medyada Paylaş Facebook Twitter Google+

Etiketler: , , ,
Eklenme Tarihi: 13 Ocak 2019

Konu hakkında yorumunuzu yazın

Çizgi Labirenti Çözerek Kısa Yoldan Çıkışı Bulan Robot (6 Yorum)

  1. Sayin hocam oncelikle anlatiminiz icin tesekkurler belkide ilk bu anlatim Turkiyede..merak ettigim bu yazilim her pistte calisir mi yoksa her pist icin yazilimda kisaltmalari kendimiz mi yazmaliyiz? Diyelim bir yarismadayiz ve pisti bilmiyoruz bu yazilim calisirmi?

  2. Çizgi izleyen labirent çözen robotu yaptım ancak denemelerimde şöyle bir sorun oluştu. Robot herhangi bir kavşağa geldiğinde yolun sonuna geldim sanıyor. Bazen de düz devam ediyor. Tutarsızlıklar neden kaynaklanıyor olabilir

      • Size nereden video sunu yollayabilirim. Öğretmenim bu arada. TÜBİTAK 4006 için bu projeyi yapmaya çalışıyoruz. Çizgiyi izleme konusunda sıkıntı yok ancak kavşağa geldiğinde yolun sonu sanıyor duruyor ve ışıklar yanıp sönmeye başlıyor. Sıçramayla alakalı olabilir mi

HOŞ GELDİNİZ

Youtube kanalıma Abone Olabilirsiniz.