Arduino ile Engelden Kaçan Robot

Güncelleme 20/03/2020

Engelden kaçan robot, üzerindeki 2 adet mesafe sensörü ile etrafındaki cisimleri algılayarak engellere çarpmadan ilerleyebilmektedir. Robot, 2 adet DC motor sayesinde Otonom olarak yani otomatik olarak kendi başına karar vererek hareket etmektedir.
Mesafe sensörü olarak daha önce uygulamasını yaptığımız MZ80 endüstriyel sensöründen 2 adet kullandık bu sensörün önünde bir cisim yoksa çıkış pininden lojik1(HIGH) bilgisi verir. Eğer önünde cisim varsa lojik0(LOW) bilgisi vermektedir. Sensörlerin çıkışlarından alınan bilgileri Arduinoya gönderip yazdığımız Arduino programı sayesinde motorların sensörlerden gelen bilgiler doğrultusunda hareket etmesini sağladık.

Devre Şeması:

engelden kacan robot

Sensörlerin çıkış pinini doğrudan Arduinonun dijital giriş-çıkış pinlerine bağladık ama motorları doğrudan Arduinoya bağlayamayız. Motor sürücü olarak L293B entegresini kullandık. L293D ile L293B entegrelerinin çalışmasını anlattığımız ve DC Motor kontrolü yaptığımız yazımızda bu konu ile ilgili ayrıntılı bilgiler bulabilirsiniz.

Arduino Programı:

/* "iki sensörlü engelden kaçan robot" 
    Arduino ile 2 tane MZ80 sensör ve L293B motor sürücü 
    entegresi kullanarak yapılan engelden kaçan robot programı.
    diyot.net */

const int sag_sensor=2; //sağ sensörden gelen veriyi okuyan pin
const int sol_sensor=3; //sol sensörden gelen veriyi okuyan pin
int sagDurum,solDurum; //okunan değerleri bu değişkenlerde tut

const int sag_ileri=4; //sağ motorun ileri gitmesini sağlayan pin
const int sag_geri=5; //sağ motorun geri gitmesini sağlayan pin
const int sol_ileri=6; //sol motorun ileri gitmesini sağlayan pin
const int sol_geri=7; //sol motorun geri gitmesini sağlayan pin

void setup() 
{
  pinMode (sag_sensor,INPUT); //sensör bağlı pinler giriş
  pinMode (sol_sensor,INPUT);
  pinMode (sag_ileri,OUTPUT); //motor bağlı pinler çıkış
  pinMode (sag_geri,OUTPUT);
  pinMode (sol_ileri,OUTPUT);
  pinMode (sol_geri,OUTPUT);
}

void loop() 
{
  sagDurum=digitalRead(sag_sensor); 
  solDurum=digitalRead(sol_sensor);
  //sensörlerden gelen veriyi okuyup değişkenlere kaydet
  
  if (sagDurum == HIGH && solDurum == HIGH)
  //robotun önünde engel yoksa iki sensördende HIGH verisi okunur
  {
    digitalWrite(sag_ileri,HIGH); //sağ motor ileri git
    digitalWrite(sag_geri,LOW);
    digitalWrite(sol_ileri,HIGH); //sol motor ileri git
    digitalWrite(sol_geri,LOW);
    //bu şart sağlandığı sürece robot ileri gider
  }
  
   else if (sagDurum == HIGH && solDurum == LOW)
   //sol sensör algılarsa LOW verisi okunur
  {
    //önce 150msn robot geri gitsin
    digitalWrite(sag_ileri,LOW); //sağ motor geri git
    digitalWrite(sag_geri,HIGH);
    digitalWrite(sol_ileri,LOW); //sol motor geri git
    digitalWrite(sol_geri,HIGH);
    delay(150);
    //sonra engelden kurtulmak için 250msn sağa dönsün
    digitalWrite(sag_ileri,LOW); //sağ motor geri git
    digitalWrite(sag_geri,HIGH);
    digitalWrite(sol_ileri,HIGH); //sol motor ileri git
    digitalWrite(sol_geri,LOW);
    delay(250);
  }

    else if (sagDurum == LOW && solDurum == HIGH)
    //sağ sensör algılarsa LOW verisi okunur
  {
    //önce 150msn robot geri gitsin
    digitalWrite(sag_ileri,LOW); //sağ motor geri git
    digitalWrite(sag_geri,HIGH);
    digitalWrite(sol_ileri,LOW); //sol motor geri git
    digitalWrite(sol_geri,HIGH);
    delay(150);
    //sonra engelden kurtulmak için 250msn sola dönsün
    digitalWrite(sag_ileri,HIGH); //sağ motor ileri git
    digitalWrite(sag_geri,LOW);
    digitalWrite(sol_ileri,LOW); //sol motor geri git
    digitalWrite(sol_geri,HIGH);
    delay(250);
  }

    else if (sagDurum == LOW && solDurum == LOW)
    //sensörler aynı anda algılarsa ikisinden de LOW verisi okunur
  {
    digitalWrite(sag_ileri,LOW); //sağ motor geri git
    digitalWrite(sag_geri,HIGH);
    digitalWrite(sol_ileri,LOW); //sol motor geri git
    digitalWrite(sol_geri,HIGH);
    //bu şart sağlandığı sürece robot geri gider    
  }
  }

Arduino programında ilk olarak kullandığımız pinleri isimlendirdik. Arduinonun 2 nolu dijital pinine robotun sağındaki mesafe sensörünün çıkış kablosunu bağladığımız için bu pini “sag_sensor” olarak isimlendirdik. Soldaki sensörün çıkış kablosunu Arduinonun 3 nolu pinine bağladığımız için bu pini “sol_sensor” olarak isimlendirdik. Ve bu pinlerden alınan bilgileri saklamak için int veri tipinde “sagDurum” ve “solDurum” isminde iki değişken tanımladık.

2 adet DC motorun kontrolü yapılacağı için L293B motor sürücü entegresine Arduinodan 4 tane dijital çıkış pini bağlanması gerekir. Sağdaki motorun ileri dönmesini sağlayacak olan pini 4 nolu dijital pine bağladığımız için bu pine “sag_ileri” ismini verdik. Geri dönmesini sağlayacak olan pini 5 nolu dijital pine bağladığımız için bu pine “sag_geri” ismini verdik. Soldaki motorun ileri dönmesini sağlayacak olan pini 6 nolu dijital pine bağladığımız için bu pini “sol_ileri” olarak isimlendirdik. Geri dönmesini sağlayacak olan pini ise 7 nolu dijital pine bağladığımızdan dolayı bu pini “sol_geri” olarak isimlendirdik.

void setup() kısmında sensörlerden Arduinoya bilgi girişi yapıldığı için sensörlerin çıkış kablolarının bağlı olduğu pinleri pinMode komutuyla giriş olarak ayarladık. Motorların kontrolünü yapmak için L293B motor sürücü entegresine bağladığımız 4 adet dijital pinden motor sürücüye bilgi gönderildiği için bu pinleri pinMode komutuyla çıkış olarak ayarladık.

void loop() kısmında robotun sensörlerden gelen bilgiler doğrultusunda hareket etmesini sağlayacak olan komutları yazdık. Sensörlerden gelen bilgileri digitalRead komutuyla okuyup “sagDurum” ve “solDurum” isimli değişkenlere kaydedilmesini sağladık.

  • Eğer sensörlerin ikisinden de lojik1(HIGH) bilgisi geliyorsa robotun önünde engel yoktur ilk if şartı sağlanır. Bu durumda “sag_ileri” ve “sol_ileri” pinlerinden lojik1(HIGH), “sag_geri” ve “sol_geri” pinlerinden lojik0(LOW) bilgileri motor sürücüye gönderilerek robotun ileri yönde gitmesi sağlanır. Robotun önünde engel olmadığı sürece bu şart sağlanır ve robot ileri yönde hareket eder.
  • Eğer sağ sensörden lojik1(HIGH), sol sensörden lojik0(LOW) bilgisi geliyorsa robotun solunda bir engel vardır ve soldaki sensör bunu algılamıştır. İkinci if şartı sağlanır. Robotun 150msn geri gitmesi ve ardından 250msn sağa dönerek engelden kurtulması sağlanır. Geri gitmesi için “sag_geri” ve “sol_geri” pinlerinden lojik1(HIGH), “sag_ileri” ve “sol_ileri” pinlerinden lojik0(LOW) bilgileri motor sürücüye gönderilir ve delay(150) komutuyla robotun 150msn geri gitmesi sağlanır. Sağa dönmesi için ise sağ motorun geri, sol motorun ileri dönmesi gerekir. Bunun için “sag_geri” ve “sol_ileri” pinlerinden lojik1(HIGH), “sag_ileri” ve “sol_geri” pinlerinden lojik0(LOW) bilgileri motor sürücüye gönderilir ve delay(250) komutuyla sağa dönüş hareketinin 250msn devam etmesi sağlanır.
  • Eğer sağ sensörden lojik0(LOW), sol sensörden lojik1(HIGH) bilgisi geliyorsa robotun sağında bir engel vardır ve sağdaki sensör bunu algılamıştır. Üçüncü if şartı sağlanır. Robotun 150msn geri gitmesi ve ardından 250msn sola dönerek engelden kurtulması sağlanır. Geri gitmesi için “sag_geri” ve “sol_geri” pinlerinden lojik1(HIGH), “sag_ileri” ve “sol_ileri” pinlerinden lojik0(LOW) bilgileri motor sürücüye gönderilir ve delay(150) komutuyla robotun 150msn geri gitmesi sağlanır. Sola dönmesi için ise sağ motorun ileri, sol motorun geri dönmesi gerekir. Bunun için “sag_ileri” ve “sol_geri” pinlerinden lojik1(HIGH), “sag_geri” ve “sol_ileri” pinlerinden lojik0(LOW) bilgileri motor sürücüye gönderilir ve delay(250) komutuyla sola dönüş hareketinin 250msn devam etmesi sağlanır.
  • Eğer sensörlerin ikisinden de lojik0(LOW) bilgisi geliyorsa; robotun önünde bir engel vardır, bu engelden kurtulması için robotun geri gitmesi sağlanır. Bunun için “sag_geri” ve “sol_geri” pinlerinden lojik1(HIGH), “sag_ileri” ve “sol_ileri” pinlerinden lojik0(LOW) bilgileri motor sürücüye gönderilerek robotun geri gitmesi sağlanır. Bu şart sağlandığı sürece robot geri yönde hareket eder.

Robotun mekanik kısmında kullanılan malzemeler ise şöyle;

Robotun gövdesi için 5x10cm boyutlarında kablo kanalı ve 3mm çapındaki vida ve somunlar kullanıldı.

engelden kacan robot mekanik1

Arduinoyu ve delikli plakete lehimlenen motor sürücüyü şaseye vidalamak için 1cm’lik plastik aralayıcılar kullanıldı. 12V ve 500rpm(devir/dakika) hızına sahip DC motorlar kullanıldı. 4cm çapında tekerlekler kullanıldı. Motorlar şaseye kablo bağıyla sıkıştırıldıktan sonra üzerine sıcak silikon dökülerek sabitlendi.

motor tekerlek

Robotun hareketini sağlayan arkada bulunan 2 adet DC motordur. Ama ön kısmında rahat bir şekilde dönmeye izin vermesi gerekir. Bunu sağlamak için sarhoş tekerlek kullanıldı.

sarhos teker

Arduinonun enerjisini sağlamak için 9V pil kullanıldı. Motorların enerjisini sağlamak için ise 11,1V’luk Li-Po pil kullanıldı. Bu pilin özelliği güçlü ve hafif olmasıdır. Ama motor besleme kaynağı olarak bu pil yerine 9V’luk başka bir pil kullanılabilir.

engelden kacan robot ici

Sensörleri robotun sağ ve sol kısımlarına monte edebilmek için L şeklinde kablo kanalı kesilip ortasına sensörün çapında delikler açıldı. Oluşturulan aparatla beraber sensörler robot şasesine 3mm’lik vida ve somunlarla sabitlendi. Ön kısım boş kalmasın diye L şeklinde kablo kanalı kesilip 3mm’lik vida ve somunlarla şaseye sabitlendi.

engelden kacan robot sensorler

Robotun arkasında egzoz gibi duran bir anahtar takıldı. Bu anahtar açıkken hem Arduinonun besleme kaynağı olan 9V pil, hem de Motor besleme kaynağı olan 11,1V’luk Li-Po pil birbirinden izole bir şekilde açık devre oluyor.

robot anahtari

Anahtar kapatılınca iki kaynakta birbirinden izole bir şekilde kapalı devre oluyor ve robot çalışmaya başlıyor.

robot anahtar

Mekanik kısımda kullanılan malzemeler yerine çok farklı malzemelerde kullanılabilir. Piyasada çok çeşitli motorlar, tekerlekler, sarhoş tekerlekler bulunmaktadır. Ve robot gövdesi için flexi-glass, bakır plaket, delikli plaket gibi çeşitli malzemeler kullanılabilir. Elektronik kısımda ise farklı mesafe sensörleri, farklı motor sürücüler veya hazır motor sürücü kartları kullanabilirsiniz. Yapılabilecekler hayal gücünüzle sınırlıdır.

Bir yanıt yazın