Ultrasonik Sensörlü Engelden Kaçan Robot
HC-SR04 ultrasonik sensör ve L298N motor sürücü kullanarak engel algılayan ve yön değiştiren robot yapacağız.
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.
- Arduino Uno
- Çok amaçlı robot platformu
- L298N voltaj regülatörlü çift motor sürücü kartı
- HC-SR04 ultrasonik mesafe sensörü
- Pil veya uygun harici güç kaynağı
- 6’lı AA pil yuvası
- Jumper kablolar
Robot motorları Arduino pinlerinden doğrudan beslenmemelidir. Motorlar için L298N motor sürücü ve uygun harici güç kaynağı kullanılmalıdır. Arduino GND ile motor sürücü GND ortak bağlanmalıdır.
Ultrasonik sensörün Echo pini Arduino’nun 12 numaralı pinine, Trig pini 13 numaralı pinine bağlanır. Sağ motor kontrol pinleri 7, 6 ve hız pini 9; sol motor kontrol pinleri 5, 4 ve hız pini 3 olarak kullanılmıştır.
L298N üzerindeki ENA ve ENB pinleri PWM pinlerine bağlandığında motor hızları analogWrite() ile kontrol edilebilir.
Robot, ultrasonik sensör ile önündeki mesafeyi sürekli ölçer. Ölçülen mesafe belirlenen eşik değerin altına düşerse robot önce geri gider, ardından sağa dönerek engelden kaçmaya çalışır.
Mesafe güvenli aralıkta ise robot ileri yönde hareket etmeye devam eder. Bu örnekte engel eşiği 15 cm olarak ayarlanmıştır.
HC-SR04 ölçümünde pulseIn() için zaman aşımı eklemek robotun sensör cevap vermediğinde takılı kalmasını önler. Bu nedenle düzenlenmiş kodda pulseIn(echoPin, HIGH, 30000) kullanılmıştır.
#define echoPin 12
#define trigPin 13
#define MotorR1 7
#define MotorR2 6
#define MotorRE 9
#define MotorL1 5
#define MotorL2 4
#define MotorLE 3
long sure;
long uzaklik;
void setup() {
pinMode(echoPin, INPUT);
pinMode(trigPin, OUTPUT);
pinMode(MotorL1, OUTPUT);
pinMode(MotorL2, OUTPUT);
pinMode(MotorLE, OUTPUT);
pinMode(MotorR1, OUTPUT);
pinMode(MotorR2, OUTPUT);
pinMode(MotorRE, OUTPUT);
Serial.begin(9600);
}
void loop() {
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
sure = pulseIn(echoPin, HIGH, 30000);
if (sure == 0) {
uzaklik = 999;
} else {
uzaklik = sure / 29.1 / 2;
}
Serial.println(uzaklik);
if (uzaklik < 15) {
geri();
delay(150);
sag();
delay(250);
} else {
ileri();
}
}
void ileri() {
digitalWrite(MotorR1, HIGH);
digitalWrite(MotorR2, LOW);
analogWrite(MotorRE, 150);
digitalWrite(MotorL1, HIGH);
digitalWrite(MotorL2, LOW);
analogWrite(MotorLE, 150);
}
void sag() {
digitalWrite(MotorR1, HIGH);
digitalWrite(MotorR2, LOW);
analogWrite(MotorRE, 0);
digitalWrite(MotorL1, HIGH);
digitalWrite(MotorL2, LOW);
analogWrite(MotorLE, 150);
}
void geri() {
digitalWrite(MotorR1, LOW);
digitalWrite(MotorR2, HIGH);
analogWrite(MotorRE, 150);
digitalWrite(MotorL1, LOW);
digitalWrite(MotorL2, HIGH);
analogWrite(MotorLE, 150);
}
void dur() {
analogWrite(MotorRE, 0);
analogWrite(MotorLE, 0);
}
const int echoPin = 12;
const int trigPin = 13;
const int MotorR1 = 7;
const int MotorR2 = 6;
const int MotorRE = 9;
const int MotorL1 = 5;
const int MotorL2 = 4;
const int MotorLE = 3;
const int motorHizi = 150;
const int engelMesafesi = 15;
void setup() {
pinMode(echoPin, INPUT);
pinMode(trigPin, OUTPUT);
pinMode(MotorL1, OUTPUT);
pinMode(MotorL2, OUTPUT);
pinMode(MotorLE, OUTPUT);
pinMode(MotorR1, OUTPUT);
pinMode(MotorR2, OUTPUT);
pinMode(MotorRE, OUTPUT);
Serial.begin(9600);
dur();
}
void loop() {
long uzaklik = mesafeOlc();
Serial.print("Uzaklik: ");
Serial.println(uzaklik);
if (uzaklik < engelMesafesi) {
dur();
delay(100);
geri();
delay(200);
dur();
delay(100);
sag();
delay(300);
} else {
ileri();
}
}
long mesafeOlc() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long sure = pulseIn(echoPin, HIGH, 30000);
if (sure == 0) {
return 999;
}
return sure / 58;
}
void ileri() {
motorSur(HIGH, LOW, motorHizi, HIGH, LOW, motorHizi);
}
void geri() {
motorSur(LOW, HIGH, motorHizi, LOW, HIGH, motorHizi);
}
void sag() {
motorSur(HIGH, LOW, 0, HIGH, LOW, motorHizi);
}
void dur() {
motorSur(LOW, LOW, 0, LOW, LOW, 0);
}
void motorSur(int r1, int r2, int rHiz, int l1, int l2, int lHiz) {
digitalWrite(MotorR1, r1);
digitalWrite(MotorR2, r2);
analogWrite(MotorRE, rHiz);
digitalWrite(MotorL1, l1);
digitalWrite(MotorL2, l2);
analogWrite(MotorLE, lHiz);
}
Bu sürümde mesafe ölçümü ve motor sürme işlemleri ayrı fonksiyonlara ayrıldı. Motor hızı ve engel mesafesi sabit değişkenlerle daha kolay düzenlenebilir hale getirildi.