Ana içeriğe geç

Robot Blink Örneği 💡

Bu örnek, Probot Lib'in temel kullanımını gösterir. MEB Tasarla Geliştir Robot Yarışması için robot geliştirmeye başlamanın en kolay yoludur.

🎯 Amaç

  • Probot Lib'in temel yapısını öğrenmek
  • Robot yaşam döngüsünü anlamak
  • Driver Station bağlantısını test etmek
  • Autonomous ve Teleop modları arasında geçiş yapmak
  • LED kontrolü ile temel I/O işlemlerini öğrenmek

🔧 Gerekli Malzemeler

Malzeme Adet Açıklama
ESP32/NodeMCU 1 Ana mikrodenetleyici
LED 1 Dahili LED kullanılabilir
Direnç (220Ω) 1 LED akım sınırlama (opsiyonel)
Breadboard 1 Bağlantılar için
Jumper kablolar 3-4 Bağlantılar için

📋 Bağlantı Şeması

ESP32/NodeMCU
    ├── GPIO 2 ──── LED ──── GND
    │               │
    │               └── 220Ω Direnç (opsiyonel)
    └── Dahili LED (GPIO 2 - ESP32, GPIO 16 - NodeMCU)

💻 Kod Açıklaması

Temel Yapı

#include <probot.h>

// Robot başlatma - bir kez çalışır
void robotInit() {
    Serial.begin(115200);
    Serial.println("🚀 Robot başlatıldı!");

    // LED pinini çıkış olarak ayarla
    pinMode(LED_BUILTIN, OUTPUT);

    Serial.println("📡 WiFi bağlantısı kuruluyor...");
    Serial.println("🎮 Driver Station hazır!");
}

// Her döngüde çalışır (tüm modlarda)
void robotPeriodic() {
    // Robot durumu izleme
    static unsigned long lastPrint = 0;
    if (millis() - lastPrint > 5000) { // 5 saniyede bir
        Serial.printf("📊 Durum: %s | RAM: %d bytes | Uptime: %lu ms\n", 
                     robot.getMode() == RobotMode::AUTONOMOUS ? "AUTO" : 
                     robot.getMode() == RobotMode::TELEOP ? "TELEOP" : "DISABLED",
                     ESP.getFreeHeap(), 
                     millis());
        lastPrint = millis();
    }
}

Autonomous Modu

// Autonomous mod başlangıcı - mod değiştiğinde bir kez çalışır
void autoInit() {
    Serial.println("🤖 Autonomous mod başladı!");
    Serial.println("⏱️  30 saniye otonom hareket...");
}

// Autonomous döngüsü - sürekli çalışır
void autoLoop() {
    // Basit blink pattern - 500ms aralıklarla
    static unsigned long lastBlink = 0;
    static bool ledState = false;

    if (millis() - lastBlink > 500) {
        ledState = !ledState;
        digitalWrite(LED_BUILTIN, ledState ? LOW : HIGH); // ESP32'de LOW = ON
        lastBlink = millis();

        Serial.printf("🔄 Auto Blink: %s\n", ledState ? "ON" : "OFF");
    }

    // Autonomous süre kontrolü (MEB yarışması: 30 saniye)
    static unsigned long autoStartTime = 0;
    if (autoStartTime == 0) {
        autoStartTime = millis();
    }

    if (millis() - autoStartTime > 30000) { // 30 saniye
        Serial.println("⏰ Autonomous süresi doldu!");
        // Gerçek yarışmada otomatik teleop'a geçiş yapılır
    }
}

Teleop Modu

// Teleop mod başlangıcı
void teleopInit() {
    Serial.println("🎮 Teleop mod başladı!");
    Serial.println("🕹️  Joystick kontrolü aktif...");
    digitalWrite(LED_BUILTIN, HIGH); // LED'i kapat
}

// Teleop döngüsü - joystick kontrolü
void teleopLoop() {
    // Gamepad bağlantısını kontrol et
    if (!gamepad.isConnected()) {
        // Bağlantı yoksa yavaş blink
        static unsigned long lastBlink = 0;
        static bool ledState = false;

        if (millis() - lastBlink > 1000) { // 1 saniye
            ledState = !ledState;
            digitalWrite(LED_BUILTIN, ledState ? LOW : HIGH);
            lastBlink = millis();
        }
        return;
    }

    // Joystick kontrolü ile LED
    if (gamepad.getButton(Button::A)) {
        digitalWrite(LED_BUILTIN, LOW);  // A tuşu = LED ON
        Serial.println("🔴 A tuşu basıldı - LED ON");
    } else if (gamepad.getButton(Button::B)) {
        digitalWrite(LED_BUILTIN, HIGH); // B tuşu = LED OFF
        Serial.println("⚫ B tuşu basıldı - LED OFF");
    }

    // X tuşu ile hızlı blink
    if (gamepad.getButton(Button::X)) {
        static unsigned long lastFastBlink = 0;
        static bool fastLedState = false;

        if (millis() - lastFastBlink > 100) { // 100ms
            fastLedState = !fastLedState;
            digitalWrite(LED_BUILTIN, fastLedState ? LOW : HIGH);
            lastFastBlink = millis();
        }
    }

    // Y tuşu ile çok hızlı blink
    if (gamepad.getButton(Button::Y)) {
        static unsigned long lastVeryFastBlink = 0;
        static bool veryFastLedState = false;

        if (millis() - lastVeryFastBlink > 50) { // 50ms
            veryFastLedState = !veryFastLedState;
            digitalWrite(LED_BUILTIN, veryFastLedState ? LOW : HIGH);
            lastVeryFastBlink = millis();
        }
    }

    // Analog stick ile LED parlaklığı (PWM)
    float leftY = gamepad.getLeftY();
    if (abs(leftY) > 0.1) { // Dead zone
        int brightness = map(abs(leftY * 255), 0, 255, 0, 255);
        analogWrite(LED_BUILTIN, 255 - brightness); // ESP32'de ters mantık
        Serial.printf("💡 LED Parlaklığı: %d/255\n", brightness);
    }
}

Disabled Modu

// Disabled mod başlangıcı
void disabledInit() {
    Serial.println("⏸️  Robot devre dışı!");
    digitalWrite(LED_BUILTIN, HIGH); // LED'i kapat
}

// Disabled döngüsü
void disabledLoop() {
    // Çok yavaş blink - robot disabled durumda
    static unsigned long lastBlink = 0;
    static bool ledState = false;

    if (millis() - lastBlink > 2000) { // 2 saniye
        ledState = !ledState;
        digitalWrite(LED_BUILTIN, ledState ? LOW : HIGH);
        lastBlink = millis();
    }
}

🚀 Kurulum ve Çalıştırma

1. Arduino IDE Kurulumu

# Arduino IDE'yi indirin ve kurun
# ESP32/ESP8266 board paketlerini ekleyin
# Probot Lib'i library manager'dan yükleyin

2. Kod Yükleme

  1. Arduino IDE'yi açın
  2. RobotBlink.ino dosyasını açın
  3. Board'u seçin (ESP32 Dev Module / NodeMCU 1.0)
  4. Port'u seçin
  5. Upload butonuna basın

3. WiFi Bağlantısı

  1. Serial Monitor'ü açın (115200 baud)
  2. Robot'un WiFi ağını bulun: probot_XXXXXX
  3. Şifre: robotpro1234
  4. Tarayıcıda 192.168.4.1 adresine gidin

🎮 Driver Station Kullanımı

Web Arayüzü

http://192.168.4.1

Kontroller

Tuş Fonksiyon
A LED ON
B LED OFF
X Hızlı Blink (100ms)
Y Çok Hızlı Blink (50ms)
Sol Stick Y LED Parlaklığı (PWM)
Enable/Disable Robot durumu
Auto/Teleop Mod değiştirme

📊 Beklenen Çıktılar

Serial Monitor

🚀 Robot başlatıldı!
📡 WiFi bağlantısı kuruluyor...
WiFi AP başlatıldı: probot_A1B2C3
IP Adresi: 192.168.4.1
🎮 Driver Station hazır!

📊 Durum: DISABLED | RAM: 234567 bytes | Uptime: 5000 ms
⏸️  Robot devre dışı!

🤖 Autonomous mod başladı!
⏱️  30 saniye otonom hareket...
🔄 Auto Blink: ON
🔄 Auto Blink: OFF
⏰ Autonomous süresi doldu!

🎮 Teleop mod başladı!
🕹️  Joystick kontrolü aktif...
🔴 A tuşu basıldı - LED ON
⚫ B tuşu basıldı - LED OFF
💡 LED Parlaklığı: 128/255

LED Davranışları

Mod LED Davranışı
Disabled Yavaş blink (2 saniye)
Autonomous Orta hızda blink (500ms)
Teleop (Bağlantısız) Yavaş blink (1 saniye)
Teleop (A tuşu) Sürekli yanık
Teleop (B tuşu) Sürekli sönük
Teleop (X tuşu) Hızlı blink (100ms)
Teleop (Y tuşu) Çok hızlı blink (50ms)

🔧 Özelleştirme

Farklı LED Pinleri

// Harici LED kullanımı
#define EXTERNAL_LED_PIN 5

void robotInit() {
    pinMode(EXTERNAL_LED_PIN, OUTPUT);
}

void teleopLoop() {
    if (gamepad.getButton(Button::A)) {
        digitalWrite(EXTERNAL_LED_PIN, HIGH);
    }
}

RGB LED Kontrolü

// RGB LED pinleri
#define RED_PIN 25
#define GREEN_PIN 26
#define BLUE_PIN 27

void robotInit() {
    pinMode(RED_PIN, OUTPUT);
    pinMode(GREEN_PIN, OUTPUT);
    pinMode(BLUE_PIN, OUTPUT);
}

void teleopLoop() {
    if (gamepad.getButton(Button::A)) {
        // Kırmızı
        digitalWrite(RED_PIN, HIGH);
        digitalWrite(GREEN_PIN, LOW);
        digitalWrite(BLUE_PIN, LOW);
    } else if (gamepad.getButton(Button::B)) {
        // Yeşil
        digitalWrite(RED_PIN, LOW);
        digitalWrite(GREEN_PIN, HIGH);
        digitalWrite(BLUE_PIN, LOW);
    } else if (gamepad.getButton(Button::X)) {
        // Mavi
        digitalWrite(RED_PIN, LOW);
        digitalWrite(GREEN_PIN, LOW);
        digitalWrite(BLUE_PIN, HIGH);
    }
}

Ses Efektleri

#define BUZZER_PIN 4

void autoInit() {
    // Başlangıç sesi
    tone(BUZZER_PIN, 1000, 200); // 1kHz, 200ms
}

void teleopLoop() {
    if (gamepad.getButtonPressed(Button::A)) {
        tone(BUZZER_PIN, 800, 100); // Tuş basma sesi
    }
}

🐛 Sorun Giderme

Yaygın Sorunlar

Sorun Çözüm
LED yanmıyor Pin bağlantısını kontrol edin, ESP32'de LOW=ON
WiFi bağlanamıyor MAC adresini kontrol edin, şifreyi doğrulayın
Gamepad çalışmıyor Tarayıcı uyumluluğunu kontrol edin
Serial çıktı yok Baud rate'i 115200 olarak ayarlayın

Debug Kodları

void robotPeriodic() {
    // Memory monitoring
    if (ESP.getFreeHeap() < 10000) {
        Serial.println("⚠️  Düşük bellek!");
    }

    // WiFi status
    if (WiFi.softAPgetStationNum() == 0) {
        Serial.println("📡 Client bağlı değil");
    }

    // Gamepad status
    Serial.printf("🎮 Gamepad: %s\n", 
                 gamepad.isConnected() ? "Bağlı" : "Bağlı değil");
}

🎯 Sonraki Adımlar

Bu örneği tamamladıktan sonra:

  1. Temel Tank Drive - Motor kontrolü
  2. Gamepad Kullanımı - Gelişmiş joystick kontrolü
  3. Servo Kontrolü - Servo motor kullanımı
  4. Sensör Okuma - Analog/dijital sensörler
  5. Autonomous Hareket - Otonom algoritmaları

📚 Ek Kaynaklar


Tebrikler! 🎉 İlk Probot Lib projenizi tamamladınız. Artık MEB Tasarla Geliştir Robot Yarışması için daha karmaşık robotlar geliştirebilirsiniz!