Bu uygulamada hemen hemen tüm robot yarışmalarındaki robotlarda kullanılan, engellerden kaçma algoritması üzerine çalışacağız. Bunu yapabilmek için önceki konularda öğrendiğimiz DC motor kontrolü ve ultrasonik uzaklık sensörü ile uzaklık ölçümünü kullanacağız. Bu uygulamada öğrenilen bilgiler, robot yarışmalarında bulunan çöp toplama, labirent çözme, yangın söndürme gibi kategorilerde kullanılabilir.
Bu projede yapılacak olan 4 tekerli robot hareket için 4x4 şeklinde, her bir tekere bağlanan DC motorlardan oluşacak. Bu motorların kontrolü için DC motor sürücüsü kullanacağız. Uzaklık ölçümü için HC-SR04 ultrasonik uzaklık sensörü kullanacağız.
Arduino sürekli olarak uzaklık sensöründen gelen uzaklık verisini kontrol edecek. Eğer ölçülen uzaklık verisi 10 cm'den kısa ise robot durdurulacaktır. Robot engelden kaçmak için yaklaşık 90 derece sola dönecektir. Eğer sola döndükten sonra önünde herhangi bir engel yoksa ilerlemeye devam edecektir. Önüne yeni bir engel geldiğinde robot, tekrar bu işlemleri yapacaktır. Böylece robotumuz engellere çarpmadan ilerleyebilecek.
Bu uygulamayı yapmak için ihtiyacınız olan malzemeler:
- 1 x Arduino
- 4 x Tekerlek
- 1 x Robot şasesi
- 4 x DC motor
- 1 x DC motor sürücüsü
- 1 x HC-SR04 uzaklık sensörü
Devre şemasında görüldüğü gibi aynı tarafta bulunan iki DC motor birbirine paralel olarak bağlanmıştır. Böyle bağlanmasının nedeni bu motorun her zaman için aynı şekilde dönecek olmasıdır. Eğer ayrı ayrı bağlanması istenseydi, o zaman iki adet DC motor sürücüye ihtiyaç duyulurdu. Uzaklık sensörü robotun en önüne takılmıştır. Uzaklığın doğru olarak bulunması için robotun hiçbir parçası sensörün görüş açısında bulunmamalıdır. Resimdeki devreyi robot şasesine bağlayarak Arduino programlamaya başlayabiliriz.
Resimde gösterilen devre şemasının kablo bağlantıları aşağıdaki tablolarda gösterilmiştir:
Arduino | Motor Sürücü |
8 | INPUT 1 |
9 | INPUT 2 |
13 | INPUT 3 |
12 | INPUT 4 |
11 | ENABLE A |
10 | ENABLE B |
Motor | Motor Sürücü |
Motor1 + | OUTPUT 1 |
Motor1 - | OUTPUT 2 |
Motor2 + | OUTPUT 3 |
Motor2 - | OUTPUT 4 |
(Motorun + veya – ucunun hangisi olduğu farketmez)
Besleme | Motor Sürücü |
+12 Volt | VCC |
Toprak (- uç) | GND |
+5 Volt | VS |
Arduino | HC-SR04 Uzaklık Sensörü |
+5 Volt | VCC |
6 | Trig |
7 | Echo |
Toprak (- uç) | GND |
Devre kurulumunu gerçekleştirdikten sonra aşağıdaki kodu Arduino'ya yükleyelim
const int trigPin = 6; /* Sensorun trig pini Arduinonun 6 numarali ayagina baglandi */
const int echoPin = 7; /* Sensorun echo pini Arduinonun 7 numarali ayagina baglandi */
int DonmeHizi = 175;
/* bu değişken ile motorların dönme hızı kontrol edilebilir */
int DonmeZamani = 250;
/* DonmeZamani değişkeni robotun 90 derece dönmesini sağlayan değişkendir
* Robotun yaklaış 90 derece dönmesi için robotunuza göre bu süreyi ayarlayın
*/
/* motor sürücüsüne bağlanacak INPUT ve ENABLE pinleri belirleniyor */
const int sagileri = 9;
const int saggeri = 8;
const int solileri = 12;
const int solgeri = 13;
const int solenable = 11;
const int sagenable = 10;
/* Uzaklık ölçümünün yapılacağı fonksiyon */
long mesafeOlcumu(){
long sure;
long uzaklik;
digitalWrite(trigPin, LOW); /* sensor pasif hale getirildi */
delayMicroseconds(5);
digitalWrite(trigPin, HIGH); /* Sensore ses dalgasinin uretmesi icin emir verildi */
delayMicroseconds(10);
digitalWrite(trigPin, LOW); /* Yeni dalgalarin uretilmemesi icin trig pini LOW konumuna getirildi */
sure = pulseIn(echoPin, HIGH, 11600); /* ses dalgasinin geri donmesi icin gecen sure olculuyor */
uzaklik= sure /29.1/2; /* olculen sure uzaklige cevriliyor */
return uzaklik;
}
void ileri(int hiz){
/* ilk değişkenimiz sag motorun ikincisi sol motorun hızını göstermektedir.
* motorlarımızın hızı 0-255 arasında olmalıdır.
* Fakat bazı motorların torkunun yetersizliğiniden 60-255 arasında çalışmaktadır.
* Eğer motorunuzdan tiz bir ses çıkıyorsa hızını arttırmanız gerekmektedir.
*/
analogWrite(sagenable, hiz); /* sağ motorun hız verisi */
digitalWrite(sagileri,HIGH); /* ileri dönme sağlanıyor */
digitalWrite(saggeri,LOW); /* ileri dönme sağlanıyor */
analogWrite(solenable, hiz); /* sol motorun hız verisi */
digitalWrite(solileri, HIGH); /* ileri dönme sağlanıyor */
digitalWrite(solgeri,LOW); /* ileri dönme sağlanıyor */
}
void sagaDon(int hiz){
analogWrite(sagenable, hiz); /* sağ motorun hız verisi */
digitalWrite(sagileri,LOW); /* geri dönme sağlanıyor */
digitalWrite(saggeri,HIGH); /* geri dönme sağlanıyor */
analogWrite(solenable, hiz); /* sol motorun hız verisi */
digitalWrite(solileri, HIGH); /* ileri dönme sağlanıyor */
digitalWrite(solgeri,LOW); /* ileri dönme sağlanıyor */
}
void solaDon(int hiz){
analogWrite(sagenable, hiz); /* sağ motorun hız verisi */
digitalWrite(sagileri,HIGH); /* ileri dönme sağlanıyor */
digitalWrite(saggeri,LOW); /* ileri dönme sağlanıyor */
analogWrite(solenable, hiz); /* sol motorun hız verisi */
digitalWrite(solileri, LOW); /* geri dönme sağlanıyor */
digitalWrite(solgeri,HIGH); /* geri dönme sağlanıyor */
}
void geri(int hiz){
analogWrite(sagenable, hiz); /* sağ motorun hız verisi */
digitalWrite(sagileri,LOW); /* geri yönde dönme sağlanıyor */
digitalWrite(saggeri, HIGH); /* geri yönde dönme sağlanıyor */
analogWrite(solenable, hiz); /* sol motorun hız verisi */
digitalWrite(solileri, LOW); /* geri yönde dönme sağlanıyor */
digitalWrite(solgeri, HIGH); /* geri yönde dönme sağlanıyor */
}
void dur()
{
/* Tüm motorlar kitlenerek durma sağlanıyor */
digitalWrite(sagileri, HIGH);
digitalWrite(saggeri, HIGH);
digitalWrite(solileri, HIGH);
digitalWrite(solgeri, HIGH);
}
void setup(){
/* Uzaklık sensörünün pinleri ayarlanıyor */
pinMode(trigPin, OUTPUT); /* trig pini cikis olarak ayarlandi */
pinMode(echoPin,INPUT); /* echo pini giris olarak ayarlandi */
/* motorları kontrol eden pinler çıkış olarak ayarlanıyor */
pinMode(sagileri,OUTPUT);
pinMode(saggeri,OUTPUT);
pinMode(solileri,OUTPUT);
pinMode(solgeri,OUTPUT);
pinMode(sagenable,OUTPUT);
pinMode(solenable,OUTPUT);
}
void loop(){
while( mesafeOlcumu() > 10 ){ // önüne engel gelene kadar düz git
ileri(DonmeHizi);
}
dur();
delay(500);
solaDon(DonmeHizi);
delay(DonmeZamani);
dur();
delay(500);
}