Engelden Kaçan Robot Yapımı: Arduino ile Adım Adım
Otonom mobil robotların dünyadaki en temel görevi, insan müdahalesine ihtiyaç duymadan bilinmeyen bir ortamda gezinmek ve karşılaştığı engellere çarpmadan yoluna devam etmektir. Evlerimizde her gün çalışan akıllı robot süpürgelerden Mars yüzeyinde kaya parçalarını aşan keşif araçlarına kadar tüm mobil sistemlerin çekirdeğinde "Engelden Kaçan Robot Algoritması" yer alır.
Bu kapsamlı rehberde; Arduino Uno, HC-SR04 ultrasonik mesafe sensörü, SG90 servo motor ve L298N motor sürücü kullanarak çevresine bakınan, en açık yolu tespit eden ve engellerden zekice kaçan bir robot arabanın yapımını adım adım inceliyoruz.
1. Sistemin Çalışma Mantığı ve "Kafasını Çeviren Robot" Mimarisi
Basit engelden kaçan robotlar sensörleri sabit olduğu için sadece önünü görür ve geri kaçar. Bizim inşa edeceğimiz gelişmiş modelde ise ultrasonik sensör bir servo motorun üzerine (hareketli bir kafa gibi) monte edilir:
Bu mimari robota gerçek bir yapay canlı hissi kazandırır.
2. Gerekli Malzemeler Listesi
| Malzeme | Adet | Açıklama |
|---|---|---|
| Arduino Uno R3 | 1 | Ana işlemci kartı |
| 2WD Robot Şasisi | 1 | 2 DC motor, 2 tekerlek, sarhoş teker ve gövde |
| L298N Çift Motor Sürücü Modülü | 1 | Motorlara yön ve güç veren sürücü |
| HC-SR04 Mesafe Sensörü | 1 | Engelleri algılayan ultrasonik gözler |
| SG90 9g Mikro Servo Motor | 1 | Sensörü sağa-sola döndüren kafa motoru |
| Ultrasonik Sensör Tutucu Aparat | 1 | Sensörü servoya tutturan plastik/pleksi parça |
| 2 Adet 18650 Li-ion Pil ve Yuvası | 1 | 7.4V yüksek güçlü motor beslemesi |
| Jumper Kablolar | 20+ | Devre bağlantıları |
3. Devre Şeması ve Pin Bağlantı Rehberi
A. L298N Motor Sürücü Pinleri:
B. HC-SR04 ve Servo Bağlantıları:
4. Tam ve Çalışan Arduino C++ Kodları
/* * RobotKodla.com - Otonom Sistemler * Proje: Gelişmiş Engelden Kaçan Robot (Servo Taramalı) */ #include <Servo.h> // Motor Pinleri
const int solMotorIleri = 5;
const int solMotorGeri = 6;
const int sagMotorIleri = 9;
const int sagMotorGeri = 10; // Sensör Pinleri
const int trigPin = 7;
const int echoPin = 8;
const int servoPin = 11; Servo kafaServosu; int sagMesafe = 0;
int solMesafe = 0;
int onMesafe = 0; void setup() { pinMode(solMotorIleri, OUTPUT); pinMode(solMotorGeri, OUTPUT); pinMode(sagMotorIleri, OUTPUT); pinMode(sagMotorGeri, OUTPUT); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); kafaServosu.attach(servoPin); kafaServosu.write(90); // Karşıya bak delay(1000);
} void loop() { onMesafe = mesafeOlc(); // Eğer önünde 25 cm'den yakın engel varsa karar verme moduna geç if (onMesafe <= 25) { dur(); delay(200); geriGit(); delay(300); dur(); delay(200); // Sağı kontrol et kafaServosu.write(20); delay(500); sagMesafe = mesafeOlc(); // Solu kontrol et kafaServosu.write(160); delay(500); solMesafe = mesafeOlc(); // Kafayı tekrar öne çevir kafaServosu.write(90); delay(300); // Karşılaştırma yap if (sagMesafe > solMesafe) { sagaDon(); delay(400); // 90 derece sağa dön } else { solaDon(); delay(400); // 90 derece sola dön } dur(); delay(200); } else { ileriGit(); }
} int mesafeOlc() { digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); long sure = pulseIn(echoPin, HIGH, 30000); // 30ms zaman aşımı if (sure == 0) return 400; // Yankı dönmezse yol açık kabul et return sure * 0.034 / 2;
} void ileriGit() { digitalWrite(solMotorIleri, HIGH); digitalWrite(solMotorGeri, LOW); digitalWrite(sagMotorIleri, HIGH); digitalWrite(sagMotorGeri, LOW);
} void geriGit() { digitalWrite(solMotorIleri, LOW); digitalWrite(solMotorGeri, HIGH); digitalWrite(sagMotorIleri, LOW); digitalWrite(sagMotorGeri, HIGH);
} void sagaDon() { digitalWrite(solMotorIleri, HIGH); digitalWrite(solMotorGeri, LOW); digitalWrite(sagMotorIleri, LOW); digitalWrite(sagMotorGeri, HIGH);
} void solaDon() { digitalWrite(solMotorIleri, LOW); digitalWrite(solMotorGeri, HIGH); digitalWrite(sagMotorIleri, HIGH); digitalWrite(sagMotorGeri, LOW);
} void dur() { digitalWrite(solMotorIleri, LOW); digitalWrite(solMotorGeri, LOW); digitalWrite(sagMotorIleri, LOW); digitalWrite(sagMotorGeri, LOW);
}5. Mekanik Montaj ve Ağırlık Merkezi Tavsiyeleri
6. Sık Karşılaşılan Sorunlar ve Çözümleri
| Hata Belirtisi | Nedeni | Çözüm Adımı |
|---|---|---|
| Robot engele çarpıyor, hiç durmuyor | Ultrasonik sensör menzil aşımına düşüyor | Sensörün açı olarak yere çok eğik bakmadığından emin olun (yere çarpıp seker). |
| Robot sağa dönmesi gerekirken sola dönüyor | Motor kutup kabloları ters bağlı | L298N üzerindeki OUT1-OUT2 veya OUT3-OUT4 klemens kablolarını ters çevirin. |
| Servo kafa döndüğünde Arduino reset atıyor | Anlık akım yetersizliği | Servo ve Arduino 5V pinine paralel 470µF kondansatör takın veya pilleri şarj edin. |
7. Kapsamlı Sıkça Sorulan Sorular (SSS)
Robot ince masa bacaklarını neden algılayamıyor?
HC-SR04 sensörünün yaydığı ses dalgası konik bir alana yayılır. Çok ince metal masa veya sandalye bacakları ses dalgalarını sağa sola saçar ve geri yansıtmaz. Bu kör noktaları kapatmak için robotun köşelerine minik dokunmatik switch (bumper) butonlar eklenebilir.
Kaç santimetre engelde durması idealdir?
Robotun hızına bağlı olarak 20 ile 30 cm arası en ideal frenleme mesafesidir. 10 cm'nin altına inerseniz robot yüksek hızda giderken atalet nedeniyle duramayıp duvara çarpabilir.
Sonuç
Engelden kaçan robot projesi, yazılımla mekanik sistemlerin birleştiğinde ortaya çıkan otonom zekanın en somut kanıtıdır. Bu projeyi başarıyla bitirdikten sonra üzerine Bluetooth modülü ekleyerek hem manuel hem otonom modlar arasında geçiş yapabilen melez bir sistem tasarlayabilirsiniz. Detaylı yapım kılavuzları için sitemizin [Projeler](/projeler) sekmesini ziyaret edin!