MODÜL 04 DERS 3 / 5 · 60 DK

Yazılım: butonla mekanizmayı çalıştır

Diferansiyel modülde robotuna gitmeyi öğrettin: sol çubukla ileri-geri, sağ çubukla dönüş. İki motor, iki satır formül. Ama bir robot yalnız gezmek için yapılmaz; bir yapması beklenir. Bu modülde robotuna üçüncü bir motor ve onu çeviren bir dişli mekanizması taktın. Şimdi soru şu: kumandadaki bir tuşa basınca o mekanizmayı nasıl döndürürsün, bıraktığın anda nasıl durdurursun? Bu derste sürüş koduna sadece birkaç parça ekleyerek robotuna ilk kez bir görev yaptıracaksın.

Kanca: parmağını tuşta tut (10 dk)

🎬 VİDEO · kanca · 45 sn · robot ilerliyor, sürücü sağ omuz tuşunu basılı tutunca üstteki dişli mekanizması dönüyor, bırakınca anında duruyor; dişliler ve basılı parmak yakın çekimle

Videoda sürücünün parmağına dikkat et. Mekanizma yalnızca tuş basılıyken dönüyor. Parmak kalktığı an duruyor. Bu, ışık düğmesi gibi bir aç-kapa değil; daha çok bir kapı ziline benziyor: basarsan çalar, bırakırsan susar.

Sınıfa sor, önce tahmin etsinler:

Kesin cevabı şimdi vermiyoruz. Elin kodun başına geçince ikisini de kendin göreceksin. Aklında şunu tut: mekanizmayı basılı tuttukça döndürmek bir güvenlik tercihidir. Sürücü paniklerse yapması gereken tek şey elini çekmek; mekanizma anında durur.

Ana etkinlik: sürüş koduna mekanizmayı ekle (20 dk)

Sıfırdan kod yazmayacaksın. Elinde M02'den kalan, çalışan bir sürüş kodun var. Ona dört yeni parça ekleyeceğiz, o kadar. Sürüş satırlarına hiç dokunmuyoruz; onlar aynen yerinde kalıyor.

Eklediğimiz dört parça şunlar:

  1. Üçüncü motorun pin tanımı. Sürüş motorların 16-19 pinlerini doldurdu. Mekanizma motoru 21 ve 22 pinlerine bağlı, bu yüzden ona yeni bir isim çifti veriyoruz.
  2. Kurulumda pinMode. Yeni iki pini de çıkış olarak ayarlıyoruz; tıpkı diğer motor pinleri gibi.
  3. teleopLoop içinde kontrol bloğu. İşin kalbi burada: RB tuşu basılıysa ileri sar, LB basılıysa geri sar, hiçbiri basılı değilse dur.
  4. robotEnd içinde güvenli durdurma. Robot durdurulunca mekanizma motoru da mutlaka sussun.
🎬 VİDEO · ekran-kaydi · 180 sn · kod editöründe M02 sürüş kodu açık; dört yeni parça sırayla ekleniyor, her eklemeden sonra kod yüklenip mekanizmanın tuşla dönüşü gösteriliyor

İşte dört parça eklenmiş hali. Yeni satırların yanına yorum koydum; gerisi tanıdığın M02 kodu:

#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
const int MEK_RPWM = 21, MEK_LPWM = 22;   // YENI 1: mekanizma 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);
  pinMode(MEK_RPWM, OUTPUT); pinMode(MEK_LPWM, OUTPUT);   // YENI 2
}
void robotEnd() {
  surMotor(SOL_RPWM, SOL_LPWM, 0); surMotor(SAG_RPWM, SAG_LPWM, 0);
  surMotor(MEK_RPWM, MEK_LPWM, 0);                        // YENI 4: mekanizmayi da durdur
}
void teleopInit() {}
void teleopLoop() {
  auto js = probot::io::joystick_api::makeDefault();

  // surus: M02'den aynen kaldi
  float ileri = js.getLeftY();
  float donus = js.getRightX();
  surMotor(SOL_RPWM, SOL_LPWM, ileri + donus);
  surMotor(SAG_RPWM, SAG_LPWM, ileri - donus);

  // YENI 3: mekanizma kontrolu
  if (js.getRB())      surMotor(MEK_RPWM, MEK_LPWM, 0.6f);   // basiliyken ileri sar
  else if (js.getLB()) surMotor(MEK_RPWM, MEK_LPWM, -0.6f);  // basiliyken geri sar
  else                 surMotor(MEK_RPWM, MEK_LPWM, 0.0f);   // birakinca dur

  delay(20);
}
void autonomousInit() {}
void autonomousLoop() { delay(20); }

Kodu yükle. Robotu yükseltiye koy, sürüş tekerleri ve mekanizma 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. Çubuklarla sürüşün hâlâ çalıştığını gör. Şimdi RB tuşuna bas ve basılı tut: mekanizma dönmeye başlar. Bırak: durur. LB ise ters yöne sarar. Mekanizma ters yöne dönüyorsa, tıpkı sürüş motorlarında yaptığın gibi, MEK_RPWM ve MEK_LPWM sabitlerinin değerlerini kodda yer değiştir.

Kavram köprüsü: dişli, yük ve anlık kontrol (7 dk)

Az önce üç yeni fikri çalışır halde gördün. Şimdi adlarını koyalım.

Buton anlık kontroldür. Sürüş çubuğu sana -1 ile +1 arasında kayan bir sayı verir; bu yüzden yavaş ya da hızlı gidebilirsin. Buton ise yalnız iki şey söyler: basılı (true) ya da değil (false). Ara yok. Bu yüzden mekanizmanın hızını çubuk gibi ayarlayamazsın; hızı sen kodda seçtin (0.6), buton yalnızca o hızı açıp kapatıyor.

Dişli mekanizması ve çevrim oranı. Motorun mili hızlı ama zayıf döner. Motorun ucundaki küçük dişli, mekanizmadaki büyük dişliyi çevirir. Küçük dişli birkaç tur atarken büyük dişli bir tur atar. Buna çevrim oranı denir: hızdan feragat edip güç (tork) kazanırsın. Mekanizman yavaş ama kuvvetli döner; işte bir yükü çevirebilmesinin ya da taşıyabilmesinin sebebi bu.

Yük altında akım artar. Mekanizma boştayken motor rahat döner, az akım çeker. Ama bir yüke bindiğinde ya da bir yere dayandığında motor zorlanır, daha çok akım çeker. Buradan çıkan güvenlik kuralı bu dersin en önemli cümlesi:

Mekanizmayı uç noktasında zorlama. Motor inlemeye başlarsa hemen tuşu bırak. Dayanmış bir mekanizmaya güç vermeye devam edersen motor çok akım çeker; ısınır ve sigortan atabilir.

Bu robotta mekanizmanın nerede duracağını söyleyen bir uç anahtarı yok. Uçta durmak senin sorumluluğun; işte bu yüzden basılı tuttukça dönen, bıraktığın an susan bir tasarım seçtik. Kontrol tamamen sürücünün parmağında.

Uygulama: kodu kendine göre değiştir (15 dk)

Sıra sende. Her değişiklikten sonra kodu yeniden yükle ve farkı gözle.

  1. Hızı ayarla. Kontrol bloğundaki 0.6f değerini değiştir. Önce 0.3f yapıp mekanizmayı yavaş, kontrollü döndür; sonra 0.9f deneyip farkı hisset. Hangi hız senin mekanizman için doğru? Çok hızlı olursa yükü savurur ya da uca sertçe çarpar; çok yavaş olursa yükü kaldırmaya gücü yetmeyebilir. Doğru değeri deneyerek bulacaksın.
  2. Butonları değiştir. Şu an mekanizma RB ve LB'de. Sürüş sırasında bu tuşlara yanlışlıkla basıyorsan, kontrolü başka tuşlara taşı. Örneğin js.getRB() yerine js.getY(), js.getLB() yerine js.getX() yazarak mekanizmayı Y ve X tuşlarına al. Sana en rahat geleni seç. M02'de RB'yi yavaş moda bağladıysan, mekanizma da RB kullanınca ikisi çakışır; ya mekanizmayı burada Y/X tuşuna al ya da M02'deki yavaş modu kaldır.
  3. Tek yön kilidi ekle. Diyelim mekanizman yalnızca bir yöne çalışmalı ve ters yön onu bozuyor. O zaman geri sarmayı tamamen kaldır. else if (js.getLB()) satırını sil; geriye yalnız "RB basılıysa ileri sar, değilse dur" kalsın:
    if (js.getRB()) surMotor(MEK_RPWM, MEK_LPWM, 0.6f);   // basiliyken ileri sar
    else            surMotor(MEK_RPWM, MEK_LPWM, 0.0f);   // birakinca dur
    Artık LB'ye yanlışlıkla bassan bile mekanizma ters dönmez. Bu, yanlış yöne dönmesi zararlı olan mekanizmalar için basit ve güvenli bir kilittir.

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ğı: bir vinç operatörünün kumandasındaki kaldırma tuşu da böyle çalışır. Basılı tuttukça yük kalkar, bıraktığı an durur ve olduğu yerde asılı kalır. Operatör her an kontrolü elinde tutar; paniklerse yapması gereken tek şey elini çekmektir. Senin yazdığın üç satırlık kontrol bloğu, o vincin de kalbindeki mantık.

Erken bitirene ek görev: yarım güç sarma modu (opsiyonel)

Bazen mekanizmayı tam güçle değil, hassas bir şekilde azar azar döndürmek istersin; mesela bir yükü tam doğru noktaya oturturken. Bunun için A tuşuyla çalışan bir "yarım güç sarma" modu üret.

Fikir şu: A basılıyken mekanizma yarı hızda (0.3f) ileri sarsın. Böylece hassas iş için A, hızlı iş için RB kullanırsın. A'yı kontrol zincirinin başına, RB'den önce koy ki hassas mod öncelikli olsun:

if (js.getA())       surMotor(MEK_RPWM, MEK_LPWM, 0.3f);   // yarim guc: hassas sarma
else if (js.getRB()) surMotor(MEK_RPWM, MEK_LPWM, 0.6f);   // tam guc ileri
else if (js.getLB()) surMotor(MEK_RPWM, MEK_LPWM, -0.6f);  // geri sar
else                 surMotor(MEK_RPWM, MEK_LPWM, 0.0f);   // dur

Yükle ve dene: A ile yavaş, RB ile hızlı sarım. if / else if zincirinde ilk doğru olan çalışır, gerisi atlanır; bu yüzden A ile RB'ye aynı anda bassan bile yarım güç kazanır. Sıralamayı değiştirip hangi tuşun öncelikli olmasını istediğini sen belirle.

Meydan okuma: Üç tuşlu bu kontrol sana mekanizmayı ne kadar hassas yönetme imkânı verdi? Aynı işi tek tuşla yapabilir miydin? Bir arkadaşınla tartış: daha çok tuş her zaman daha iyi kontrol demek mi?