Kendi göstergen: hız çarpanını ekrana koy
Bu modülde robotunun içine baktın: joystick çubuğunun verdiği sayıları, deadzone'u, motorun ne aldığını ekrandan izledin. Ama şimdiye kadar ekrana koyduğun her şey hazırdı; kütüphanenin sana verdiği değerlerdi. Bu derste ilk kez kendi değişkenini oluşturacaksın: hızı ayarlayan bir çarpan. Onu ekrana koyacak, bir tuşla değiştireceksin ve dersin sonunda robotuna gerçek bir yarış aracı gibi üç değerli bir gösterge paneli (kokpit) kuracaksın.
Önkoşul: Bu ders MODÜL 06'nın parçası ve MODÜL 02'de kurduğun süren robota dayanır. Sürüş kodun çalışıyor ve telemetri ekranını daha önce açtıysan hazırsın.
Kanca: yavaş modu nereden geliyor? (10 dk)
Videodaki robota dikkat et. Aynı çubuğu aynı kadar itiyor ama robot bazen hızlı, bazen yavaş gidiyor. Sürücü çubuğu değiştirmiyor; bir tuşa basıyor. Ve ekrandaki yazı da anında değişiyor: NORMAL, YAVAŞ, yine NORMAL.
Sınıfa sor, önce tahmin etsinler:
- Çubuk hâlâ aynı sayıyı veriyorsa, robotu yavaşlatan şey ne olabilir? O "yarım hız" sayısı nereden geliyor?
- Ekrandaki "YAVAŞ" ve "NORMAL" yazıları çubuğun bir yerinden mi okunuyor, yoksa birisi bu yazıları oraya koydu mu?
Kesin cevabı şimdi vermiyoruz. Ama küçük bir sır: robotu yavaşlatan sayı da, ekrandaki yazı da bu sefer kütüphaneden gelmiyor. İkisini de birazdan sen yazacaksın. Şimdiye kadar hep hazır değerleri izledin; bu ders senin kendi değerini kurduğun ders.
Ana etkinlik: hız çarpanı değişkeni kur (20 dk)
Bir yarış arabasında pit yolunda yavaş, pistte hızlı gidilir. Biz de robota iki mod vereceğiz: normal ve yavaş. İşin sırrı tek bir sayıda: hız çarpanı.
Fikir şu. Sürüş kodunda motorlara ileri + donus gibi bir değer gönderiyorsun. Bu değeri bir sayıyla çarparsan ne olur? 1.0 ile çarparsan hiçbir şey değişmez, robot tam hızda gider. 0.5 ile çarparsan her şey yarıya iner, robot yarı hızda gider. İşte bu çarpan bizim yeni değişkenimiz: hizCarpani.
Sıfırdan yazmıyorsun. M02 sürüş kodun elinde. Ona üç iş yaptıracağız: bir değişken oluştur, sürüş satırlarına çarpan olarak ekle, sonra ekrana yaz. Önce tahmin et: RB tuşuna basılıyken hizCarpani 0.5 olursa robot ne yapar? Sonra kodu yükle ve gör.
#define PROBOT_WIFI_AP_SSID "RobotAdi"
#define PROBOT_WIFI_AP_PASSWORD "sifre1234"
#define PROBOT_WIFI_AP_CHANNEL 1
#include <probot.h>
const int SOL_RPWM = 16, SOL_LPWM = 17; // sol surus motoru
const int SAG_RPWM = 18, SAG_LPWM = 19; // sag surus motoru
// hazir yardimci: motoru hizina gore surer (-1 geri, 0 dur, +1 ileri)
void surMotor(int rpwm, int lpwm, float hiz) {
hiz = constrain(hiz, -1.0f, 1.0f);
if (hiz > 0) { analogWrite(rpwm, (int)(hiz * 255)); analogWrite(lpwm, 0); }
else { analogWrite(rpwm, 0); analogWrite(lpwm, (int)(-hiz * 255)); }
}
void robotInit() {
pinMode(SOL_RPWM, OUTPUT); pinMode(SOL_LPWM, OUTPUT);
pinMode(SAG_RPWM, OUTPUT); pinMode(SAG_LPWM, OUTPUT);
}
void robotEnd() {
surMotor(SOL_RPWM, SOL_LPWM, 0); surMotor(SAG_RPWM, SAG_LPWM, 0);
}
void teleopInit() {}
void teleopLoop() {
auto js = probot::io::joystick_api::makeDefault();
float ileri = js.getLeftY();
float donus = js.getRightX();
// YENI 1: kendi degiskenin. Once normal hiz.
float hizCarpani = 1.0f;
if (js.getRB()) hizCarpani = 0.5f; // RB basiliyken yavas moda gec
// YENI 2: surus degerlerini carpanla carp
surMotor(SOL_RPWM, SOL_LPWM, (ileri + donus) * hizCarpani);
surMotor(SAG_RPWM, SAG_LPWM, (ileri - donus) * hizCarpani);
// YENI 3: kokpiti ekrana yaz
probot::clearTelemetry();
if (js.getRB()) probot::println("MOD: YAVAS");
else probot::println("MOD: NORMAL");
delay(20);
}
void autonomousInit() {}
void autonomousLoop() { delay(20); }
Kodu yükle. Robotu yükseltiye koy, tekerlekler serbest dönsün. Bağlantı 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ı bağlayıp bir tuşuna bas, sonra Init ve Start. Çubukla normal sür, ekranda "MOD: NORMAL" yazsın. Şimdi RB tuşuna bas ve basılı tut: ekran anında "MOD: YAVAS" olur ve robot yarı hızda döner. Bırak: yine hızlanır. Aynı çubuk, iki farklı hız. Farkı yaratan tek sayı senin hizCarpani değişkenin.
Kavram köprüsü: senin değişkenin (7 dk)
Az önce kendi değişkenini kurdun. Şimdi ne yaptığını adlandıralım.
Değişken, isim verdiğin bir kutudur. İçine bir sayı koyarsın (float hizCarpani = 1.0f;), sonra o ismi her kullandığında kutunun içindeki değeri kullanırsın. Joystick değerleri de değişkendi ama onları kütüphane dolduruyordu; sen yalnız okuyordun. hizCarpani senin değişkenin: değerini sen seçtin, ne zaman değişeceğine sen karar verdin. Fark tam olarak bu; hazır bir değeri izlemekten kendi değerini yönetmeye geçtin.
Çarpan, bir sayıyı ölçekler. 1.0 ile çarpmak hiçbir şeyi değiştirmez (aynısı kalır). 0.5 ile çarpmak her şeyi yarıya indirir. ileri + donus çubuktan geliyor; sen ona dokunmadın. Ama sonucu hizCarpani ile çarpınca robotun tüm hareketi aynı oranda küçülüyor; ileri de, dönüş de. Tek bir sayıyla robotun bütün davranışını ayarladın.
Mod, bir durumun adıdır. RB basılıysa robot "yavaş durumda", değilse "normal durumda". Ekrandaki yazı bu durumun adını gösteriyor. Kod içinde durumu if (js.getRB()) ile okuyorsun; hem hızı hem de ekrana yazılan adı aynı koşul belirliyor. Bu yüzden ikisi her zaman uyumlu: robot yavaşladığında ekran da "YAVAS" der.
Uygulama: kokpiti tamamla (15 dk)
Şu an ekranda tek satır var: mod. Gerçek bir yarış aracının kokpitinde birden fazla gösterge olur. Robotuna üç değerli bir kokpit kuracaksın: mod, ileri, dönüş. Böylece sürerken robotun içinde ne olduğunu tek bakışta göreceksin.
teleopLoop içindeki kokpit bölümünü şöyle genişlet. clearTelemetry ilk satırda kalsın; her tur önce ekranı temizliyoruz ki değerler birikmesin:
// kokpit: uc deger
probot::clearTelemetry();
if (js.getRB()) probot::println("MOD: YAVAS");
else probot::println("MOD: NORMAL");
probot::printf("ileri: %.2f\n", ileri); // %.2f: iki basamak ondalik
probot::printf("donus: %.2f\n", donus);
Kodu yükle ve sür. Sağ panelde üç satır göreceksin: üstte mod, altında çubuğun ileri ve dönüş değerleri, iki basamaklı ondalık olarak. Çubuğu it, sayıların anlık değiştiğini izle. RB'ye bas, modun değiştiğini gör. Artık robotunun bir gösterge paneli var.
Şimdi kendine göre ayarla, her değişiklikten sonra yeniden yükle:
- Yavaş modu ayarla.
hizCarpani = 0.5fsatırındaki0.5fdeğerini değiştir.0.3fyaparsan yavaş mod daha da yavaş, hassas iş için ideal olur.0.7fyaparsan aradaki fark azalır. Senin robotun için "yavaş"ın doğru değeri kaç? Deneyerek bul. %.2fyerine%.1fdene.ilerisatırında%.2fyerine%.1fyaz. Ekranda kaç basamak ondalık göründüğünü karşılaştır. Hangisi okumak için daha rahat, hangisi daha ayrıntılı?- Bir satır daha ekle. Kokpite
hizCarpani'nin kendi değerini de yazdır:probot::printf("carpan: %.2f\n", hizCarpani);. Artık RB'ye bastığında ekranda hem "YAVAS" yazısını hem de çarpanın 1.00'den 0.50'ye düştüğünü aynı anda görürsün. Yazı ile sayı birbirini doğrular.
Pekiştirme ve değerlendirme (6 dk)
Kısa öz-kontrol. Kodu kapat, sözlü ya da kağıda cevapla:
hizCarpaniile joystick'inilerideğeri arasında ne fark var? Hangisini sen oluşturdun, hangisini kütüphane veriyor?- Bir sayıyı
1.0ile çarparsan ne olur?0.5ile çarparsan? Robotun hızıyla bağ kur. - Ekrandaki "MOD: YAVAS" yazısı ile robotun gerçekten yavaşlaması neden her zaman uyumlu? Aynı koşulun iki işi ne?
- Her turda kokpiti yazmadan önce hangi satır çalışıyor, neden gerekli?
Günlük hayat bağı: birçok arabada "eco" ve "spor" modu vardır. Gaz pedalına aynı basarsın ama araç farklı tepki verir; çünkü arkada bir çarpan değişir. Panelde de o an hangi modda olduğun yazar. Senin yazdığın hizCarpani ve kokpit, tam olarak o mantık: tek bir sayı davranışı ölçekliyor, ekran da hangi durumda olduğunu söylüyor.
Erken bitirene ek görev: üç modlu vites (opsiyonel)
Şu an iki modun var: normal ve yavaş. Bir de turbo modu ekle. Fikir: LB basılıysa çarpan yükselsin ama normal sürüşte robot tam hıza gitmesin ki turbo bir işe yarasın.
Bunu bir if / else if zinciriyle kur. Sıralama önemlidir; zincirde ilk doğru olan çalışır:
float hizCarpani = 0.7f; // normal: biraz kisik
if (js.getRB()) hizCarpani = 0.4f; // yavas
else if (js.getLB()) hizCarpani = 1.0f; // turbo: tam hiz
Kokpitteki mod yazısını da üç duruma çıkar: RB için "YAVAS", LB için "TURBO", ikisi de basılı değilse "NORMAL". Yükle ve dene: LB ile fırla, RB ile sürün, ikisini de bırakınca ortada kal.
Meydan okuma: RB ile LB'ye aynı anda basarsan robot hangi moda girer? Neden? Zincirdeki sırayı değiştirip cevabın nasıl değiştiğini gözle. Bir arkadaşınla tartış: sürücüye üç mod vermek her zaman daha mı iyi, yoksa bazen fazla seçenek kafa mı karıştırır?