Robotik kodlamaya yeni başlayan herkesin yolu o kolay komuttan geçer: delay(1000). Mantığı basit: 1 saniye bekle. Ama proje büyüdükçe robot garip davranmaya başlar. Butona basarsınız algılamaz, önüne engel çıkar durmaz, çizgi izlerken yoldan çıkar.
Suçluyu sensörde veya pilde aramayın. Çoğu zaman sorun, robotu narkoz verilmiş gibi uyutan delay() komutudur.
1) delay beyni dondurur
Arduino delay gördüğü an o süre boyunca başka iş yapmaz. Örnek: ışığı yak, 2 saniye bekle, sonra sola dön. O 2 saniye boyunca robot:
- Önündeki duvarı göremez (ultrasonik okunmaz)
- Acil durdurma butonunu duyamaz
- Çizgiden çıktığını fark edemez
delay bir mola değil; kısa süreli bir felç halidir. Süre bitene kadar robot kör, sağır ve dilsizdir.
2) Yumurta haşlama
delay yöntemi: Yumurtayı suya koyarsınız ve 5 dakika ocağın başında kıpırdamadan beklersiniz. Telefon çalsa bakmazsınız, kapı çalsa açmazsınız.
millis yöntemi: Yumurtayı koyarsınız, saate bakarsınız: 14:00 koydum, 14:05 alırım. Sonra masayı hazırlarsınız, ekmek doğrarsınız, ara ara saate bakarsınız. Vakit gelmediyse işinize devam edersiniz.
Profesyonel robotçular robotu ocak başında bekletmez; ona saati kontrol etme yeteneği verir.
3) Aynı anda birden fazla iş (millis)
Hem LED yakıp söndürmek hem çizgi izlemek istiyorsanız delay kullanamazsınız. LED için beklerken motorları süremezsiniz.
Çözüm: Arduino nun kol saati olan millis(). Mantık: Çizgi izlemeye devam et, motorları sür. Ama gözün saatte olsun. Son ışıktan bu yana 1000 ms geçtiyse LED i değiştir; sakın durma, yoluna devam et.
unsigned long sonZaman = 0;
int ledDurum = LOW;
void loop() {
// her turda sensor / motor isleri
cizgiIzle();
// LED i beklemeden yak-sondur
if (millis() - sonZaman >= 1000) {
sonZaman = millis();
ledDurum = !ledDurum;
digitalWrite(LED_BUILTIN, ledDurum);
}
}
Atölye notu:
delaytamamen yasak değildir.setup()içinde kısa bir bekleme veya yarışta kullanılmayan tek seferlik işlerde kabul edilebilir. Amaloop()içinde sensör + motor varsa delay tuzağa düşürür.
Robotunuz geç tepki veriyorsa önce koddaki delay satırlarına bakın. Robotu uyutmayın; ona zamanı yönetmeyi öğretin. Gerçek dünyada hayat durmaz; robotunuz da loop içinde durmamalı.