ESP32 ile Joystick Kontrollü Çift Servo Projesi

Bu rehber, ESP32 geliştirme kartı kullanarak bir analog joystick ile iki adet servo motorun açı konumlarını bağımsız olarak kontrol etme işlemini adım adım açıklar. Joystick’in X ve Y eksenlerinden okunan analog değerlerin, her bir servo motorun 0-180 derece aralığında hareket etmesi için ölçeklendirilmesi prensibine dayanan bu proje, çoklu analog giriş okuma, PWM kontrolü ve eksen bazlı hareket kontrolü konularını öğrenmek için temel bir uygulamadır.

Adım 1 – Bileşenleri Tanıyın

Analog Joystick Modülü

Analog joystick modülü, iki eksenli (X ve Y) potansiyometre yapısına sahip bir giriş birimidir. Beş bağlantı ucu bulunur:

  • VCC: Güç beslemesi (3.3V veya 5V)
  • GND: Toprak bağlantısı
  • VRX: X ekseni analog sinyal çıkışı (0-3.3V)
  • VRY: Y ekseni analog sinyal çıkışı (0-3.3V)
  • SW (Opsiyonel): Joystick butonu dijital çıkışı

Joystick merkezdeyken her iki eksen de yaklaşık 0-4096 (12-bit ADC orta noktası) değerini döndürür.

Genel bağlantı aşağıdaki gibi kurulabilir.

Joystick’i sola veya sağa hareket ettirdiğinizde, VRX pinindeki voltaj değişir. Voltaj aralığı 0 ile 5V arasındadır (sol konumda 0V, sağ konumda 5V). Voltaj değeri, joystick’in konumuyla doğru orantılıdır $\Rightarrow$ ESP32’nin analog pinindeki okuma değeri 0 ile 4095 arasındadır.

Joystick’i yukarı veya aşağı hareket ettirdiğinizde, VRY pinindeki voltaj değişir. Voltaj aralığı 0 ile 5V arasındadır (yukarı konumda 0V, aşağı konumda 5V). Voltaj değeri, joystick’in konumuyla doğru orantılıdır $\Rightarrow$ ESP32’nin analog pinindeki okuma değeri 0 ile 4095 arasındadır.

Joystick’i herhangi bir yöne hareket ettirdiğinizde, hem VRX hem de VRY pinlerindeki voltaj, konumun her bir eksen üzerindeki projeksiyonuna (izdüşümüne) bağlı olarak değişir.

Joystick’e yukarıdan aşağıya doğru bastırdığınızda, içindeki buton (pushbutton) kapanır. Eğer SW pininde bir pull-up direnci kullanırsak, SW pininden gelen çıkış 5V’tan 0V’a düşer $\Rightarrow$ ESP32’nin dijital pinindeki okuma değeri HIGH (Yüksek) seviyesinden LOW (Düşük) seviyesine geçer.

Servo Motor

Servo motor, 0-180 derece aralığında hassas açı kontrolü sağlayan bir aktüatördür. Üç bağlantı ucu bulunur:

  • VCC (Kırmızı): Güç beslemesi (5V veya 6V)
  • GND (Siyah/Kahverengi): Toprak bağlantısı
  • Sinyal (Sarı/Turuncu): PWM kontrol sinyali girişi

ESP32Servo Kütüphanesi

ESP32’nin servo motor kontrolü için ESP32Servo kütüphanesi gereklidir. Bu kütüphane, ESP32’nin LEDC donanımını kullanarak servo motorlar için uygun PWM sinyalleri (50Hz, 1-2ms darbe genişliği) üretir.

Adım 2 – GPIO Pin Atamaları

Projede kullanılan pin atamaları:

  • GPIO 36 (ADC1_CH0): Joystick VRX (X ekseni) analog giriş pini
  • GPIO 39 (ADC1_CH3): Joystick VRY (Y ekseni) analog giriş pini
  • GPIO 13: X ekseni servo motor sinyal pini
  • GPIO 25: Y ekseni servo motor sinyal pini

Önemli: GPIO 34, 35, 36 ve 39 pinleri ESP32’de yalnızca giriş (input) olarak kullanılabilir ve dahili pull-up/pull-down dirençleri bulunmaz.

Adım 3 – Devre Bağlantısı

Joystick Modülü Bağlantısı:

  1. Joystick VCC pinini ESP32 3.3V pinine bağlayın.
  2. Joystick GND pinini ESP32 GND pinine bağlayın.
  3. Joystick VRX pinini ESP32 GPIO 36 pinine bağlayın.
  4. Joystick VRY pinini ESP32 GPIO 39 pinine bağlayın.

Servo Motor Bağlantıları:

  1. Her iki servo motorun VCC (kırmızı) kablolarını harici 5V güç kaynağına bağlayın.
  2. Her iki servo motorun GND (siyah/kahverengi) kablolarını hem ESP32 GND’ye hem de harici güç kaynağının GND’sine bağlayın (ortak toprak).
  3. X ekseni servo motorunun sinyal (sarı/turuncu) kablosunu ESP32 GPIO 13 pinine bağlayın.
  4. Y ekseni servo motorunun sinyal (sarı/turuncu) kablosunu ESP32 GPIO 25 pinine bağlayın.

Uyarı: Servo motorlar yüksek akım çeker. ESP32’nin dahili regülatörü üzerinden beslemek kararsız çalışmaya veya kartın zarar görmesine neden olabilir. Harici 5V/2A güç kaynağı kullanılması önerilir.

Adım 4 – Arduino IDE Hazırlığı

Arduino IDE’yi açın ve aşağıdaki ayarları kontrol edin:

  • Board: ESP32 geliştirme kartınızın modeli (Örn: DOIT ESP32 DEVKIT V1)
  • Port: ESP32’nin bağlı olduğu COM portu
  • ESP32 Paketi: Board Manager’dan “esp32” paketinin yüklü olduğundan emin olun
  • ESP32Servo Kütüphanesi: Kütüphane Yöneticisi’nden “ESP32Servo” kütüphanesini yükleyin
  • ADC Ayarları: analogSetAttenuation(ADC_11db) ile ADC’nin 0-3.3V aralığını okuyabilmesi sağlanır

Adım 5 – Kodu Yükleyin

Aşağıdaki kodu Arduino IDE editörüne yapıştırın ve ESP32 kartınıza yükleyin:

/*
 * Bu ESP32 kodu esp32io.com tarafından oluşturulmuştur.
 *
 * Bu ESP32 kodu kamu malı (public domain) olarak paylaşılmıştır.
 *
 * Daha fazla detay (talimatlar ve kablolama diyagramı) için şu adresi ziyaret edin: 
 * https://esp32io.com/tutorials/esp32-joystick-servo-motor
 */

#include <ESP32Servo.h>

#define VRX_PIN      36 // Joystick VRX pinine bağlı ESP32 GPIO36 (ADC0) pini
#define VRY_PIN      39 // Joystick VRY pinine bağlı ESP32 GPIO39 (ADC0) pini
#define SERVO_X_PIN  13 // Servo motor 1'e bağlı ESP32 GPIO13 pini
#define SERVO_Y_PIN  25 // Servo motor 2'e bağlı ESP32 GPIO25 pini

Servo xServo;  // 1. servoyu kontrol etmek için servo nesnesi oluştur
Servo yServo;  // 2. servoyu kontrol etmek için servo nesnesi oluştur

void setup() {
  Serial.begin(9600);

  // ADC zayıflatmasını 11 dB olarak ayarla (~3.3V giriş seviyesine kadar)
  analogSetAttenuation(ADC_11db);
  xServo.attach(SERVO_X_PIN);
  yServo.attach(SERVO_Y_PIN);
}

void loop() {
  // X ve Y analog değerlerini oku
  int valueX = analogRead(VRX_PIN);
  int valueY = analogRead(VRY_PIN);

  // Değerleri servonun açısına göre ölçeklendir (0 - 4095 arasını 0 - 180 dereceye çevir)
  int xAngle = map(valueX, 0, 4095, 0, 180); 
  int yAngle = map(valueY, 0, 4095, 0, 180); 

  xServo.write(xAngle); // 1. servo motoru döndür
  yServo.write(yAngle); // 2. servo motoru döndür

  // Verileri Arduino IDE Seri Monitörüne yazdır
  Serial.print("Joystick: ");
  Serial.print(valueX);
  Serial.print(", ");
  Serial.print(valueY);
  Serial.print(" => Servo Motor: ");
  Serial.print(xAngle);
  Serial.print("°, ");
  Serial.print(yAngle);
  Serial.println("°");
}

Kod Nasıl Çalışır

Kütüphane ve Tanımlar

  • #include <ESP32Servo.h>: ESP32 için optimize edilmiş servo kontrol kütüphanesini projeye dahil eder.
  • #define direktifleri ile joystick ve servo pinleri sabit olarak tanımlanır; kodun okunabilirliği ve bakımı kolaylaşır.
  • Servo xServo; ve Servo yServo;: Her bir servo motor için ayrı nesne örnekleri oluşturulur.

Setup Fonksiyonu

  • Serial.begin(9600): Serial iletişim başlatılır; hata ayıklama ve veri izleme için kullanılır.
  • analogSetAttenuation(ADC_11db): ADC giriş aralığı 0-3.3V olacak şekilde yapılandırılır; joystick sinyallerinin doğru okunmasını sağlar.
  • xServo.attach(SERVO_X_PIN) ve yServo.attach(SERVO_Y_PIN): Servo nesneleri belirtilen PWM pinlerine bağlanır ve servo motorlar için gerekli sinyal parametreleri otomatik olarak ayarlanır.

Loop Fonksiyonu

  • analogRead(VRX_PIN) ve analogRead(VRY_PIN): Joystick’in X ve Y eksenlerinden 12-bit çözünürlükte analog değerler okunur (0-4095).
  • map(value, 0, 4095, 0, 180): Okunan her bir analog değer lineer olarak 0-180 derece aralığına dönüştürülür.
  • xServo.write(xAngle) ve yServo.write(yAngle): Her bir servo motor kendi eksenine karşılık gelen hedef açıya konumlandırılır.
  • Serial.print/println: Gerçek zamanlı veri izleme için joystick ham değerleri ve hesaplanan servo açıları Serial Monitor’e yazdırılır.
  • delay() kullanılmamıştır; döngü maksimum tepki hızı için sürekli çalışır. Gerektiğinde delay(10-50) eklenebilir.

Adım 6 – Test Edin

Kod yüklendikten sonra:

  1. Arduino IDE’de Serial Monitor’ü açın (9600 baud).
  2. Joystick’i merkez konumuna getirin; her iki servo motor yaklaşık 90 derece konumunda olmalıdır.
  3. Joystick’i X ekseni boyunca hareket ettirin; X ekseni servo motorunun 0-180 derece aralığında döndüğünü gözlemleyin.
  4. Joystick’i Y ekseni boyunca hareket ettirin; Y ekseni servo motorunun 0-180 derece aralığında döndüğünü gözlemleyin.
  5. Serial Monitor’de “Joystick: [X], [Y] => Servo Motor: [X]°, [Y]°” formatında güncellenen verileri kontrol edin.
  6. Servo motorlar tepki vermiyorsa güç bağlantılarını, ortak toprak bağlantısını ve pin atamalarını doğrulayın.

İsteğe Bağlı Geliştirmeler

Temel işlevi tamamladıktan sonra projeyi aşağıdaki şekilde genişletebilirsiniz:

  • Ölü Bölge (Dead Zone): Joystick merkezindeki küçük sapmaları yok saymak için eşik değer aralığı tanımlayın.
  • Ters Yön Ayarı: Joystick hareket yönü ile servo hareket yönünü eşleştirmek için map() çıkış aralığını ters çevirin (180, 0).
  • Açı Sınırlama: Servo motorların mekanik sınırlarına uygun olarak hareket aralığını daraltın (Örn: 20-160 derece).
  • Joystick Butonu: SW pinini dijital giriş olarak okuyarak servo motorları merkez konumuna sıfırlama özelliği ekleyin.
  • Yumuşak Geçiş: Servo hareketlerini yumuşatmak için hedef açıya kademeli yaklaşım algoritması uygulayın.

ESP32 Joystick-Servo Projesi SSS

S: Servo motorlar titreşiyor veya kararlı durmuyor.
C: Güç kaynağı yetersiz olabilir. İki servo motor aynı anda yüksek akım çeker; harici 5V/3A güç kaynağı kullanın ve ESP32 ile ortak toprak bağlantısı yaptığınızdan emin olun.

S: Joystick merkezdeyken servo motorlar 90 derecede durmuyor.
C: Joystick potansiyometrelerinde fabrikasyon toleranslar olabilir. Merkez değeri okuyarak map() fonksiyonunda giriş aralığını kalibre edebilir veya yazılımsal ofset ekleyebilirsiniz.

S: analogSetAttenuation(ADC_11db) neden gerekli?
C: ESP32 ADC’si varsayılan olarak 0-1V aralığında en iyi çözünürlüğe sahiptir. 11 dB attenuasyon ile giriş aralığı ~3.9V’a kadar genişletilir; bu sayede 3.3V referanslı joystick okumaları doğru yapılır.

S: ESP32Servo yerine standart Servo kütüphanesi kullanabilir miyim?
C: Hayır. Standart Arduino Servo kütüphanesi ESP32 donanımı ile tam uyumlu değildir. ESP32 için optimize edilmiş ESP32Servo kütüphanesi kullanılmalıdır.

S: Joystick değerleri çok hassas veya çok kaba tepki veriyor.
C: ADC okumalarında oluşan gürültüyü azaltmak için birden fazla okumanın ortalamasını alabilir veya map() fonksiyonunda giriş aralığını daraltarak hassasiyeti ayarlayabilirsiniz.

S: Farklı GPIO pinleri kullanabilir miyim?
C: Evet. Analog giriş için ADC1 kanalına ait GPIO 32, 33, 34, 35, 36, 39 pinleri kullanılabilir. PWM çıkışı için ise çoğu GPIO pini uygundur; ancak GPIO 34-39 gibi sadece giriş destekleyen pinleri servo sinyali için kullanmayın.

Leave a Reply

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir