MODÜL 06 DERS 1 / 5 · 60 DK

İlk yazdırma: robotun sana konuşsun

Şimdiye kadar robotuna hep sen komut verdin: çubuğu it, tuşa bas, motor dönsün. Konuşma hep tek yönlüydü. Peki robot sana bir şey söylemek istese? Kodun içinde şu an bir sürü sayı akıyor; çubuğun değeri, motorun hızı, kaçıncı tur olduğu. Ama bunların hiçbirini göremiyorsun; hepsi ESP32'nin içinde, gözden uzakta koşuyor. Bu derste robotuna ilk kez bir ağız vereceksin. Driver Station ekranına yazı yazdırıp, robotun kafasının içinde ne döndüğünü kendi gözünle göreceksin. Bir tek satırla başlayacağız, dersin sonunda robotun sana adıyla merhaba diyecek ve kaçıncı turda olduğunu sayacak.

Kanca: robot şu an ne düşünüyor? (10 dk)

🎬 VİDEO · kanca · 45 sn · robot sürülürken Driver Station'ın boş sağ paneline yakınlaşılıyor; panel boş, sonra "ileri: 0.72" gibi canlı bir satır belirip çubukla birlikte değişiyor. Soru: "Robot şu an ne düşünüyor?"

Videonun başında sürücü robotu itiyor, robot gidiyor, ama ekranın sağ paneli bomboş. Robot çalışıyor, bir şeyler hesaplıyor, ama sana hiçbir şey söylemiyor. Sonra o panelde bir satır beliriyor ve çubuğu oynattıkça sayı değişiyor. İşte robot ilk kez konuştu.

Sınıfa sor, cevabı hemen verme, önce tahmin etsinler:

Kesin cevabı şimdi yok. Ama şunu aklında tut: bir makinenin içinde ne olduğunu göremiyorsan, onu tamir edemezsin, geliştiremezsin, hatta güvenle kullanamazsın. Bu derste robotuna, içindeki sayıları ekrana taşıyan o pencereyi açacaksın.

Ana etkinlik: ilk mesajı yazdır (20 dk)

Sıfırdan kod yazmıyorsun. Elinde M02'den kalan, çalışan sürüş kodun var. Ona tek bir satır ekleyerek robotu konuşturacağız.

Robotu konuşturan komut şu: probot::print("..."). Tırnakların arasına ne yazarsan, o yazı Driver Station'ın sağ paneline çıkar. Bu paneldeki yazıya telemetri diyoruz; adını birazdan koyacağız, önce çalışırken görelim.

teleopLoop'un içine, sürüş satırlarının hemen altına şu satırı ekle:

probot::print("Merhaba! Robot calisiyor.");

İşte eklenmiş hali (sürüş satırlarına hiç dokunmadık, aynen duruyorlar):

void teleopLoop() {
  auto js = probot::io::joystick_api::makeDefault();
  float ileri = js.getLeftY();
  float donus = js.getRightX();
  surMotor(SOL_RPWM, SOL_LPWM, ileri + donus);
  surMotor(SAG_RPWM, SAG_LPWM, ileri - donus);

  probot::print("Merhaba! Robot calisiyor.");   // YENI: ekrana yaz

  delay(20);
}

Kodu yükle. Robotu yükseltiye koy, tekerlekler serbest dönsün. Bağlantı akışı her zamanki gibi: telefonu robotun WiFi ağına bağla, tarayıcıda http://192.168.4.1 adresini aç, Driver Station çıkınca kumandayı telefona bağlayıp bir tuşuna bas, sonra Init ve Start.

📷 Görsel alanı · Driver Station ekranı; sağ panelde "Merhaba! Robot calisiyor." satırı; sol tarafta kumanda göstergesi

Start'a bastığın an sağ panelde mesajın belirir. Tebrikler, robotun ilk kez sana bir şey söyledi.

Şimdi kasıtlı bir hata yapıp ne olduğunu göreceğiz. teleopLoop saniyede yaklaşık elli kez baştan çalışır. Yani senin o tek print satırın da saniyede elli kez çalışıyor. Panel neden yüzlerce satırla dolup taşmıyor? Çünkü Driver Station her turda paneli senin için siliyor... şimdilik. Bu silme işini bilerek kapatıp ne olduğunu görelim.

print satırının hemen üstüne şu satırı ekle, sonra tekrar yükle:

probot::clearTelemetry();                       // her turda once ekrani temizle
probot::print("Merhaba! Robot calisiyor.");

Dur, bu satır ekranı temizliyor, o zaman mesaj kaybolmalı değil mi? Hayır. Sıra önemli: önce temizliyor, hemen sonra tekrar yazıyor. Göz bunu bir kırpışta yakalayamaz; sen tek, sabit bir satır görürsün. Şimdi asıl deneyi yapalım.

Dene ve gör: temizlemezsen ne olur?

clearTelemetry satırını sil (ya da başına // koyup yorum yap). Yükle ve Driver Station'a bak.

📷 Görsel alanı · Driver Station sağ paneli aynı satırla alt alta yüzlerce kez dolmuş, kayıp giden, okunamaz bir ekran

Panel bir anda aynı satırla dolup taşar; yazı o kadar hızlı akar ki okuyamazsın bile. Çünkü her turda yeni bir "Merhaba" satırı ekleniyor, eskisi silinmiyor; saniyede elli tane birikiyor. Telemetri panelinin hafızası küçüktür, bu sel onu boğar.

Şimdi clearTelemetry satırını geri koy, yükle. Panel yine tek, sakin bir satıra döner.

İşte bu dersin altın kuralı, yaz bir kenara:

Her turda önce clearTelemetry(), sonra yazdır. Temizlemezsen ekran birikir ve okunamaz. Temizlik ve yazma hep birlikte gider.

Kavram köprüsü: telemetri, robotun uçuş verisi (7 dk)

Az önce yaptığın şeyin bir adı var. Ekrana canlı bilgi göndermeye telemetri denir. Kelime "uzaktan" ve "ölçüm" anlamındaki iki parçadan gelir: uzaktaki bir makinenin içindeki değerleri, sen yanında olmadan okuman.

En bilinen örneği uçaktır. Pilot, motorların içine elini sokup sıcaklığı ölçmez; kokpitteki ekranlarda uçuş verisi akar: hız, yükseklik, yakıt, motor devri. Bir uçak kazasından sonra aranan "kara kutu" da işte bu telemetri kaydıdır; makinenin son anlarında içinde ne olduğunu anlatır. Roketlerin, yarış arabalarının, kalp cihazlarının hepsinde aynı fikir vardır: makine içinde olup biteni dışarıya, insana anlatır.

Senin robotun da artık bunu yapıyor. probot::print senin telemetri kanalın; Driver Station'ın sağ paneli de senin kokpit ekranın. Buraya ne koyarsan, robotun kafasının içini o kadar görürsün. Bir sonraki derste buraya sayılar koyup çubuğun tam olarak hangi değere döndüğünü izleyeceksin; bu derste ise önce kendi mesajlarını yazmayı ustalaşacaksın.

Neden bu kadar önemli? Çünkü göremediğin bir şeyi düzeltemezsin. Robot yanlış davrandığında, telemetri sana "içeride ne oluyor" diye bakma imkânı verir. Kör tahmin yerine kanıtla ilerlersin. Buna sonraki derslerde çok ihtiyacın olacak.

Uygulama: kendi karşılama mesajın ve tur sayacın (15 dk)

Sıra sende. Robotu kendi sesiyle konuştur. Her değişiklikten sonra kodu yeniden yükle ve ekranı gözle.

1. Kendi karşılama mesajın. Tırnakların arasındaki yazıyı değiştir. Robotuna bir isim ver, ekrandan seni selamlasın:

probot::clearTelemetry();
probot::print("Ben Simsek. Surmeye hazirim!");

İstediğini yaz. Sadece Türkçe karakterlerden (ç, ş, ğ, ı, ö, ü) uzak dur; bazı ekranlar bunları tuhaf gösterebilir, o yüzden "Simsek", "hazirim" gibi yaz.

2. İki satır yazdır. Tek mesajla sınırlı değilsin. println komutu, yazdıktan sonra alt satıra geçer; böylece ekrana iki ayrı satır koyabilirsin:

probot::clearTelemetry();
probot::println("Ben Simsek.");
probot::println("Surmeye hazirim!");

Yükle ve iki satırın alt alta çıktığını gör. print ile println arasındaki tek fark bu: println bir sonraki yazıyı alta iter, print yan yana bırakır.

3. Tur sayacı ekle: kaçıncı tur? Şimdi robotun sana yeni bir şey söylesin: teleopLoop kaç kez çalıştı? Bunun için bir değişken lazım; sayıyı hafızada tutan bir kutu. Kutuyu turlar arasında yaşasın diye teleopLoop'un dışına, en üste koyuyoruz. İçine koyarsak her turda sıfırlanır.

Kodun en üstüne, pin tanımlarının yanına ekle:

int sayac = 0;   // kacinci tur oldugumuzu sayar

Sonra teleopLoop içindeki yazdırma bölümünü şöyle yap. Bir sayıyı ekrana koymak için düz yazıdan biraz farklı bir komut kullanıyoruz: printf. Ona bir yazı kalıbı verirsin; kalıptaki %d işaretinin yerine tam sayıyı yerleştirir, sonundaki \n de bir alt satıra geçer.

sayac = sayac + 1;                 // her turda bir artir
probot::clearTelemetry();
probot::printf("Tur numarasi: %d\n", sayac);   // %d: tam sayiyi ekrana yaz

Yükle ve ekrana bak.

📷 Görsel alanı · Driver Station paneli; "Tur numarasi:" satırı ve yanında hızla artan bir sayı

Sayı deli gibi artar, değil mi? Saniyede yaklaşık elli birden büyür. Şaşırma; bu tam da az önce öğrendiğin şeyin kanıtı: teleopLoop gerçekten saniyede elli kez çalışıyor. Sayacın senin gözünle görebildiğin ilk kanıtı bu. sayac = sayac + 1 satırı "eski değeri al, bir ekle, geri koy" demektir; kutu her turda bir dolar.

Bir dene: clearTelemetry satırını yine sil ve sayaç ekranını izle. Şimdi hem birikme selini, hem de her satırdaki farklı sayıyı bir arada görürsün; kuralın neden var olduğu iyice belli olur. Sonra geri koy.

Pekiştirme ve değerlendirme (6 dk)

Kısa öz-kontrol. Kodu kapat, kağıda ya da sözlü cevapla:

Günlük hayat bağı: arabanın gösterge paneli tam bir telemetri ekranıdır. Hız, motor sıcaklığı, yakıt, devir; hepsi motorun içinden alınıp senin görebileceğin bir yere taşınır. Sürücü motoru açıp bakmaz; panele bakar. Yakıt lambası yanınca ne yapacağını bilir. Senin robotunun sağ paneli de aynı işi görüyor: içerideki bilgiyi dışarı, sana taşıyor. İyi bir mühendis, önce makinesini kendine konuşturur.

Erken bitirene ek görev: gizli sürüş göstergesi (opsiyonel)

Robotun şu an "kaçıncı tur" diyor. Ama asıl merak ettiğin şey belki de çubuğun ne yaptığı. Telemetriye çubuğun canlı değerini koy.

Bir sayıyı ekrana koymak için printf kalıbını kullan; %.2f işareti ondalık bir sayıyı iki basamakla gösterir. Yazdırma bölümünü şöyle dene:

probot::clearTelemetry();
probot::printf("ileri: %.2f\n", ileri);
probot::printf("donus: %.2f\n", donus);

Yükle, çubukları oynat ve sayıların canlı değiştiğini gör. Sol çubuğu tam ileri it: ileri değeri 1'e yaklaşır. Bırak: 0'a döner. İşte robotun kafasının içindeki gerçek sayılar, gözünün önünde.

Şimdi dikkatli gözlem: çubuğu tam bıraktığında ileri değeri tam 0 mı oluyor, yoksa 0.03 gibi minik bir kuyruk mu kalıyor? Not al. Bir arkadaşınla tartış: robot dururken çubuk değeri neden tam sıfır olmayabilir, ve bu robotun davranışını nasıl etkiler? Bu sorunun cevabına bu modülün ileri derslerinde döneceğiz; şimdilik telemetri sana onu görme gücü verdi bile.