Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124

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.
Analog joystick modülü, iki eksenli (X ve Y) potansiyometre yapısına sahip bir giriş birimidir. Beş bağlantı ucu bulunur:
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, 0-180 derece aralığında hassas açı kontrolü sağlayan bir aktüatördür. Üç bağlantı ucu bulunur:
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.
Projede kullanılan pin atamaları:
Ö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.

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.
Arduino IDE’yi açın ve aşağıdaki ayarları kontrol edin:
analogSetAttenuation(ADC_11db) ile ADC’nin 0-3.3V aralığını okuyabilmesi sağlanırAş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("°");
}
#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.
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.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.Kod yüklendikten sonra:
Temel işlevi tamamladıktan sonra projeyi aşağıdaki şekilde genişletebilirsiniz:
map() çıkış aralığını ters çevirin (180, 0).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.