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ı:
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ı.
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.
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ı.
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.
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.
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.
Anahtar kapatılınca iki kaynakta birbirinden izole bir şekilde kapalı devre oluyor ve robot çalışmaya başlıyor.
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.