Öğrenci bilgisayarın başında robot USB kablosuyla bağlıyken son testlerini yapar. Öğrenci büyük bir heyecanla söyler: Hocam bitti, mükemmel çalışıyor, piste alalım!
USB kablosu çekilir, robot piste konur, enerji verilir ve... Az önce kararlı çalışan robot gitmez, yavaşlar, virajları kaçırır veya şaşkın tepkiler verir.
İlk tepki genelde şudur: Hocam az önce çalışıyordu, kesin pilde sorun var! Halbuki sorun çoğunlukla pilde değildir. Kodun içinde unutulan gizli bir kod vardır.
Sorun: Kendi kendine konuşan robot
Hata ayıklamak (debug) için Serial.print() hayat kurtarır. Sensör kaç okuyor, döngü buraya girdi mi diye anlamak için Arduino'dan bilgisayar ekranına (Seri Port) veri göndeririz.
Ama USB kablosunu çektiğinizde robotun beyni bu verileri göndermeyi bırakmaz. Bilgisayarın artık dinlemediğini fark etmez. Sensörden okuduğu her değeri saniyede yüzlerce kez boşluğa doğru yazmaya devam eder.
Zaman tuzağı: İşlemci neden yavaşlar?
Arduino, seri porta yazmak için gerçek zaman harcar. Hele loop() içinde çok sayıda Serial.print() varsa durum daha kötü olur.
İşlemci motorlara ve engellere odaklanmak yerine boşluğa yazı yazmakla meşgul olur. Döngü yavaşlar, robotun refleksleri zayıflar. Çizgiyi görür ama dönme emrini verene kadar yoldan çıkmış olur.
Atölye notu: USB ile çalışırken hızlı görünen kod, pil ile çalışırken aynı hızı vermeyebilir. Sebep bazen pil voltajı, bazen de unutulmuş Serial çıktısıdır.
Püf noktası: İki pratik çözüm
1) Çırak yöntemi (sil veya yorum satırı)
Yarışma veya saha testinden önce tüm Serial.print() / Serial.println() satırlarının başına // koyun. Kesin çözümdür. Sonra tekrar değer okumak isterseniz ilgili satırları açmanız gerekir.
// Serial.println(sensorDegeri); // pistte kapalı
2) Bilişimci yöntemi (test modu şalteri)
Kodun en tepesine bir anahtar koyun:
int testModu = 1; // 1 = yazdır, 0 = yazdırma
Yazdırma satırlarını bu şarta bağlayın:
if (testModu == 1) {
Serial.println(sensorDegeri);
}
Atölyede bilgisayar başındayken testModu = 1 kalsın. Piste çıkmadan önce testModu = 0 yapıp kodu son kez yükleyin. Tek bir rakamı değiştirerek veri yükünü kaldırmış olursunuz.
Robota pistte kendi kendine konuşmayı bıraktırın ki dikkatini yola verebilsin. Temiz kod, hızlı robottur.
Kontrol listesi: USB çekildi mi? Serial satırları kapalı mı / testModu 0 mı? Ortak GND ve harici motor gücü doğru mu?