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¶
- Gamepad Kontrolü - Joystick kullanımı
- Web Interface - Driver Station arayüzü
- 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!