Bir cümlelik özet
Çizgi izleyen robot, iki kızılötesi sensörle zemindeki çizgiyi görür ve iki motorun hızını ayarlayarak çizgi üzerinde kalır; bu derste o mantığı algoritmadan çalışan sketch'e kadar kuruyoruz.
Neden önemli?
Fabrikalarda, hastanelerde ve depolarda yere çizilmiş şeritleri takip eden robotlar vardır. Yükü bir noktadan diğerine kimse sürmeden taşırlar. Bunların hepsi aynı basit fikre dayanır: robot çizginin neresinde olduğunu ölçer ve rotayı sürekli düzeltir.
Bu projede yeni bir şey öğreniyoruz: robot artık yalnız "dur" ya da "git" demiyor. İki motoru farklı hızlarda çalıştırarak yön veriyor. Bir motor yavaşlarsa robot o tarafa döner. İşte gerçek robotların direksiyonu budur.
Ayrıca ilk kez bir motor sürücü kullanıyoruz. Motorlar, LED'lere göre çok daha fazla akım çeker. Bu yüzden onları doğrudan Arduino'ya bağlamak yanlıştır. Bu dersin güvenlik notu tam da bunu anlatıyor.
Robot çizgiyi nasıl "görür"?
Kızılötesi çizgi sensörü
Bir kızılötesi çizgi sensörü (IR line sensor), göze görünmeyen kızılötesi ışık gönderir ve zeminden geri yansıyanı ölçer. Beyaz zemin ışığı iyi yansıtır; siyah çizgi ışığı yutar.
Sensör bize tek bir dijital cevap verir:
- Beyaz zemin gördüğünde bir değer (bu derste
LOWkabul ediyoruz). - Siyah çizgi gördüğünde diğer değer (
HIGH).
Not: Bazı sensör modülleri bunu tersine verir. Robotun ters davrandığını görürsen, sensör mantığını (LOW/HIGH) yer değiştir.
İki sensör, iki göz gibi
Robotun önüne, çizginin biraz solu ve biraz sağı hizasına iki sensör koyarız. Robot tam çizginin üstündeyken iki sensör de beyaz görür, çizgi tam ortalarından geçer.
Robot sola kayarsa, siyah çizgi sağ sensörün altına gelir. Sağa kayarsa sol sensörün altına gelir. Yani hangi sensör çizgiyi görüyorsa, robot ters yöne kaymış demektir ve o yöne dönmesi gerekir.
Günlük hayattan örnek
Gözlerin kapalı, ayağının altında bir bordür var ve onu takip etmeye çalışıyorsun. Ayağın kenardan kayınca hemen düzeltirsin. Robot da tam bunu yapar, sadece ayağı yerine iki sensörü ve iki motoru vardır.
İki motorla yön verme
Farklı hız = dönüş
Robotun iki tekeri ve iki motoru vardır. İkisi de aynı hızda dönerse robot düz gider. Sol motoru yavaşlatırsak sol taraf geride kalır ve robot sola döner. Sağ motoru yavaşlatırsak sağa döner.
| Sol sensör | Sağ sensör | Anlamı | Hareket |
|---|---|---|---|
| Beyaz | Beyaz | Çizgi tam ortada | Düz git |
| Çizgide | Beyaz | Sola kaymış | Sola dön |
| Beyaz | Çizgide | Sağa kaymış | Sağa dön |
| Çizgide | Çizgide | Kavşak / kalın çizgi | Düz git |
Günlük hayattan örnek
Bir arabada şeritten çıkmaya başlarsan direksiyonu hafifçe geri çevirirsin. Robot da öyle: küçük ve sürekli düzeltmeler yapar. Tek büyük hamle yerine binlerce küçük düzeltme, çizgide kalmayı sağlar.
Algoritmadan sketch'e
Önce sözde kod
Başla
Sürekli tekrarla:
sol = sol sensörü oku
sag = sağ sensörü oku
Eğer sol beyaz ve sag beyaz ise
iki motoru da ileri çalıştır (düz git)
Değilse eğer yalnız sol çizgide ise
sol motoru yavaşlat (sola dön)
Değilse eğer yalnız sag çizgide ise
sağ motoru yavaşlat (sağa dön)
Değilse
düz git
Bağlantı listesi
- Motor sürücü (örneğin L298N modülü) ile iki DC motor.
- Motorlara ayrı bir pil paketi (örneğin 6 x AA). Arduino'dan değil!
ENA→ D5 (PWM, sol hız),IN1→ D7,IN2→ D8.ENB→ D6 (PWM, sağ hız),IN3→ D12,IN4→ D13.- Sol sensör OUT → D2, sağ sensör OUT → D3.
- Sürücünün GND'si ile Arduino GND'si ortak olmalı.
Pin tanımları ve kurulum
// Motor sürücü pinleri
const int ENA = 5; // Sol motor hız (PWM)
const int IN1 = 7;
const int IN2 = 8;
const int ENB = 6; // Sağ motor hız (PWM)
const int IN3 = 12;
const int IN4 = 13;
// Çizgi sensörleri
const int SOL_SENSOR = 2;
const int SAG_SENSOR = 3;
const int HIZ = 150; // 0-255 arası taban hız
void setup() {
pinMode(ENA, OUTPUT); pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT);
pinMode(ENB, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT);
pinMode(SOL_SENSOR, INPUT);
pinMode(SAG_SENSOR, INPUT);
// İki motoru da ileri yöne ayarla
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);
Serial.begin(9600);
}
Ana döngü
void motorlariAyarla(int solHiz, int sagHiz) {
analogWrite(ENA, solHiz);
analogWrite(ENB, sagHiz);
}
void loop() {
int sol = digitalRead(SOL_SENSOR);
int sag = digitalRead(SAG_SENSOR);
if (sol == LOW && sag == LOW) {
motorlariAyarla(HIZ, HIZ); // Düz git
} else if (sol == HIGH && sag == LOW) {
motorlariAyarla(0, HIZ); // Sola dön
} else if (sol == LOW && sag == HIGH) {
motorlariAyarla(HIZ, 0); // Sağa dön
} else {
motorlariAyarla(HIZ, HIZ); // Kavşak: düz git
}
}
analogWrite ile motor hızını 0–255 arasında ayarlarız. 0 durur, 255 tam hızdır. Hızı doğrudan pin gerilimiyle değil, sürücü üzerinden veririz.
Mini uygulama
Test parkuru kur
Beyaz bir karton üzerine, kalın siyah bantla (yaklaşık 2 cm) yavaş virajlı kapalı bir yol yapıştır. Keskin köşe yerine yumuşak yaylar kullan; robot keskin dönüşlerde çizgiyi kaçırır.
- Robotu çizginin üstüne, iki sensör beyazı görecek şekilde koy.
- Önce motor pilini takmadan sadece sensörleri test et:
Serial.printlnile değerleri yazdır, elini sensörün önünde gezdir. - Sonra motor pilini tak ve robotu düşük
HIZdeğeriyle (120–150) parkura bırak. - Robot çizgiyi kaybediyorsa
HIZdeğerini düşür veya sensörleri çizgiye yaklaştır.
Non-blocking durum yazdırma (geliştirme)
delay kullanırsak robot o an "kör" kalır. Bunun yerine millis ile arada bir durum yazdırmak daha iyidir:
unsigned long sonYazma = 0;
void durumYaz(int sol, int sag) {
if (millis() - sonYazma >= 300) {
sonYazma = millis();
Serial.print("Sol: "); Serial.print(sol);
Serial.print(" Sag: "); Serial.println(sag);
}
}
Bu fonksiyonu loop içinde çağırırsan motorlar hiç beklemeden çalışmaya devam eder.
Projeyi güçlendirme planı
Proje: Çizgi İzleyen Robotun Mantığı 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 buton sıçramasını yazılımla azaltan kontrollü sayaç bağlamını kullanarak bağlantı şeması, derlenebilen Arduino kodu, seri monitör kaydı ve test sonucu oluştur. Dersin hedefi “İki çizgi sensörü ve motor sürücüyle bir çizgi izleyen robotun kontrol mantığını kur” 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. Robot çizgiyi nasıl "görür"? ile İki sensör, iki göz gibi arasındaki ilişkiyi projenin temel varsayımı olarak yaz ve bu varsayımı hangi testin doğrulayacağını belirt.
2. Kabul ölçütleri
- Kartın 5 V veya 3,3 V çalışma sınırı doğru mu?
- Pin numaraları kod ve devrede eşleşiyor mu?
- Seri monitör ölçümü beklenen aralıkta mı?
- Motor veya servo karttan doğrudan aşırı akım çekiyor mu?
- Güç kesildiğinde sistem güvenli duruma dönüyor mu?
“Proje: Çizgi İzleyen Robotun Mantığı” 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: Çizgi İzleyen Robotun Mantığı” 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; Robot çizgiyi nasıl "görür"? veya İki sensör, iki göz gibi 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: Çizgi İzleyen Robotun Mantığı” projesini iki dakikada anlatacak şekilde hazırlan: sorun, çözüm yaklaşımı, buton sıçramasını yazılımla azaltan kontrollü sayaç 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
Robot düz gitmiyor, sürekli bir yana kayıyor
En sık karşılaşılan sorun budur. İki DC motor asla tam olarak aynı değildir; biri diğerinden biraz hızlı döner. Çözüm, yavaş motora fazladan güç vermektir (trim):
const int SOL_HIZ = 150;
const int SAG_HIZ = 165; // Sağ motor yavaşsa biraz artır
// motorlariAyarla(SOL_HIZ, SAG_HIZ);
Değerleri deneyerek robot düz gidene kadar ayarla.
Sensör mantığını ters kurmak
Robot çizgiden kaçıyorsa, sensör beyaz/siyah cevabı beklediğinin tersidir. Kodda HIGH ve LOW'u yer değiştir.
Ortak GND'yi unutmak
Motor pili ve Arduino'nun GND'si birleşmezse sürücü komutları anlamaz. GND hattını mutlaka ortak yap.
Çok yüksek hızla başlamak
Yüksek hızda robot virajı alamadan çizgiyi kaçırır. Her zaman düşük hızda başla, çizgide kaldıkça artır.
Güvenlik notu
- Motorları asla doğrudan Arduino pinlerine bağlama. Motorlar yüksek akım çeker ve pini yakabilir. Her zaman bir motor sürücü (örneğin L298N) kullan.
- Motorlara ayrı bir güç kaynağı ver (pil paketi). Arduino'yu USB veya kendi pilinden besle; motor pilini sürücünün motor girişine bağla.
- Yalnız düşük gerilimli pil paketleri kullan. Şebeke (priz) elektriği kullanılmaz.
- Motor sürücü ısınabilir; çalışırken metal kısmına dokunma.
- İlk denemeyi robot havada, tekerler yere değmezken yap. Böyle beklenmedik hareket kimseyi düşürmez.
- Bu proje bir yetişkin gözetiminde kurulmalı ve test edilmelidir. Kablo bağlantılarını güç vermeden önce iki kez kontrol et.
Ders özeti
- Çizgi izleyen robot, iki kızılötesi sensörle çizginin nerede olduğunu ölçer.
- İki motoru farklı hızlarda çalıştırarak yön verir: bir motor yavaşlarsa o tarafa döner.
- Mantık dört duruma dayanır: düz, sola dön, sağa dön, kavşak.
- Motorlar motor sürücü ve ayrı güç kaynağı ister; asla Arduino pininden sürülmez.
- "Robot düz gitmiyor" sorununun sık nedeni motor hız farkıdır; trim ile dengelenir.
Kontrol soruları
- İki sensör de beyaz görürken robot ne yapmalı?
- Siyah çizgi sol sensörün altındaysa robot hangi yöne kaymıştır ve ne yapmalı?
analogWrite(ENA, 0)ne anlama gelir?- Motorları neden doğrudan Arduino pinine bağlamayız?
- Robot sürekli sağa kayıyorsa (çizgide değilken bile) muhtemel neden ve çözüm nedir?
Cevaplar
- Düz gitmeli; çizgi tam ortadadır, iki motor da eşit hızda ileri çalışır.
- Robot sağa kaymıştır (çizgi soldan görünür oldu) ve sola dönmelidir; sol motoru yavaşlatır.
- Sol motorun hızını 0 yapar, yani sol motoru durdurur.
- Motorlar yüksek akım çeker; pin bu akımı veremez ve zarar görür. Bu yüzden motor sürücü ve ayrı güç kaynağı gerekir.
- Muhtemelen sol motor sağ motordan hızlıdır. Çözüm, motor hızlarını trim ile dengelemek (yavaş motora biraz fazla güç vermek).
Kaynak ve doğrulama notu
“Proje: Çizgi İzleyen Robotun Mantığı” dersi için doğrulama odağı Robot çizgiyi nasıl "görür"? ile İki sensör, iki göz gibi arasındaki ilişkinin örnekler üzerinde tutarlı çalışmasıdır. Arduino uyumlu kartlarda pin, gerilim ve akım sınırları modele göre değişebilir. Kod derlense bile devre güvenli olmayabileceğinden, motor ve servo gibi yükler uygun sürücü ve harici besleme ile kullanılmalıdır.
Sonraki ders
Proje: Mini Otomatik Sulama Prototipi