Arduino İle Labirent Çözen Robot Yapımı

16 3.356

Kendi robotunu yap projelerimizin bu bölümünde arduino ile labirent çözen robot yapacağız. Labirent çözen robot özellikle robot yarışmalarında yer almaktadır. Bir labirentin çözüm yolunu bulmak aslında tek bir etkene bağlıdır. Bu etken sağ veya sol taraftaki herhangi bir duvarı takip ettirmektir. Bu etkenden yola çıkarak robot sol veya sağ tarafından herhangi birisini referans alırsa, labirenttin çıkışını bulacaktır. Bu işlem sadece labirentin çözümünün temeli. Peki labirent yolunda ilerlerken yolun bittiğini ve hangi tarafa dönmesini nasıl anlayacak ? . İşte bu noktada iki sensör daha devreye girecek. Birinci sensör öne bakarak sürekli mesafeyi kontrol edecek ve yolun bitip bitmediği anlaşılacak. Diğer sensör ise diğer duvarı takip edecek. Kısacası sensörler sol ön ve sağ tarafları kontrol edecek. Sağ ve sol sensörler duvarın devamlılığını kontrol edecek. Örneğin sol tarafta boşluk var iken sağ tarafta duvar varsa ve ön taraf da boş ise robot ileri hareket edecektir. Robotun karşılaşacağı her durum için ayrı bir senaryo oluşturularak robotun hareketleri belirlenecek.

Malzemeler:

  • Arduino Uno
  • 3 Adet Hc-Sr04 Ultrasonik Sensör
  • L293D Motor Sürücü
  • Robot Kiti ( 2 DC Motor, Robot Şasesi , Sarhoş Tekerlek)
  • Batarya

Devre Şeması:

Devre şemasına bakarak bağlantıları yapalım. Motor sürücünün 8. pini motor volatjı 16. pini ise 5v lojik voltajdır. Aşağıdaki şekilden de pinlerine bakabilirsiniz.

Fritzing Dosyasını Buradan indirebilirsiniz>> labirent Devre Şeması

Sensörleri aşağıdaki şekildeki gibi konumlandırın.

 

Arduino Kodu:

#define sol_motor_hiz 11 // Sol motor hız pini
#define sag_motor_hiz 10 // Sağ motor hız pini
#define sol_motor_1 8 // Sol motor pin 1
#define sol_motor_2 9 // Sol motor pin 2
#define sag_motor_1 7 //Sağ motor pin 1
#define sag_motor_2 6 // Sağ motor pin 2
 
int sag_sensor_echo = A0;// sağ sensör
int sag_sensor_trigger = A1;// sağ sensör
int sol_sensor_echo = A2;// sol sensör
int sol_sensor_trigger = A3;// sol sensör
int on_sensor_echo = A4; // Ön sensör
int on_sensor_trigger = A5; // Ön sensör
 
void setup()
{
pinMode(on_sensor_trigger, OUTPUT);
pinMode(on_sensor_echo, INPUT);
pinMode(sol_sensor_trigger, OUTPUT);
pinMode(sol_sensor_echo, INPUT);
pinMode(sag_sensor_trigger, OUTPUT);
pinMode(sag_sensor_echo, INPUT);
pinMode(sol_motor_hiz, OUTPUT);
pinMode(sag_motor_hiz, OUTPUT);
pinMode(sol_motor_1, OUTPUT);
pinMode(sol_motor_2, OUTPUT);
pinMode(sag_motor_1, OUTPUT);
pinMode(sag_motor_2, OUTPUT);
delay(5000);
}
 
void loop()
{
long on_sensor_zaman, sol_sensor_zaman, sag_sensor_zaman, sag_mesafe, sol_mesafe, on_mesafe;
digitalWrite(on_sensor_trigger, LOW);
delayMicroseconds(2);
digitalWrite(on_sensor_trigger, HIGH);
delayMicroseconds(5);
digitalWrite(on_sensor_trigger, LOW);
on_sensor_zaman = pulseIn(on_sensor_echo, HIGH);
on_mesafe = on_sensor_zaman/29/2;
digitalWrite(sol_sensor_trigger, LOW);
delayMicroseconds(2);
digitalWrite(sol_sensor_trigger, HIGH);
delayMicroseconds(5);
digitalWrite(sol_sensor_trigger, LOW);
sol_sensor_zaman = pulseIn(sol_sensor_echo, HIGH);
sol_mesafe = sol_sensor_zaman/29/2;
digitalWrite(sag_sensor_trigger, LOW);
delayMicroseconds(2);
digitalWrite(sag_sensor_trigger, HIGH);
delayMicroseconds(5);
digitalWrite(sag_sensor_trigger, LOW);
sag_sensor_zaman = pulseIn(sag_sensor_echo, HIGH);
sag_mesafe = sag_sensor_zaman/29/2;
analogWrite(sol_motor_hiz, 0);
analogWrite(sag_motor_hiz, 0);
analogWrite(sol_motor_1, 0);
analogWrite(sol_motor_2, 0);
analogWrite(sag_motor_1, 0);
analogWrite(sag_motor_2, 0);
 
if(on_mesafe >8)
{
if(sag_mesafe >7 && sag_mesafe< 13)
{
analogWrite(sol_motor_hiz, 120);
analogWrite(sag_motor_hiz, 150);
analogWrite(sol_motor_1, 255);
analogWrite(sol_motor_2, 0);
analogWrite(sag_motor_1, 0);
analogWrite(sag_motor_2, 255);
}
if(sag_mesafe >=13)
{
analogWrite(sol_motor_hiz, 255);
analogWrite(sag_motor_hiz, 60);
analogWrite(sol_motor_1, 255);
analogWrite(sol_motor_2, 0);
analogWrite(sag_motor_1, 0);
analogWrite(sag_motor_2, 255);
}
if(sag_mesafe <=7)
{
analogWrite(sol_motor_hiz, 60);
analogWrite(sag_motor_hiz, 255);
analogWrite(sol_motor_1, 255);
analogWrite(sol_motor_2, 0);
analogWrite(sag_motor_1, 0);
analogWrite(sag_motor_2, 255);
}
}
if(sol_mesafe <=20 && sag_mesafe>20 && on_mesafe <=8) { sag();}
if(sol_mesafe >20 && sag_mesafe>20 && on_mesafe <=8) { sag(); }
if(sag_mesafe <=20 && sol_mesafe>20 && on_mesafe <=8) { sol(); }
if(sag_mesafe<=20 && sol_mesafe<=20 && on_mesafe<=8) { tam_donus(); }
}
 
void sol()
{
analogWrite(sol_motor_hiz, 120);
analogWrite(sag_motor_hiz, 120);
analogWrite(sol_motor_1, 0);
analogWrite(sol_motor_2, 255);
analogWrite(sag_motor_1, 0);
analogWrite(sag_motor_2, 255);
delay(700);
}
 
void sag()
{
analogWrite(sol_motor_hiz, 120);
analogWrite(sag_motor_hiz, 120);
analogWrite(sol_motor_1, 255);
analogWrite(sol_motor_2, 0);
analogWrite(sag_motor_1, 255);
analogWrite(sag_motor_2, 0);
delay(800);
}
 
void tam_donus()
{
analogWrite(sol_motor_hiz, 120);
analogWrite(sag_motor_hiz, 120);
analogWrite(sol_motor_1, 255);
analogWrite(sol_motor_2, 0);
analogWrite(sag_motor_1, 255);
analogWrite(sag_motor_2, 0);
delay(1200);
}

Kaynak : Let’s Make Robots

Bunları da beğenebilirsin

Cevap bırakın

E-posta hesabınız yayımlanmayacak.

16 Yorum

  1. Hıyar

    Böyle bir devre çok saçma Allah aşkına bu robot çıkmaza geldiginde ne yapacak?

  2. Soner

    Merhaba kolay gelsin labirent çözen robotu proje ödevi olarak yapmayı düşünüyorum labirent in genişliği nasıl olmalıdır ve son olarak herhangi bir labirent te robot çözenbilir mi ilginiz için teşekkür ederim

  3. Emin ERKMEN

    ÇALIŞMIYOR! Kaç kere denedim söktüm taktım ama çalışmıyor saçma sapan hareketler yapıyor.

  4. Alper Eraslan

    Merhaba.Projenizi yapmayı düşünüyoruz robot kiti için şu model uygun olur mu? urun.n11.com/diger/arduino-akilli-robot-araba-motor-sase-ve-tekerlek-kit-P153356514?cid=604001&gclid=CNuwytyxsNICFSEM0wodnggMxw&gclsrc=aw.ds ayrıca motor sürücüsünün bağlantı şemasını ve sensörlerin şemasının daha iyi görünen bir resmi mevcutsa elinizde yardımcı olabilir misiniz?

    1. Sezgin GÜL

      Bahsettiğiniz robot kiti kullanabilirsiniz. Detaylı resim ne yazık ki mevcut değil.

  5. Emin ERKMEN

    Hocam aynısını birebir uyguladım ama robot çok saçma hareket ediyor. Yardımcı olabilir misin?

    1. Sezgin GÜL

      Bağlantılarınız doğru ve sensörlerin konumları uygun ise enerji yetersizliğinden kaynaklanabilir

      1. Emin ERKMEN

        kodlarda sıkıntı yok yani?

        1. Sezgin GÜL

          Kodlarda sorun yok videodaki robotta kullanılan kodlardır. Motor yönlerini doğru taktınız mı. Yön komutlarında doğru yönde dönüyorlar mı bunları da kontrol ediniz. Şöyle bir durum da var . Eğer robotu beslediğiniz pilin enerjisi az ise kod kısmında motorların hareketi için verilen analog değeri arttırabilirsiniz.

          1. Emin ERKMEN

            Peki bu robot. En kısa yolu nasıl bulabilir. İkinci kez aynı labirentten geçtiği zaman en kısa yoldan gitmesi için ne yapmamız gerekiyor?

          2. Sezgin GÜL

            Çizgili olan labirenti çözen robotlarda o özellik mevcut. İlerleyen günlerde o tarz proje paylaşacağım.

          3. Emin ERKMEN

            Bu robotun üstüne ekleme yapabilir misiniz? 1 hafta içinde? Bu bizim için çok önemli.

          4. Emin ERKMEN

            ??

  6. Salih burak

    Hocam robot boyutları tam olarak nedir

    1. Sezgin GÜL

      Robot boyutunu labirentin genişliğine göre seçerseniz daha mantıklı olur. Normal deneme yapacaksanız kendinize göre boyut belirleyebilir veya hazır iki tekerlekli robot kitlerden kullanabilirsiniz

  7. pers

    Mesafe okuma işlemi fonksiyon ile yapisaydi daha güzel olurdu.loop un içerisinde surekli motorlari durdurmak ve calıştırnak çok mantıklı olmamış. Ayni sekilde yön kontrollerinin hepsi fonksiyonlarda olsaydi daha iyi olurdu. Iyi çalışmalar.