Robotunuz Uyuyor mu? delay() Tuzağından Kurtuluş
Robotik kodlamaya yeni başlayan herkesin yolu, o meşhur ve kolay komuttan geçer: delay(1000); Yazması kolaydır, mantığı basittir: "1 saniye bekle."
Ancak projeleriniz büyüdükçe, robotunuzun garip davranmaya başladığını fark edersiniz. Butona basarsınız algılamaz, önüne engel çıkar durmaz, çizgi izlerken yoldan çıkar.
Peki suç kimde? Sensörde mi, pilde mi? Hayır. Suç, robotunuzu uyutan delay() komutunda.
Arduino (veya herhangi bir kart) delay komutunu gördüğü an, dünya ile iletişimini keser. Örneğin; robotunuza "Işığını yak, 2 saniye bekle, sonra sola dön" dediniz. O 2 saniye boyunca robotunuz;
- Önüne çıkan duvarı göremez (Ultrasonik sensör kör olur).
- Çizgiden çıktığını fark edemez.
Çünkü delay, bir bekleme değil, bir "felç" halidir. Robot o süre bitene kadar kör, sağır ve dilsizdir.
Konuyu daha iyi anlamak için; Diyelim ki mutfaktasınız ve yumurta haşlıyorsunuz. Yumurtanın pişmesi için 5 dakika lazım. Yumurtayı suya koyarsınız ve 5 dakika boyunca ocağın başında, gözünüzü tencereden ayırmadan, kıpırdamadan beklersiniz. Telefon çalsa bakmazsınız, kapı çalsa açmazsınız. Sadece beklersiniz. Bu yöntem baktığımızda ne kadar da verimsiz değil mi? Bir de yumurtayı suya koyarsınız ve saatinize bakarsınız: "Saat 14:00. Demek ki 14:05'te alacağım." Sonra gidip masayı hazırlarsınız, ekmek doğrarsınız, arada bir saatinize bakarsınız. "Vakit geldi mi? Hayır." İşinize devam edersiniz. Bu şekilde hem saati kontrol edersiniz hem de bu arada bir çok iş yaparsınız. İşte profesyonel robotikçiler, robotu ocak başında bekletmez; ona "saati kontrol etme" yeteneği verir.
Peki nasıl olacak? Bir robotun aynı anda hem led yakıp söndürmesini hem de çizgi izlemesini istiyorsanız, delay kullanamazsınız. Çünkü led için beklediği sürede motorları kontrol edemez. Bunun yerine millis() fonksiyonunu (Arduino'nun kol saati) kullanırız. Mantık şudur: "Ey Robot! Sen çizgi izlemeye devam et, motorları sür. Ama bir gözün de saatte olsun. Eğer son ışıktan bu yana 1 saniye geçtiyse ışığı yak, ama sakın durma, yoluna devam et!" İşte bu nedenle delay komutu yerine millis komutunu kullanmayı öğrenmeliyiz.
Eğer robotunuzun tepkileri yavaşsa, komutlarınızı geç algılıyorsa, kodlarınızın içindeki delay komutlarını temizleme vakti gelmiştir. Robotunuzu uyutmayın; ona zamanı yönetmeyi öğretin. Gerçek dünyada hayat durmaz, robotunuz da durmamalı!