Ana içeriğe geç

Arduino vs Probot Farkları

(İçerik doldurulacak)

Robot Yaşam Döngüsü - Arduino'dan Farklı Çalışma

Arduino'da setup() bir kez çalışır, loop() sürekli döner. Probot'ta ise robotun farklı modları vardır ve her modun kendi yaşam döngüsü bulunur. Bu yarışma robotlarının standardıdır.

📱 Arduino Yaşam Döngüsü

void setup() {
    // Robot açılırken bir kez çalışır
    Serial.begin(9600);
    pinMode(LED_BUILTIN, OUTPUT);
    // Başlangıç ayarları
}

void loop() {
    // Sürekli tekrar eder
    digitalWrite(LED_BUILTIN, HIGH);
    delay(1000);
    digitalWrite(LED_BUILTIN, LOW);
    delay(1000);
    // Robot kapatılana kadar döner
}

Özellikler: - ✅ Basit ve anlaşılır - ✅ Hemen çalışmaya başlar - ❌ Durdurulamaz (sadece güç kesilerek) - ❌ Farklı modlar yok - ❌ Uzaktan kontrol yok

Probot Yaşam Döngüsü

Probot'ta robot 3 farklı modda çalışabilir:

1. Disabled Mode (Kapalı)

  • Robot güvenli durumda
  • Motorlar otomatik durdurulur
  • Sadece sensör okuma ve bilgi toplama yapılabilir

2. Autonomous Mode (Otonom)

  • Robot kendi kendine hareket eder
  • Joystick kontrolü yasak
  • Önceden programlanmış görevleri yapar

3. Teleop Mode (Uzaktan Kontrol)

  • Joystick kontrolü aktif
  • Driver insan kontrolünde çalıştırır
  • En yaygın kullanılan mod

Bu sistem FRC, FTC gibi robot yarışmalarından gelir. Güvenlik ve adalet için gereklidir.

🔄 Fonksiyon Karşılaştırması

Arduino Probot Ne Zaman Çalışır
setup() robotInit() Robot enable olduğunda bir kez
- robotEnd() Robot disable olduğunda bir kez
- autoInit() Autonomous moda geçerken bir kez
loop() autoLoop() Autonomous modundayken sürekli
- teleopInit() Teleop moda geçerken bir kez
loop() teleopLoop() Teleop modundayken sürekli

⚙️ Mode-Specific Fonksiyonlar

#include <probot.h>

TunaGamepad gamepad(robot);
BasicMotorController motor(9, 8, 7);

// ============ GLOBAL LIFECYCLE ============
void robotInit() {
    Serial.begin(115200);
    Serial.println("🤖 Robot Enable!");
    motor.begin();
}

void robotEnd() {
    Serial.println("🛑 Robot Disable!");
    motor.stop();
}

// ============ AUTONOMOUS MODE ============
void autoInit() {
    Serial.println("🔄 Autonomous Başladı!");
    // Otonom başlangıç hazırlıkları
}

void autoLoop() {
    // Otonom kod - joystick yasak!
    // Sensörlerle otomatik hareket
    if (millis() % 2000 < 1000) {
        motor.setPower(0.3);  // 1 saniye ileri
    } else {
        motor.setPower(-0.3); // 1 saniye geri
    }
}

// ============ TELEOP MODE ============
void teleopInit() {
    Serial.println("🎮 Teleop Başladı!");
    // Teleop başlangıç hazırlıkları
}

void teleopLoop() {
    // Joystick kontrol kodu
    float power = -gamepad.getAxis(Axis::LeftJoystickY);
    motor.setPower(power);

    if (gamepad.getButton(Button::A)) {
        Serial.println("A tuşu basıldı!");
    }
}

// ============ TEST MODE ============
void testInit() {
    Serial.println("🔧 Test Başladı!");
}

void testLoop() {
    // Test kodu - güvenli, yavaş hareket
    static unsigned long lastTest = 0;
    if (millis() - lastTest > 5000) {
        motor.setPower(0.1);  // Yavaş test
        delay(100);
        motor.setPower(0);
        lastTest = millis();
    }
}

🚦 Mod Geçişleri

Arduino'da İmkansız:

// Arduino'da böyle bir şey yapılamaz
if (button_pressed) {
    // Normal çalışma modundan test moduna geç??? 
    // İmkansız!
}

Probot'ta Kolay:

Driver Station web arayüzünde: - Disable → Robot durdur - Enable + Auto → Autonomous mod - Enable + Teleop → Teleop mod
- Enable + Test → Test mod

Her mod değişiminde: 1. Önceki mode loop fonksiyonu durur 2. Yeni mode init fonksiyonu çalışır 3. Yeni mode loop fonksiyonu başlar

⏱️ Timing Farkları

Arduino Timing:

void loop() {
    digitalWrite(LED_BUILTIN, HIGH);
    delay(1000);  // Tüm program durur!
    digitalWrite(LED_BUILTIN, LOW);
    delay(1000);  // Tüm program durur!
}

Probot Timing:

void teleopLoop() {
    // ❌ delay() kullanmayın - robot donar!

    // ✅ millis() ile non-blocking timing
    static unsigned long lastBlink = 0;
    static bool ledState = false;

    if (millis() - lastBlink > 1000) {
        ledState = !ledState;
        digitalWrite(LED_BUILTIN, ledState);
        lastBlink = millis();
    }

    // Joystick hala çalışıyor!
    float power = -gamepad.getAxis(Axis::LeftJoystickY);
    motor.setPower(power);
}

Neden delay() kullanılmaz? - Driver Station ile iletişim durur - Joystick verisi kaybedilir - Robot "donmuş" görünür - Mode değişimi gecikir

🏁 Yarışma Senaryosu

MEB yarışmasında gerçek durum:

// 1. Robot sahasına konulur → Disabled
// 2. Hakem "Enable" der → robotInit() çalışır
// 3. Autonomous başlar → autoInit() + autoLoop() (30 saniye)
// 4. Teleop başlar → teleopInit() + teleopLoop() (2 dakika)
// 5. Maç biter → robotEnd() çalışır

void autoLoop() {
    // 30 saniye boyunca - joystick yasak!
    if (robot.getAutoElapsed() < 15) {
        // İlk 15 saniye: İleri git
        motor.setPower(0.5);
    } else {
        // Son 15 saniye: Dur
        motor.setPower(0);
    }
}

void teleopLoop() {
    // 2 dakika boyunca - joystick serbest!
    float power = -gamepad.getAxis(Axis::LeftJoystickY);
    motor.setPower(power);
}

⚠️ Yaygın Hatalar

1. Arduino Loop Alışkanlığı

// ❌ Arduino alışkanlığı - çalışmaz
void loop() {
    // Bu fonksiyon Probot'ta çalışmaz!
}

// ✅ Probot yaklaşımı
void teleopLoop() {
    // Bu teleop modunda çalışır
}

2. Init Fonksiyonlarını Unutmak

// ❌ Her mod değişiminde sıfırlama gerekir
void teleopLoop() {
    static bool initialized = false;
    if (!initialized) {
        // Her seferinde aynı kodu yazıyorsunuz
        initialized = true;
    }
}

// ✅ Init fonksiyonu kullanın
void teleopInit() {
    // Mod başladığında otomatik çalışır
}

3. Mode-Blind Kod

// ❌ Hangi modda olduğunu bilmeden kod yazmak
void teleopLoop() {
    // Otonom modda joystick kullanmak yasak ama bu kod
    // sadece teleop'ta çalışacak, sorun yok
}

🎯 Avantajlar

Güvenlik:

  • Robot istemediğinizde durabilir
  • Test modu ile güvenli deneme
  • Mod izolasyonu - kodlar karışmaz

Yarışma Uyumluluğu:

  • FRC standardları ile uyumlu
  • Hakem kontrolü mümkün
  • Zaman limitleri otomatik

Geliştirme Kolaylığı:

  • Kod organizasyonu daha iyi
  • Debug her mod için ayrı
  • Hot-swapping modlar arası geçiş

📚 Sonraki Adımlar

  1. Gamepad Kontrolü - Joystick kullanımı
  2. Web Interface - Driver Station arayüzü
  3. Pratik Örnekler - Gerçek robot projesi

💡 İpucu: Arduino'dan geliyorsanız en zor alışacağınız kısım mod sistemi olacak. Ama bir kez alıştığınızda çok daha organize kod yazacaksınız!