Bir cümlelik özet
Bu projede iki çizgi sensörü, iki motor ve bir motor sürücüsü kullanarak yerdeki bir çizgiyi kendi başına takip eden gerçek bir robot kuruyorum; sensörlerin sol–sağ okumasına göre motor hızlarını ayarlıyorum.
Neden önemli?
Önceki projede robot bir engeli görüp ondan kaçıyordu. Şimdi işi tersine çeviriyoruz: robot bir şeyden kaçmayacak, çizilmiş bir yolu takip edecek. Bu, aynı "algıla–karar ver–uygula" döngüsünün bir başka yüzüdür.
Çizgi izleme, robotik dünyasının en klasik projesidir. Ama sadece yarışmalarda değil: depolarda raflar arasında dolaşan taşıma araçları ve fabrika bantları da yerdeki işaretleri benzer mantıkla izler. Küçük bir robotta çalışan fikir, büyük sistemlerde de aynıdır.
Bu proje modülün özünü tek bir cihazda birleştirir. Sensörler çizgiyi algılar, program bir koşulla karar verir, motorlar bu kararı harekete çevirir. Elektronik, kod ve mekanik burada aynı anda çalışır. Ben ilk kurduğumda robot düz bir çizgide bile sağa kaçıyordu; nedenini bulup düzeltmek projenin en öğretici kısmıydı.
Malzeme, bağlantı ve güç
Malzeme listesi
Basit bir çizgi izleyen robot için gerekenler:
- İki tekerlekli bir şasi (chassis) ve iki DC redüktörlü motor.
- Bir motor sürücü kartı (örneğin L298N).
- İki kızılötesi (IR) çizgi sensörü.
- Bir Arduino (örneğin Uno).
- Motorlar için ayrı bir pil paketi (örneğin 4–6 kalem pil).
- Jumper kablolar ve bağlantı için bir breadboard.
Neden ayrı pil ve motor sürücü?
Motorlar, Arduino'nun pinlerinden çok daha fazla akım çeker. Motoru doğrudan bir Arduino pinine bağlarsan pin zarar görür, hatta kart bozulur. Bu yüzden araya bir motor sürücü koyarız: Arduino sürücüye "şu hızda dön" diye küçük bir sinyal gönderir, gücü ise sürücü ayrı pilden çeker.
Bir kapı zilini düşün: parmağınla küçük bir düğmeye basarsın ama sesi çıkaran güç duvardaki hattan gelir. Motor sürücü de böyle bir aracıdır.
İki kural çok önemlidir:
- Motorlar ayrı bir pil paketinden beslenir; Arduino ise USB veya kendi pilinden.
- İki güç kaynağının eksi uçları (GND) ortak bağlanmalıdır (ortak toprak). Ortak toprak olmadan sürücü Arduino'nun sinyalini doğru okuyamaz.
Asla şebeke (priz) elektriği kullanma. Bu proje yalnız düşük gerilimli pillerle yapılır.
Sensörleri kalibre et
Kod yazmadan önce sensörlerin gerçekte ne söylediğini ölçmeliyiz. Kalibrasyon, "sensör hangi durumda 1, hangi durumda 0 veriyor?" sorusunun cevabıdır.
Serial ile oku
Küçük bir test koduyla sensör değerlerini ekrana yazdır:
const int SOL_SENSOR = 2;
const int SAG_SENSOR = 3;
void setup() {
Serial.begin(9600);
pinMode(SOL_SENSOR, INPUT);
pinMode(SAG_SENSOR, INPUT);
}
void loop() {
Serial.print(digitalRead(SOL_SENSOR));
Serial.print(" ");
Serial.println(digitalRead(SAG_SENSOR));
delay(200);
}
Sensörü siyah çizginin üzerine, sonra beyaz zemine tut. Değerlerin nasıl değiştiğini not al. Bazı modüllerde çizgi 1, bazılarında 0 verir. Bu projede "çizgi = 1" kabul ediyoruz; senin modülün tersse kodda karşılaştırmaları değiştirmen yeter.
Sensör yüksekliği ve konumu
Sensörler zemine çok yakın (yaklaşık 3–8 mm) ve çizginin iki yanına bakacak şekilde takılır. Çok yüksekte olurlarsa çizgiyi ayırt edemez, çok alçakta olurlarsa yere sürter. Modüldeki küçük ayar vidasıyla (varsa) eşiği, siyah ile beyaz net ayrılana kadar ayarla.
Robotu programla
Robotun iki tekerleği ayrı motorlarla döner. Direksiyon yoktur; dönmek için iki tekerleği farklı hızlarda sürersin. Buna diferansiyel sürüş denir.
Sözde kod
Sürekli tekrarla
sol = sol sensörü oku
sağ = sağ sensörü oku
Eğer sol beyaz ve sağ beyaz ise
iki motoru da hızlı sür (düz git)
Değilse eğer sol çizgi ve sağ beyaz ise
sol motoru yavaşlat (sola dön)
Değilse eğer sol beyaz ve sağ çizgi ise
sağ motoru yavaşlat (sağa dön)
Değilse
kavşak veya kayıp durumunu ele al
Mantık ilk bakışta ters gelebilir: sol sensör çizgiyi görüyorsa sola döneriz. Çünkü sol sensör çizgiye değdiyse robot sağa kaymış demektir; ortaya dönmek için sola çekmemiz gerekir.
Örnek 1: Pinler ve kurulum
const int SOL_SENSOR = 2; // sol IR sensör
const int SAG_SENSOR = 3; // sağ IR sensör
const int SOL_ENA = 5; // sol motor hız (PWM)
const int SOL_IN1 = 7; // sol motor yön
const int SOL_IN2 = 8;
const int SAG_ENB = 6; // sağ motor hız (PWM)
const int SAG_IN3 = 9; // sağ motor yön
const int SAG_IN4 = 10;
const int HIZLI = 160; // 0–255 arası
const int YAVAS = 70;
void setup() {
pinMode(SOL_SENSOR, INPUT);
pinMode(SAG_SENSOR, INPUT);
pinMode(SOL_ENA, OUTPUT); pinMode(SOL_IN1, OUTPUT); pinMode(SOL_IN2, OUTPUT);
pinMode(SAG_ENB, OUTPUT); pinMode(SAG_IN3, OUTPUT); pinMode(SAG_IN4, OUTPUT);
digitalWrite(SOL_IN1, HIGH); digitalWrite(SOL_IN2, LOW); // sol ileri
digitalWrite(SAG_IN3, HIGH); digitalWrite(SAG_IN4, LOW); // sağ ileri
}
Yönü setup() içinde bir kez ileri ayarlıyoruz. Döngüde sadece hızı değiştireceğiz.
Örnek 2: Ana döngü ve motor yardımcısı
void motorlariSur(int solHiz, int sagHiz) {
analogWrite(SOL_ENA, solHiz);
analogWrite(SAG_ENB, sagHiz);
}
void loop() {
int sol = digitalRead(SOL_SENSOR); // 1 = çizgi görüldü
int sag = digitalRead(SAG_SENSOR);
if (sol == 0 && sag == 0) { // ikisi de beyaz
motorlariSur(HIZLI, HIZLI); // düz git
} else if (sol == 1 && sag == 0) { // çizgi solda
motorlariSur(YAVAS, HIZLI); // sola dön
} else if (sol == 0 && sag == 1) { // çizgi sağda
motorlariSur(HIZLI, YAVAS); // sağa dön
} else { // ikisi de çizgi
motorlariSur(HIZLI, HIZLI); // kavşak: düz devam
}
}
motorlariSur küçük bir yardımcı fonksiyondur; sol ve sağ hızı tek satırda ayarlar. Böylece döngü okunaklı kalır.
Kavşak ve kayıp durum
Gerçek pistlerde iki özel durum robotu şaşırtır.
Her iki sensör de çizgi görüyorsa bu genelde bir kavşak ya da kalın bir işarettir. Basit robotta karar kolaydır: düz devam et. Yukarıdaki kodda son else bunu yapar.
Her iki sensör de uzun süre beyaz görüyorsa robot çizgiyi tamamen kaybetmiş olabilir. Sadece "düz git" dersen robot pistten çıkar. Daha akıllı bir çözüm, son gördüğü yönü hatırlamaktır:
Eğer ikisi de uzun süre beyaz ise
son dönüş yönüne doğru dönerek çizgiyi ara
Yani robot çizgiyi en son solda gördüyse, kaybettiğinde sola dönerek onu geri bulmaya çalışır.
Test parkuru ve bir hatanın düzeltilmesi
Önce robotu tekerlekleri havada, elinde tutarak dene. Sonra siyah bant veya kalın kalemle beyaz bir kâğıda basit bir parkur çiz: düz bir çizgi, sonra yumuşak bir viraj.
| # | Test | Beklenen sonuç |
|---|---|---|
| 1 | Düz çizgi üzerine koy | Robot düz ilerler |
| 2 | Robotu hafif sağa kaydır | Sol sensör çizgiyi görür, sola düzeltir |
| 3 | Yumuşak virajı sür | Robot çizgiyi takip ederek döner |
Bir hata ve düzeltmesi: robot düz gitmiyor
İlk denememde iki sensör de beyaz görürken robot yine de sürekli sağa kaçıyordu. Beklediğim: dümdüz gitsin. Gerçekte olan: sağa kaydı.
Amaç: İki sensör de beyazken robot düz gitsin
Sorun: Robot düz çizgide sağa kaçıyor
Kontrol: İki motor aynı PWM'de aynı hızda dönmüyor
Düzeltme: Yavaş kalan motora küçük bir denge farkı ekle
Sorun kodda değil, mekanikteydi: aynı HIZLI değerinde sol motor sağdan biraz hızlı dönüyordu. İki motor asla birebir aynı değildir. Düz giderken sol motora küçük bir azaltma (örneğin HIZLI - 15) uygulayınca robot düzeldi. Bu küçük ayara denge (trim) denir ve her robotta biraz farklıdır.
Mini uygulama
Robotu kendi fikrinle geliştir. Şunlardan birini dene:
HIZLIveYAVASdeğerlerini değiştirip robotu daha yumuşak mı yoksa daha keskin mi döndürdüğünü gözlemle.- Yukarıdaki "kayıp durum" mantığını gerçek koda ekle: son dönüş yönünü bir değişkende tut ve çizgi kaybolunca o yöne ara.
- Parkura bir kavşak ekle ve robotun kavşakta ne yaptığını not al; istersen kavşakta yavaşlatan bir kural yaz.
Yaptığın değişikliği tek cümleyle yaz: robot artık ne yapıyor ve neyi daha iyi yapıyor?
Sık yapılan hatalar
Ortak toprağı unutmak
Arduino ile motor pilinin GND uçlarını birbirine bağlamazsan sürücü sinyalleri okuyamaz. Robot ya hiç hareket etmez ya da rastgele davranır. Ortak toprak bu projenin en sık atlanan adımıdır.
Motoru doğrudan Arduino'ya bağlamak
Motoru bir Arduino pinine takarsan pin çok akım çeker ve zarar görür. Motorlar her zaman sürücü kartından ve ayrı pilden beslenmelidir.
Sensör değerini varsaymak
Bazı modüllerde çizgi 1, bazılarında 0 verir. Kalibrasyon yapmadan koddaki karşılaştırmalara güvenme; önce Serial ile ölç.
Denge farkını hesaba katmamak
İki motor aynı PWM'de asla tam aynı dönmez. Robot düz gitmiyorsa kod yanlış olmayabilir; küçük bir denge ayarı çoğu zaman çözer.
Güvenlik notu
Bu robot hareket eder, bu yüzden birkaç kural önemlidir. Testi geniş, boş bir zeminde yap; robotun düşebileceği masa kenarından uzak dur. Parmağını, saçını ve kabloları tekerleklere ve dişlilere yaklaştırma; dönen parçalar sıkıştırabilir. İlk denemeleri düşük hızda ve tekerlekleri havadayken yap.
Motorları her zaman bir motor sürücü ve ayrı, düşük gerilimli bir pil paketiyle çalıştır; iki kaynağın toprağını ortak bağla. Asla şebeke (priz) elektriği kullanma. Pil ısınırsa, kablo yanık kokarsa ya da robot tuhaf davranırsa pili hemen çıkar. Motor, pil ve kesici alet içeren adımları bir yetişkinle birlikte yap.
Ders özeti
- Çizgi izleyen robot, iki IR sensörün sol–sağ okumasına göre motor hızlarını ayarlayarak çizgiyi takip eder.
- Dönmek için iki tekerleği farklı hızlarda süreriz; buna diferansiyel sürüş denir.
- Motorlar ayrı bir pilden ve bir motor sürücüyle beslenir; iki güç kaynağının toprağı ortak olmalıdır.
- Sensörlerin
0/1değeri modüle göre değişir; kod yazmadan önce Serial ile kalibrasyon yapılır. - Robot düz gitmiyorsa sorun çoğu zaman koddan değil motor dengesinden gelir; küçük bir trim ayarı düzeltir.
Kontrol soruları
- Bir çizgi izleyen robotta motorları neden doğrudan Arduino'ya değil de bir motor sürücüye bağlarız?
- İki güç kaynağı kullanırken hangi bağlantı mutlaka ortak olmalıdır ve neden?
- Sol sensör çizgiyi görüp sağ sensör beyaz görüyorsa robot hangi yöne döner ve neden?
- Kalibrasyonu neden kod yazmadan önce yaparız?
- Robot düz bir çizgide sürekli bir tarafa kaçıyorsa ilk kontrol etmen gereken şey nedir?
Cevaplar
- Motorlar Arduino pininin veremeyeceği kadar çok akım çeker. Doğrudan bağlanırsa pin veya kart zarar görür. Sürücü, gücü ayrı pilden çekip motora verir; Arduino ise sadece küçük bir kontrol sinyali gönderir.
- İki güç kaynağının eksi uçları (GND / toprak) ortak bağlanmalıdır. Ortak toprak olmadan sürücü, Arduino'nun gönderdiği sinyalin seviyesini doğru okuyamaz ve robot düzgün çalışmaz.
- Robot sola döner. Sol sensör çizgiye değdiyse robot sağa kaymış demektir; sol motoru yavaşlatıp sola çekerek kendini çizginin ortasına geri getirir.
- Çünkü sensör modülüne göre çizgi bazen
1, bazen0verir. Ölçmeden kodda karşılaştırma yaparsak robot tam ters davranabilir. Serial ile ölçmek doğru değerleri gösterir. - Motor dengesi. İki motor aynı PWM'de tam aynı dönmez; düz giderken hızlı olan motora küçük bir azaltma (trim) uygulamak çoğu zaman sorunu çözer.
Kaynak ve doğrulama notu
“Proje: Çizgi İzleyen Robot” dersi için doğrulama odağı Malzeme, bağlantı ve güç ile Neden ayrı pil ve motor sürücü? 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
Veri ve Yapay Zekâya Giriş modülü: Robotların topladığı sensör verilerini toplamayı, anlamayı ve bir bilgisayarın bu verilerden nasıl "öğrendiğini" keşfetmeye başlıyoruz.