Merhaba arkadaşlar. Bu yazımızda “Engelden Kaçan Robot nedir, nasıl yapılır?” konularından bahsedeceğiz.

Engelden kaçan robotu yap, sonra çizgi izleyeni de yapmanı tavsiye ederiz 🙂 >>>>Çizgi İzleyen Robot Yap!

Engelden Kaçan Robot Nedir?

Engelden kaçan robot,diğer adıyla engel algılayan robot, otonom olarak çevre kontrolü yapabilen ve hareketini önleyebilecek cisimleri atlatabilen robot tipidir. Çevre kontrolünü sağlayabilmesi için ultrasonik, kızılötesi vb. gibi çeşitli sensörlere ihtiyaç duyar.

Arduino ile Engelden Kaçan Robot Yapımı

Ultrasonik sensör ile karşılaştığımız engelleri algılayıp buna göre yön değiştiren bir robot yapacağız. Robotumuzun hızını ve yönünü bir motor sürücü ile kontrol edeceğiz.

Gerekli Malzemeler

Engelden Kaçan Robot Devresi

 

Fritzing Engelden Kaçan Robot Devresi

Ultrasonik Sensörün Çalışma Prensibi

Ultrasonik Sensör Çalışma Prensibi

Ultrasonik sensörün çalışma prensibinden bahsettiğimiz videomuza buradan göz atabilirsiniz.

Robotun Gövdesi

Robotumuzun gövde montajını daha önceden yaptığımız Çizgi İzleyen Robot uygulamasında bulabilirsiniz. Yaptığımız robotun gövdesi aynı olup sadece kullanılan sensörler değişmiştir.

Projemizin son hali şekilde gibidir.

Proje hakkında yorumlarınızı aşağıdaki ‘Yorumlar’ kısmında bizimle paylaşabilirsiniz.

Siz de yaptığınız projeleri Twitter ve Instagram üzerinden #Robotistan hashtagi ile bizimle paylaşın, projenizi hesabımızda paylaşalım !

Twitter ve Instagram Hesaplarımız: @Robotistan

 

Algoritma

Robotumuzu kodlamaya başlamadan önce hangi işlemleri takip edeceğimizi bilmemiz gerekiyor. Temel amacımız robotun bir engele takılmaması olacaktır. Örnek olarak geniş bir zeminde engelle karşılaştığında sağ yöne hamle yapan bir robotun temel algoritmasını göstermek istiyorum :

Engelden Kaçan Robot Algoritması

Bu algoritmayı Arduino’da yazalım 🙂

Arduino Kodları

#define echoPin 12 //Ultrasonik sensörün echo pini Arduino'nun 12.pinine
#define trigPin 13 //Ultrasonik sensörün trig pini Arduino'nun 13.pinine tanımlandı.
#define MotorR1 7
#define MotorR2 6
#define MotorRE 9  // Motor pinlerini tanımlıyoruz.
#define MotorL1 5
#define MotorL2 4
#define MotorLE 3



long sure, uzaklik; //süre ve uzaklık diye iki değişken tanımlıyoruz.

void setup() {


  // ultrasonik sensör Trig pininden ses dalgaları gönderdiği için OUTPUT (Çıkış),
  // bu dalgaları Echo pini ile geri aldığı için INPUT (Giriş) olarak tanımlanır.
  pinMode(echoPin, INPUT);
  pinMode(trigPin, OUTPUT);

  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);


  Serial.begin(9600);

}

void loop() {


  digitalWrite(trigPin, LOW); //sensör pasif hale getirildi
  delayMicroseconds(5);
  digitalWrite(trigPin, HIGH); //Sensore ses dalgasının üretmesi için emir verildi
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW); //Yeni dalgaların üretilmemesi için trig pini LOW konumuna getirildi

  sure = pulseIn(echoPin, HIGH); //ses dalgasının geri dönmesi için geçen sure ölçülüyor
  uzaklik = sure / 29.1 / 2; //ölçülen süre uzaklığa çevriliyor

  Serial.println(uzaklik);

  if (uzaklik < 15) // Uzaklık 15'den küçük ise,
  {
    geri();  // 150 ms geri git
    delay(150);
    sag();  // 250 ms sağa dön
    delay(250);
  }
  else {  // değil ise,
    ileri(); // ileri git
  }

}



void ileri(){  // Robotun ileri yönde hareketi için fonksiyon tanımlıyoruz.

  digitalWrite(MotorR1, HIGH); // Sağ motorun ileri hareketi aktif
  digitalWrite(MotorR2, LOW); // Sağ motorun geri hareketi pasif
  analogWrite(MotorRE, 150); // Sağ motorun hızı 150

  digitalWrite(MotorL1, HIGH); // Sol motorun ileri hareketi aktif
  digitalWrite(MotorL2, LOW); // Sol motorun geri hareketi pasif
  analogWrite(MotorLE, 150); // Sol motorun hızı 150
  
  
}


void sag(){ // Robotun sağa dönme hareketi için fonksiyon tanımlıyoruz.

  digitalWrite(MotorR1, HIGH); // Sağ motorun ileri hareketi aktif
  digitalWrite(MotorR2, LOW); // Sağ motorun geri hareketi pasif
  analogWrite(MotorRE, 0); // Sağ motorun hızı 0 (Motor duruyor)

  digitalWrite(MotorL1, HIGH); // Sol motorun ileri hareketi aktif
  digitalWrite(MotorL2, LOW); // Sol motorun geri hareketi pasif
  analogWrite(MotorLE, 150); // Sol motorun hızı 150
  
  
}


void geri(){ // Robotun geri yönde hareketi için fonksiyon tanımlıyoruz.

  digitalWrite(MotorR1, LOW); // Sağ motorun ileri hareketi pasif
  digitalWrite(MotorR2, HIGH); // Sağ motorun geri hareketi aktif
  analogWrite(MotorRE, 150); // Sağ motorun hızı 150

  digitalWrite(MotorL1, LOW); // Sol motorun ileri hareketi pasif
  digitalWrite(MotorL2, HIGH); // Sol motorun geri hareketi aktif
  analogWrite(MotorLE, 150); // Sol motorun hızı 150
  
}

Bir robot uygulamamızın daha sonuna geldik. Bir başka projede görüşmek üzere, takipte kalın 🙂

61 Yorumlar

  1. sitenizden satın aldığım arduino uyumlu nrf24l01 +pa ile arabya doğru şekilde bağlantı yaptım ama yazdığım kod ile test ettiğimde transmitterin çalışmadığını söylüyor bana yardımcı olrmusunuz …

    • NRF24L01 ile uzaktan kontrol uygulamamıza buradan göz atabilirsiniz. Yazdığınız kodun amacını bilmediğimden net bir yorum yapamıyorum fakat uygulamamıza göz attıktan sonra yazılımınızı kontrol edebilirsiniz.

  2. Merhabalar engelden kaçan robot yapımı için tüm parçaları sitenizden temin ettim ancak robotu çalıştırdığımda engelleri algılamıyor? Herşeyi doğru yaptığımı düşünüyorum yardımcı olabilir misiniz?

    • Merhaba. Arduino IDE’nin sağ üst kısmında bulunan “Seri Port Ekranı”nı kontrol ettiniz mi? Ultrasonik sensörü robottan söküp ayrı bir devrede test edebilir misiniz?

    • Stoklarla ilgili bilgi almak için destek@robotistan.com adresimizden bilgi alabilirsiniz. Stokta olmayan ürünlerde yandaki “Stoklara Düşünce Haber Ver” kısmına tıklayarak stok bilgilerini takip edebilirsiniz.
      4 motora sahip robot kullanmak istiyor ve aynı programdan faydalanmak istiyorsanız aynı taraftaki motorları paralel bağlamanız gerekir. Yani sağ ön motor ile sağ arka motor, sol ön motor ile sol arka motor paralel bağlanmalıdır.

    • Projemizdeki tüm malzemelerin bulunduğu bir kit mevcut değil. Bu işlemi yapabilecek tüm malzemelerin bulunduğu bir robot kiti arıyorsanız sitemizde bulabilirsiniz.

    • Motorların ikisi de çalışıyor ve iki motor da ileri-geri hareket edebiliyorlar ise sürücüde sorun yoktur. Robota sadece “ileri git” veya sadece “geri git” gibi komutlar verip hamlelerini test edebilirsiniz. Bu testi gibi “sağa dön” ve “sola dön” komutları vererek de yapabilirsiniz. Bu şekilde motordaki ileri ve geri yönleri anlaşılır. Eğer motorlar doğru yönde dönüyorlarsa ve robotu yere koyduğunuzda hafif yalpalayarak gidiyorsa motor ile tekerlekler tam oturmamış olabilir.

  3. 6 tane kalem pili belirtildigi sekilde bagladim. Hersey calisiyor ama motorlara tam guc gitmiyor. Sanki titriyor gibi bir hareket var. Ancak bu haldeyken arduino kartini kablosuyla seri porta bagladigimda hersey duzgun calisiyor. Sorun nerede anlamadim…

  4. Engelden kaçan bir robot yaptım hc-sr04 mesafe sensörünü servo motorun üzerine bağladım. Hareketten kaçıyor ama servo motora kod yazamadım yardımcı olabilir misiniz. Kodları yüklerken hata veriyor. Yüklediğim kodları yollayayım isterseniz.

    • Nerede sorun yaşadığınızı anlayamadım. Motorları ayrıca test ettiğinizde ileri-geri hareketlerini doğru yapıyorlar mı? Sensörünüz mesafe görüyor mu? İkisi de doğru çalışıyorsa programı tekrar kontrol edebilir misiniz?

  5. Tayfun bey abi ardinoda yeni basladim yazilima bu proje ile ilgili her malzeme mevcut elimde kafama tek takilan yazarken ardinoya yeni sayfami acmamiz gerkiyor

    • Arduino’da yeni boş sayfa açabilirsiniz veya içinde program olan sayfadaki kodları silip kendi kodunuzu yazabilirsiniz.

  6. Uluslararası İHL Sivas
    ADMİN BEY ,sayfanızdaki içerikler çok işime yaradı , kod doğru çalışıyor;
    Sayfanızın düzenini de çok takdir ettim , çizgi izleyen vb robotların kodları ve bağlanış şekli de varmış ,inşallah bu kodu ve bağlamayı bitirince
    diğerlerine geçeceğim…
    TEŞEKKÜRLER…

  7. Arkadaşlar selamlar, geçenlerde ultrasonik sensör ile mesafe ölçümü projesi yaptım. Çok eğlenceli gelmişti. Bu proje çok daha ilgi çekici olmuş. Emeği geçen arkadaşlara teşekkürler.

  8. Merhaba engelden kaçan robotunuzu yaptım kod sayfasıda aynı şekilde sizin yazdığınız kodlarda sadece geri doğru gidiyordu robot onu çözmeye çalışırken sensör çalışıyordu o sorunu çözdüm ileri gidiyor robotum ama bu sefer engelleri algılamıyor sadece ileri gidiyor. seneörle ilgili bir değişiklik yapmadım sorun ne olabilir sizce kod sayfasınıda kopyalıyorum
    #define echoPin 12 //Ultrasonik sensörün echo pini Arduino’nun 12.pinine
    #define trigPin 13 //Ultrasonik sensörün trig pini Arduino’nun 13.pinine tanımlandı.
    #define MotorR1 6
    #define MotorR2 7
    #define MotorRE 9 // Motor pinlerini tanımlıyoruz.
    #define MotorL1 5
    #define MotorL2 4
    #define MotorLE 3

    long sure, uzaklik; //süre ve uzaklık diye iki değişken tanımlıyoruz.

    void setup() {

    // ultrasonik sensör Trig pininden ses dalgaları gönderdiği için OUTPUT (Çıkış),
    // bu dalgaları Echo pini ile geri aldığı için INPUT (Giriş) olarak tanımlanır.
    pinMode(echoPin, INPUT);
    pinMode(trigPin, OUTPUT);

    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);

    Serial.begin(9600);

    }

    void loop() {

    digitalWrite(trigPin, LOW); //sensör pasif hale getirildi
    delayMicroseconds(5);
    digitalWrite(trigPin, HIGH); //Sensore ses dalgasının üretmesi için emir verildi
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW); //Yeni dalgaların üretilmemesi için trig pini LOW konumuna getirildi

    sure = pulseIn(echoPin, HIGH); //ses dalgasının geri dönmesi için geçen sure ölçülüyor
    uzaklik = sure / 29.1 / 2; //ölçülen süre uzaklığa çevriliyor

    Serial.println(uzaklik);

    if (uzaklik < 15) // Uzaklık 15'den küçük ise,
    {
    geri(); // 150 ms geri git
    delay(150);
    sag(); // 250 ms sağa dön
    delay(250);
    }
    else { // değil ise,
    ileri(); // ileri git
    }

    }

    void ileri(){ // Robotun ileri yönde hareketi için fonksiyon tanımlıyoruz.

    digitalWrite(MotorR1, LOW); // Sağ motorun ileri hareketi aktif
    digitalWrite(MotorR2, HIGH); // Sağ motorun geri hareketi pasif
    analogWrite(MotorRE, 200); // Sağ motorun hızı 150

    digitalWrite(MotorL1, LOW); // Sol motorun ileri hareketi aktif
    digitalWrite(MotorL2, HIGH); // Sol motorun geri hareketi pasif
    analogWrite(MotorLE, 200); // Sol motorun hızı 200

    }

    void sag(){ // Robotun sağa dönme hareketi için fonksiyon tanımlıyoruz.

    digitalWrite(MotorR1, LOW); // Sağ motorun ileri hareketi aktif
    digitalWrite(MotorR2, HIGH); // Sağ motorun geri hareketi pasif
    analogWrite(MotorRE, 200); // Sağ motorun hızı 0 (Motor duruyor)

    digitalWrite(MotorL1, LOW); // Sol motorun ileri hareketi aktif
    digitalWrite(MotorL2, HIGH); // Sol motorun geri hareketi pasif
    analogWrite(MotorLE, 200); // Sol motorun hızı 200

    }

    void geri(){ // Robotun geri yönde hareketi için fonksiyon tanımlıyoruz.

    digitalWrite(MotorR1, LOW); // Sağ motorun ileri hareketi pasif
    digitalWrite(MotorR2, HIGH); // Sağ motorun geri hareketi aktif
    analogWrite(MotorRE, 200); // Sağ motorun hızı 150

    digitalWrite(MotorL1, LOW); // Sol motorun ileri hareketi pasif
    digitalWrite(MotorL2, HIGH); // Sol motorun geri hareketi aktif
    analogWrite(MotorLE, 200); // Sol motorun hızı 150
    }

  9. selamlar. ben sizin yaptığınızı yapıyorum tek sensörle. ama ben 3 sensörlü yapmak istedim ve okadar kolay olmadığını anladım. yani 3 tane mesafe sensöründen birine tanımladığım if else diğer sensördeki ile çakışıyor. bunları nasıl bağımsız yapabilirim. yardımcı olur musunz bana bu konuda ?

    • Hareket fonksiyonları olan ileri, geri, sağ ve sol fonksiyonlarında yer alan analogWrite(150) komutlarındaki değerleri değiştirerek tekerleklerin hızlarını eşitleyebilirsiniz.

  10. Devreyi aynen yaptım enerji verdim çalışmıyor. Ne yapmalıyım ben öğrenciyim ve bunu mayısa kadar yetiştirmem lazım. Bana bunu nasıl 3 hcsr04 ile yapabileceğimi söylermisiniz. Bir tane de basit proje lazım bana. Lütfen yardım edin. HC-SR04 İle labirent çözen yapmaya çalışıyorum. Mayısa yapcam. ACELE YARDIM EDİN. 1 aydır ben buna uğraşıyorum. L293D Motor Shield aldım. Olmadı. Sadece entegresini kullandım olmadı. L298N ile yani bun devreyle de olmadı. YARDIM NOLUR.

  11. 4 moturlu yapmak istiyorum ancak bir tane çift motor sürücü kartı var. bit tane ile 4 motor kullanabilrmiyim yada 2 tane mi sürücü kartı kullanmam gerek yardım edermisiniz

    • Sağ ve sol tarafta ikişer adet motor kullanacaksanız her iki motorun da kablolarını paralel bağlayarak tek motor gibi 2’li motor sürücünüze bağlamanız mümkündür. Bu durumda her motoru tek tek kontrol etme şansınız olmayacaktır, fakat hareket için gerekli ileri-geri ve sağ-sol dönüşleri yaptırabilirsiniz.

    • merhaba nihal hanım benim robotta aynı engel olmadığı halde sağa dönüyor düz gitmiyor siz sorunu çözebildiniz mi?

  12. Engelden kaçan robotu yaptım algılamasında bir sorun yok fakat bazen tekerlek takılıyor ultrasonic sensöre servo motor takmak istiyorum acaba arduinoda nereye takmam gerekiyor yardımcı olursanız sevinirim.

  13. Merhaba, robotu yaptım çalışıyor fakat sensör bazen yanı görmüyor bu yüzden teker takılıyor. Ben ekstra servo motor eklemek istiyorum sensörün altında olup sağa sola dönmesini sağlayacak. Yardım ederseniz sevinirim

  14. // Yazılım Geliştirme By Robimek – 2015
    #include // servo motor kütüphanesi
    #include
    //motor pinleri
    #define SolMotorileri 9
    #define SolMotorGeri 10
    #define SagMotorileri 11
    #define SagMotorGeri 12
    //sensör pinleri
    #define USTrigger 6
    #define USEcho 7
    #define Maksimum_uzaklik 100
    Servo servo; //servo motor tanımlama
    NewPing sonar(USTrigger, USEcho, Maksimum_uzaklik);//ultrasonik sensör tanımlama
    //kullanılacak eleman tanımı
    unsigned int uzaklik;
    unsigned int on_uzaklik;
    unsigned int sol_uzaklik;
    unsigned int sag_uzaklik;
    unsigned int zaman;
    // program ilk çalıştığında sadece bir kez çalışacak programlar
    void setup()
    {
    //motor çıkışları
    pinMode(SolMotorileri, OUTPUT);
    pinMode(SolMotorGeri, OUTPUT);
    pinMode(SagMotorileri, OUTPUT);
    pinMode(SagMotorGeri, OUTPUT);
    servo.attach(4); //servo pin tanımı
    }
    // sonsuz döngü
    void loop()
    {
    delay(500);
    servo.write(90);
    sensor_olcum();
    on_uzaklik = uzaklik;
    if(on_uzaklik > 35 || on_uzaklik == 0)
    {
    ileri();
    }
    else
    {
    dur();
    servo.write(180);
    delay(500);
    sensor_olcum();
    sol_uzaklik = uzaklik;
    servo.write(0);
    delay(500);
    sensor_olcum();
    sag_uzaklik = uzaklik;
    servo.write(90);
    delay(500);
    if(sag_uzaklik>sol_uzaklik)
    {
    sag();
    delay(500);
    ileri();
    }
    else if(sol_uzaklik >sag_uzaklik)
    {
    sol();
    delay(500);
    ileri();
    }
    else
    {
    geri();
    }
    }
    }

    // robotun yön komutları
    void ileri()
    {
    digitalWrite(SolMotorGeri, LOW);
    digitalWrite(SolMotorileri, HIGH);
    digitalWrite(SagMotorGeri, LOW);
    digitalWrite(SagMotorileri, HIGH);
    }

    void geri()
    {
    digitalWrite(SolMotorileri, LOW);
    digitalWrite(SolMotorGeri, HIGH);
    digitalWrite(SagMotorileri, LOW);
    digitalWrite(SagMotorGeri, HIGH);
    }

    void sol()
    {
    digitalWrite(SolMotorileri, LOW);
    digitalWrite(SolMotorGeri, HIGH);
    digitalWrite(SagMotorGeri, LOW);
    digitalWrite(SagMotorileri, HIGH);

    }

    void sag()
    {
    digitalWrite(SolMotorGeri, LOW);
    digitalWrite(SolMotorileri, HIGH);
    digitalWrite(SagMotorileri, LOW);
    digitalWrite(SagMotorGeri, HIGH);
    }

    void dur()
    {
    digitalWrite(SolMotorGeri, LOW);
    digitalWrite(SolMotorileri, LOW);
    digitalWrite(SagMotorileri, LOW);
    digitalWrite(SagMotorGeri, LOW);
    }
    // sensörün mesafe ölçümü
    void sensor_olcum()
    {
    delay(50);
    zaman = sonar.ping();
    uzaklik = zaman / US_ROUNDTRIP_CM;
    }

    kodda bir sorun var. kodu kontrol edip düzeltebilirmisiniz

  15. Kolay gelsin çizgi izleyip engelden kaçan robot yapmak istiyoruz.üniversitede proje olarak seçtik bunu nasıl yapabiliriz ?

    • Her iki robot için de gerekli olan donanımı kurup, bir anahtar yardımı ile robotun çalışma modları arasında geçiş yapmasını sağlayabilirsiniz. Bunun için de çizgi izleyen kodunu programda bir fonksiyon altına, engelden kaçan kodunu da başka bir fonksiyon altına yerleştirip, loop içerisinde anahtar durumunu bir if veya switch/case yapısı ile okuyup robotun istediğiniz modda çalışmasını sağlayabilirsiniz.

    • Kullanabilirsiniz tabi ki, fakat 9V pillerin kapasitesi ve verebildikleri akım 6 adet AA kalem pilin kapasitesi ve sağlayabileceği akımdan daha düşüktür. Bu sebepten dolayı 6’lı pil yuvası kullanmaktayız. Aynı gerilim olduğu için 9V pil de kullanabilirsiniz, sadece robotunuz daha kısa sürede pili bitirecektir.

      • bana pil yetmiyor 9wolt arduino ya elektirik fazla gitmiyor ve motorlar çalışömıyor ayrıca 18wolt takıbnca aradan zaman geçtikten sonra arduino yandı tekrar aldım oda yandı

        • Arduino’nun adaptör girişinden verebileceğiniz maksimum gerilim 12V civarındadır. 18V ile uzun süre kullanımda sorun yaşamanızın sebebi, kart üzerindeki regülatörün bu yüksek gerilime dayanamaması ve aşırı ısınmasındandır. Daha uzun çalışma süresi istiyorsanız 2 hücreli (7.4V) LiPo bataryaları tercih edebilirsiniz: https://www.robotistan.com/2s-74v-li-po

  16. Merhaba iyi günler ben sitenizden aynen videodaki herşeyi aldım yaptım kodu yazdım yükledim ama herhangi bir hareket yok final proje ödevim yardımcı olurmusunuz

  17. Aynen anlatılanları yaptım. Sürekli SAĞA dönüyor ya sensör çalışmıyor yada kodda hata var. Sensörü iptal ettim yine aynı

  18. araç engeli algılıyor ve çarpıyor sonra geri gelip sağ yapıyor sonra ileri gidiryor ve sensör duruyor ne yapmalıyım

    • L293 motor sürücü entegresine mesafe sensörünüzü bağlayamazsınız, sensörü ve sürücüyü Arduino’nuza bağlamanız gereklidir.

CEVAP VER

Please enter your comment!
Please enter your name here