Yapım Sprinti: Robotu Birleştir ve Test Et
Neden acele eden geç kalır? (9 dk)
İki takım aynı görevi kuruyor. Bir takım heyecanla bütün parçaları takıyor, kodu yüklüyor ve doğrudan göreve başlıyor. Ama robot ortada takılıyor: bir tekerlek dönmüyor, mekanizma kımıldamıyor. Şimdi sorun nerede? Sürüşte mi, mekanizmada mı, kabloda mı, kodda mı? Hepsi aynı anda çalıştığı için hangisinin bozuk olduğunu bulmak çok zor.
Öteki takım daha yavaş başlıyor. Önce sadece tekerlekleri deniyor. Sonra sadece mekanizmayı. Sonra sadece ekranı. Her parçanın tek başına çalıştığından emin olduktan sonra hepsini birleştiriyor. Bu takım daha geç başladı ama önce bitirdi.
Bugün senin işin bu ikinci takımın yaptığı şey: göreve başlamadan önce robotunu hazır hale getirmek. Bu derste yeni bir komut yok. Bildiğin her parçayı tek bir robotta toplayacak ve her birinin gerçekten çalıştığını kanıtlayacaksın.
Takımınla tartış: Bir şey bozulduğunda, "her şeyi aynı anda mı denemek" yoksa "parçaları tek tek mi denemek" sorunu daha çabuk bulur? Neden?
Sprint hazırlığı: kontrol listesiyle çalış (20 dk)
Bir sprint, kısa ve yoğun bir yapım turudur. Bu turda amacın robotun fiziksel olarak hazır olması. Aşağıdaki iki kontrol listesini takımınla sırayla işaretle. Bir maddeyi kanıtlamadan bir sonrakine geçme; kanıtlamak demek "gözümle gördüm, elimle denedim" demektir.
Mekanik kontrol listesi
- Dört tekerlek de sıkı; elle çevirince boşta dönmüyor, mile oturmuş.
- Motor kabloları motorlara sağlam bağlı, çekince çıkmıyor.
- Mekanizma ya da gripper serbestçe hareket ediyor, bir yere sürtmüyor.
- Şasi üstündeki her parça (kart, sürücüler, pil) sabit; robot sarsılınca oynamıyor.
- Pil yerine oturmuş ve kabloları anahtara/sigortaya doğru gidiyor.
Elektronik kontrol listesi
- Tüm GND kabloları Wago klemenste buluşuyor (ortak toprak).
- 12V yalnızca pil girişine ve regülatör girişine gidiyor; ESP32'ye giden tek besleme regülatörün 5V çıkışı.
- Her BTS7960 sürücünün sinyal pinleri doğru GPIO'lara bağlı (sürüş sol 16/17, sağ 18/19; mekanizma 21/22).
- Varsa servo kırmızı ucu regülatörün 5V çıkışına bağlı, ESP32 pinine değil; sinyal ucu GPIO4'te.
- Sigorta ve anahtar yerinde; anahtar kapalıyken hiçbir yerde güç yok.
Sonra: her alt sistemi TEK BAŞINA test et
Kontrol listesi robotun bağlantısını doğrular. Şimdi hareketin doğru olduğunu kanıtlayacaksın. Kural şu: bir alt sistemi denerken yalnız onu dene. Robotu tekerlekleri havada kalacak şekilde bir kutuya koy, böylece kaçmaz.
Her alt sistemin kendi test yöntemi zaten önceki modüllerde öğretildi. Şimdi o testleri arka arkaya bir kez daha yap:
| Alt sistem | Nasıl test edilir | Nereden hatırla |
|---|---|---|
| Sürüş | Çubuğu ileri it, iki teker de ileri dönmeli; sağa çevir, robot sağa dönmeye çalışmalı | Sürüş modülü test bölümü |
| Mekanizma | RB'ye bas, mekanizma bir yöne dönmeli; LB'ye bas, ters yöne; bırak, dursun | M04 test protokolü |
| Gripper (varsa) | A'ya bas kapansın, B'ye bas açılsın; uçta zorlanan servonun sesini dinle | M05 kalibrasyon ve test |
| Telemetri | Ekranda değerlerin akmasını izle; çubuğu oynat, sayılar değişsin | M06 telemetriyle teşhis |
Bir teker ters dönüyorsa çözümü biliyorsun: o motorun RPWM ve LPWM sabitlerini kodda yer değiştir. Mekanizmayı test ederken uçta zorlama; motor inler, akımı artar, sigorta atabilir. Servoyu test ederken zorlanma sesi duyarsan açıyı geri al.
Her satırı kanıtladıkça yanına onay koy. Bir alt sistem geçmiyorsa onu tek başına düzelt; öteki parçalara karışma.
Alt sistem ve izolasyon testi (7 dk)
Şimdi az önce yaptığın şeyin adını koyalım. Robotun her işi yapan bir parçasına alt sistem denir: sürüş bir alt sistem, mekanizma bir alt sistem, telemetri bir alt sistem. Robotun tamamı bu alt sistemlerin bir araya gelmesidir.
Bir alt sistemi ötekilerden ayırıp yalnız başına denemeye izolasyon testi denir. "İzole etmek" bir şeyi tek başına, gerisinden ayrı tutmak demektir. Neden tek tek? Çünkü bir şey bozulduğunda aranacak yer küçük olsun diye. Yalnız sürüşü denerken robot durursa, sorun kesinlikle sürüştedir; mekanizmaya, ekrana bakmana gerek kalmaz. Ama her şeyi aynı anda açarsan, sorun dört ayrı yerden herhangi biri olabilir.
Gerçek mühendisler tam da böyle çalışır: bir uçağın, bir arabanın her parçası, hepsi birleşmeden önce tek tek test edilir. Sen de bugün aynısını yaptın. Birleştirmeden önce test etmek, sonradan saatlerce hata aramaktan kurtarır.
Hepsini tek koda topla (15 dk)
Şimdiye kadar sürüşü, mekanizmayı ve telemetriyi çoğunlukla ayrı kodlarda çalıştırdın. Görev robotunun tek bir koda ihtiyacı var: kumandayı her oynattığında hem sürsün, hem mekanizmayı yönetsin, hem de ne yaptığını ekrana yazsın.
İyi haber şu: bunların hepsi aynı teleopLoop içinde yan yana durabilir. Aşağıdaki kod, bildiğin parçaları tek yerde birleştirir. Yeni bir komut yok; her satırı daha önce gördün.
#define PROBOT_WIFI_AP_SSID "GorevRobotu"
#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; // mekanizma motoru
// hazir kalip: 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)); }
}
// hazir kalip: sasiyi ileri/donus ile surer
void surSasi(float ileri, float donus) {
surMotor(SOL_RPWM, SOL_LPWM, ileri + donus);
surMotor(SAG_RPWM, SAG_LPWM, ileri - donus);
}
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);
}
void robotEnd() {
surSasi(0.0f, 0.0f);
surMotor(MEK_RPWM, MEK_LPWM, 0.0f);
}
void teleopInit() {}
void teleopLoop() {
auto js = probot::io::joystick_api::makeDefault();
float ileri = js.getLeftY(); // sol cubuk yukari/asagi
float donus = js.getRightX(); // sag cubuk saga/sola
surSasi(ileri, donus);
if (js.getRB()) surMotor(MEK_RPWM, MEK_LPWM, 0.6f); // basiliyken bir yone
else if (js.getLB()) surMotor(MEK_RPWM, MEK_LPWM, -0.6f); // basiliyken ters yone
else surMotor(MEK_RPWM, MEK_LPWM, 0.0f); // birakinca dur
probot::clearTelemetry();
probot::printf("ileri: %.2f\n", ileri);
probot::printf("donus: %.2f\n", donus);
delay(20);
}
void autonomousInit() {}
void autonomousLoop() { delay(20); }
Kendi robotuna uyarla:
- Sürüş yerine mecanum kullanıyorsan,
surSasiyerine kendi mecanum satırlarını koy; mekanizma ve telemetri satırları aynen durur. - Gripper kullanıyorsan,
MEK_RPWM/MEK_LPWMsatırlarının yerine servo kalıbını (M05'tekiservoAcive A/B butonları) koy. WIFI_AP_SSIDdeğerini kendi robotunun adıyla değiştir ki sahada başka robotlarla karışmasın.
Kodu yükle, bağlan (telefonu robotun ağına, tarayıcıda http://192.168.4.1, kumandayı telefona bağla, bir tuşa bas, Init, Start) ve birleşik testi yap: şimdi hem sür, hem RB/LB ile mekanizmayı çalıştır, hem de ekranda değerlerin aktığını gör. Tek tek çalışan parçalar bir arada da çalışıyor mu? İşte kanıtlaman gereken bu.
Sprint sonu durum raporu (7 dk)
Sprintin sonunda takımın nerede olduğunu tek bakışta gösteren bir durum raporu çıkar. Aşağıdaki tabloyu doldur. Her alt sistem için iki soru var: tek başına çalışıyor mu, birleşince de çalışıyor mu? Yalnızca gerçekten gördüğün şeyi işaretle.
| Alt sistem | Tek başına test | Birleşik test | Durum |
|---|---|---|---|
| Sürüş | çalışıyor / sorunlu / yok | ||
| Mekanizma ya da gripper | çalışıyor / sorunlu / yok | ||
| Telemetri | çalışıyor / sorunlu / yok |
Kendini yokla:
- "İzolasyon testi" ne demek ve neden birleştirmeden önce yapılır?
- Robot birleşik testte tek yöne kaçıyor ama tek başına sürüş testinde düzgündü. İlk nereye bakarsın?
- Mekanizmayı test ederken uçta niçin zorlamamalısın?
Günlük hayat bağı: Bir bisikleti tamir ederken de böyle yaparsın; önce frene bak, ayrı dene; sonra vitese bak, ayrı dene. Hepsini aynı anda kurcalarsan hangi ayarın işe yaradığını asla bilemezsin. "Önce ayrı test et, sonra birleştir" kuralı robotlarda da, gerçek hayatta da işe yarar.
Durum raporunda "sorunlu" ya da "yok" yazan her satır, bir sonraki dersin görev listesidir. Hepsi "çalışıyor" olduğunda robotun göreve hazır demektir.
Erken bitirene ek görev
- Yedek plan yaz: Sahada bir motor kablosu çıkarsa ya da pil biterse takımın ne yapacak? Kısa bir "bozulursa" listesi hazırla: hangi parçayı, kim, nasıl kontrol edecek.
- Telemetriyi zenginleştir: Ekrana mekanizmanın o an ne yaptığını da yazdır.
js.getRB()doğruysaprobot::println("mekanizma: ileri"),js.getLB()doğruysa"mekanizma: geri", ikisi de değilse"mekanizma: dur"yaz. Böylece sürücü gözünü sahadan ayırmadan ne olduğunu ekrandan takip eder.