Bir cümlelik özet
Bu projede ultrasonik sensör, iki motor ve bir motor sürücü kullanarak önündeki engeli fark eden, duran, dönen ve boş yöne ilerleyen küçük bir otonom robot kuruyoruz.
Neden önemli?
Şimdiye kadar sensörleri, motorları ve Arduino'yu ayrı ayrı öğrendik. Bu ders hepsini tek bir çalışan makinede birleştiriyor. Robot artık bir insan onu yönlendirmeden kendi kararını verir: "Önümde bir şey var mı? Varsa dur ve başka yöne bak."
Bu, otonom sistemlerin temel fikridir. Robot süpürgeler, park sensörlü arabalar ve depo robotları hep aynı üç adımı çalıştırır: algıla, karar ver, hareket et (sense–decide–act). Bu projeyi kurduğunda bu döngüyü kendi ellerinle görürsün. Bir sonraki adımda bu robotu çizgi izleyen bir robota çevirmek de kolaylaşır.
Robotun mantığı: algıla, karar ver, hareket et
Robotumuz sürekli tekrar eden basit bir döngü çalıştırır. Önce mesafeyi ölçer, sonra bir eşik değeriyle karşılaştırır, sonra motorlara komut verir.
Sözde kod
Kod yazmadan önce mantığı günlük dille yazalım. Bu, kafamızdaki planı netleştirir.
Sürekli tekrarla:
mesafeyi ölç
Eğer mesafe eşikten küçükse
ileri gitmeyi durdur
biraz geri git
yön değiştir (dön)
Değilse
ileri git
Buradaki eşik (threshold), robotun "artık çok yakın" dediği sınır mesafedir. Biz başlangıçta 20 santimetre seçeceğiz. Çok küçük seçersen robot engele çarpmadan duramaz; çok büyük seçersen robot her şeyden kaçar ve hiç ilerleyemez.
İki örnek durum
Örnek 1 — Önü açık: Sensör 60 cm ölçüyor. 60, eşikten (20) büyük olduğu için robot düz ilerler.
Örnek 2 — Önünde duvar: Sensör 12 cm ölçüyor. 12, eşikten küçük olduğu için robot durur, biraz geri gider ve sağa döner. Sonra tekrar ölçer. Yeni yön açıksa ilerlemeye devam eder.
Malzeme ve bağlantı
Malzeme listesi
- Arduino Uno (veya uyumlu bir kart)
- 2 adet DC motor + tekerlek ve bir şasi (chassis)
- L298N motor sürücü kartı
- HC-SR04 ultrasonik mesafe sensörü
- 4–6 kalem pilden oluşan ayrı pil yuvası (motorlar için)
- Bağlantı kabloları (jumper)
Neden ayrı bir motor sürücü ve ayrı pil?
Motorlar, Arduino pinlerinin verebileceğinden çok daha fazla akım çeker. Motoru doğrudan Arduino'ya bağlarsan kartı bozabilirsin. Bu yüzden araya motor sürücü (L298N) koyarız: Arduino sürücüye "ileri git" gibi zayıf bir sinyal verir, sürücü de ayrı pil yuvasından gelen gücü motora aktarır.
Önemli bir kural: Arduino ile pil yuvasının eksi uçları (GND) ortak bağlanmalıdır. Ortak toprak (common ground) olmazsa sürücü Arduino'nun sinyalini doğru okuyamaz.
Bağlantı özeti
| Parça | Bağlantı |
|---|---|
| HC-SR04 VCC | Arduino 5V |
| HC-SR04 GND | Arduino GND |
| HC-SR04 Trig | Arduino pin 9 |
| HC-SR04 Echo | Arduino pin 10 |
| L298N IN1 / IN2 | Arduino pin 5 / 6 (sol motor) |
| L298N IN3 / IN4 | Arduino pin 7 / 8 (sağ motor) |
| L298N motor gücü | Ayrı pil yuvası (+) |
| Ortak GND | Arduino GND + pil (−) birlikte |
Arduino kodu (fonksiyonlara bölünmüş)
Kodu küçük parçalara ayırdık. Böylece her parçayı ayrı ayrı test edip anlayabiliriz.
1. Pinler ve kurulum
// Ultrasonik sensör pinleri
const int trig = 9;
const int echo = 10;
// Motor sürücü pinleri
const int in1 = 5, in2 = 6; // sol motor
const int in3 = 7, in4 = 8; // sağ motor
const int esik = 20; // engel eşiği (cm)
void setup() {
pinMode(trig, OUTPUT);
pinMode(echo, INPUT);
pinMode(in1, OUTPUT); pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT); pinMode(in4, OUTPUT);
}
2. Mesafeyi ölçen fonksiyon
// Sensörden cm cinsinden mesafe döndürür
long mesafeOlc() {
digitalWrite(trig, LOW);
delayMicroseconds(2);
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
long sure = pulseIn(echo, HIGH);
return sure * 0.034 / 2; // sesin hızıyla mesafeye çevir
}
3. Hareket fonksiyonları
void ileri() {
digitalWrite(in1, HIGH); digitalWrite(in2, LOW);
digitalWrite(in3, HIGH); digitalWrite(in4, LOW);
}
void dur() {
digitalWrite(in1, LOW); digitalWrite(in2, LOW);
digitalWrite(in3, LOW); digitalWrite(in4, LOW);
}
void don() { // yerinde sağa dön
digitalWrite(in1, HIGH); digitalWrite(in2, LOW);
digitalWrite(in3, LOW); digitalWrite(in4, HIGH);
}
4. Ana döngü
void loop() {
long mesafe = mesafeOlc();
if (mesafe < esik) { // engel yakın
dur();
delay(200);
don();
delay(400); // kısa bir dönüş
} else {
ileri(); // yol açık
}
delay(50);
}
Dikkat et: loop() içindeki mantık, en başta yazdığımız sözde kodla birebir aynı. Kod dili değişse de karar mantığı aynı kaldı.
Mini uygulama
- Robotu tekerlekleri havada olacak şekilde tut ve gücü ver. Elini sensörün önüne getir: motorların yönü değişiyor mu? Değişmiyorsa önce burada test et.
- Basit bir test parkuru kur: yere iki karton kutuyu engel olarak koy, aralarında robotun geçebileceği kadar boşluk bırak.
- Robotu yere bırak ve düşük hızda çalıştır. Bir engele yaklaşınca durup dönüyor mu?
- Eşik değerini kodda 20'den 30'a çıkar. Robot artık engellere daha erken mi tepki veriyor? Farkı gözlemle.
Bir hata ve düzeltmesi
İlk denememde robot engele yaklaşınca durdu ama sonra yine ileri gidip çarptı. Beklenen davranış: dur, dön, sonra açık yöne git.
Adım adım baktım:
Beklenen: engelde dur -> dön -> yeni yönde ilerle
Gerçek: engelde durdu -> hemen tekrar ileri gitti
Sorun, don() fonksiyonundan sonra dönüş için yeterli süre vermememdi. delay(400) satırını unutmuştum, bu yüzden robot dönmeye başlar başlamaz döngü baştan çalışıp yeniden "ileri" komutu veriyordu. don() sonrasına delay(400) eklediğimde robot gerçekten yön değiştirip açık tarafa gitmeye başladı. Küçük bir eksik satır, bütün davranışı bozabiliyor.
Geliştirme fikirleri
- Robot sağa dönerken bazen köşeye sıkışıyorsa, dönüşü rastgele sağa veya sola yaptır.
- Sensörü küçük bir servo motora koyup sağa ve sola bakmasını sağla; robot daha açık olan yöne dönsün.
- Engele çok yaklaşınca kırmızı bir LED yak; bu, kararı gözle görmeni sağlar.
Projeyi güçlendirme planı
Proje: Engel Kaçan Robot için yalnız çalışan bir gösterim hazırlamak yeterli değildir. İyi bir proje; hedefi, kullanıcıyı, sınırları, test koşullarını ve başarısız denemeleri de görünür kılar. Bu genişletme çalışmasında belirli açı aralığında nesne taşıyan küçük robot kol bağlamını kullanarak algıla–karar ver–hareket et diyagramı, güvenli robot davranışı ve test parkuru kaydı oluştur. Dersin hedefi “Mesafe sensörü, iki motor ve sürücüyle engelden kaçan otonom bir robot yap” olsa da proje sayfasında ölçülmemiş bir sonucu kesin başarı gibi yazma.
1. Proje özeti ve kapsam
Önce üç cümle yaz: Çözmek istediğin sorun nedir, bu sorun kimin için önemlidir ve ilk sürüm özellikle neyi yapmayacaktır? Kapsam dışını belirtmek projeyi küçültmez; tamamlanabilir hâle getirir. Robotun mantığı: algıla, karar ver, hareket et ile İki örnek durum arasındaki ilişkiyi projenin temel varsayımı olarak yaz ve bu varsayımı hangi testin doğrulayacağını belirt.
2. Kabul ölçütleri
- Robot açıldığında motorlar beklemeden çalışıyor mu?
- Sensör kaybında güvenli duruş tanımlı mı?
- Mekanik parçalar kablolara sürtüyor mu?
- Test parkuru aynı koşullarda tekrar edilebilir mi?
- Hız, doğruluk ve enerji kullanımı birlikte değerlendirildi mi?
“Proje: Engel Kaçan Robot” için kabul ölçütlerini “çalışıyor” gibi belirsiz sözcüklerle bırakma. Süre, mesafe, doğru deneme sayısı, ekran genişliği veya kullanıcı adımı gibi gözlenebilir bir ölçü seç. Ölçüm mümkün değilse en azından üç ardışık denemede aynı davranışın görülüp görülmediğini kaydet.
3. Test matrisi
| Test | Koşul | Beklenen | Gerçek sonuç | Sonraki karar |
|---|---|---|---|---|
| Normal | Standart giriş ve tam bağlantı | Temel görev tamamlanır | Test sırasında doldur | Koru veya küçük iyileştirme yap |
| Sınır | En düşük ya da en yüksek kabul edilen değer | Sistem kararlı kalır | Test sırasında doldur | Eşiği veya kuralı gözden geçir |
| Hata | Eksik, yanlış ya da beklenmeyen giriş | Güvenli ve anlaşılır tepki | Test sırasında doldur | Hata yönetimi ekle |
| Tekrar | Aynı koşulda en az üç deneme | Benzer sonuçlar | Test sırasında doldur | Tutarsızlığın kaynağını araştır |
4. Sürüm günlüğü
“Proje: Engel Kaçan Robot” projesinin her sürümü için tarih, değiştirdiğin tek ana karar, değişikliğin nedeni ve test sonucu yaz. İlk sürümün çalışmaması başarısızlık değildir; Robotun mantığı: algıla, karar ver, hareket et veya İki örnek durum ile ilgili hangi varsayımın yeniden düşünülmesi gerektiğini gösteren veridir. Görsel kullanırken kişisel bilgi ve özel arka plan ayrıntılarını paylaşma.
5. Sunum ve öz değerlendirme
“Proje: Engel Kaçan Robot” projesini iki dakikada anlatacak şekilde hazırlan: sorun, çözüm yaklaşımı, belirli açı aralığında nesne taşıyan küçük robot kol için en önemli test sonucu ve bir sonraki adım. “Tamamlandı” demek yerine hangi kısmın doğrulandığını ve hangi kısmın hâlâ geliştirilmesi gerektiğini açıkla.
Sık yapılan hatalar
Ortak toprağı unutmak
Arduino ve pil yuvasının GND uçları birbirine bağlı değilse motorlar hiç dönmez veya rastgele davranır. En sık yapılan hata budur.
Motoru doğrudan Arduino'ya bağlamak
Arduino pinleri motoru çeviremez ve zorlanınca bozulur. Motor her zaman sürücü üzerinden ve ayrı pilden beslenmelidir.
Eşik değerini yanlış seçmek
Çok küçük eşikte robot durmadan çarpar; çok büyük eşikte her şeyden kaçar. 15–25 cm arası iyi bir başlangıçtır.
Tekerlekleri havadayken test etmemek
Kodu doğrudan yerde denemek, robot masadan düşerse zarar verir. Önce tekerlekler havadayken sinyalleri kontrol et.
Güvenlik notu
Hareket eden bir robot ısırabilir, düşebilir veya bir şeye çarpabilir. Uygulamadan önce şunlara dikkat et:
- Güvenli bir test alanı aç. Yerde düşecek bir şey olmayan, boş ve düz bir zemin seç. İlk testleri masada değil yerde yap; robot masadan düşebilir.
- Parmaklarını, saçını ve kablolarını tekerleklerden ve dişlilerden uzak tut. Dönen tekerlek ve dişli (gear) sıkıştırabilir.
- Düşük hızda test et. Robot hızlıysa hem kontrolü zorlaşır hem de çarpma sert olur.
- Ayrı, düşük gerilimli pil kullan; asla şebeke elektriği (priz) kullanma. Motorlar için pil yuvası yeterlidir.
- Ortak toprağı bağla ama artı ve eksi uçları yanlışlıkla birbirine değdirme; kısa devre pilleri ısıtır.
- Motor, lehim ve kesici alet gerektiren adımlarda bir yetişkinle çalış.
Ders özeti
- Engel kaçan robot, "algıla, karar ver, hareket et" döngüsünün en temel örneğidir.
- Ultrasonik sensör mesafeyi ölçer; robot bunu bir eşik değeriyle karşılaştırıp karar verir.
- Motorlar ayrı bir pil ve motor sürücüyle beslenir; Arduino sadece zayıf sinyal verir.
- Arduino ile pilin ortak toprağı (common ground) mutlaka bağlanmalıdır.
- Kodu fonksiyonlara bölmek hem test etmeyi hem de hata bulmayı kolaylaştırır.
Kontrol soruları
- Robotun tekrar tekrar çalıştırdığı üç temel adım nedir?
- "Eşik değeri" ne işe yarar ve çok küçük seçilirse ne olur?
- Motoru neden doğrudan Arduino'ya değil de bir motor sürücüye bağlarız?
- Ortak toprak (common ground) bağlanmazsa ne olabilir?
- İlk testi neden robot tekerlekleri havadayken yapmak iyi bir fikirdir?
Cevaplar
- Algıla (mesafeyi ölç), karar ver (eşikle karşılaştır) ve hareket et (motorlara komut ver).
- Eşik, robotun "engel çok yakın" saydığı sınır mesafedir. Çok küçük seçilirse robot durmaya vakit bulamadan çarpar.
- Motorlar Arduino pinlerinin verebileceğinden çok daha fazla akım çeker; doğrudan bağlamak kartı bozar. Sürücü, ayrı pilden gelen gücü motora aktarır.
- Sürücü, Arduino'nun sinyalini doğru okuyamaz; motorlar hiç dönmez veya rastgele davranır.
- Tekerlekler havadayken robot düşmez veya kaçmaz; sinyalleri ve motor yönlerini güvenle kontrol edebilirsin.
Kaynak ve doğrulama notu
“Proje: Engel Kaçan Robot” dersi için doğrulama odağı Robotun mantığı: algıla, karar ver, hareket et ile İki örnek durum arasındaki ilişkinin örnekler üzerinde tutarlı çalışmasıdır. Robot davranışı yalnız kodla açıklanamaz; mekanik yapı, güç sistemi, sensör konumu ve zemin koşulları birlikte değerlendirilmelidir. Test sonuçları aynı parkurda birkaç tekrar yapılarak kaydedilmelidir.
Sonraki ders
Proje: Çizgi İzleyen Robot