Joystick Modülü Kullanımı: Arduino ile X-Y Ekseni ve Buton Okuma
Analog joystick modülü (KY-023) nasıl çalışır? VRx, VRy ve SW pinleri, Arduino bağlantısı, ölü bölge ve kalibrasyon, yön algılama, joystick ile servo kontrolü, ESP32 ve Pico kodu.
Joystick modülü, oyun konsollarının kollarında gördüğün başparmak joystick'inin Arduino'ya uygun hâlidir. Kolu sağa-sola ve ileri-geri hareket ettirdikçe iki eksende konum bilgisi verir; kolun üstüne bastığında ise içindeki bir buton çalışır. Robot araba kumandaları, kamera yönlendiren pan-tilt mekanizmaları, LED matris oyunları ve ekran menüleri için en pratik giriş elemanıdır. En yaygın modeli KY-023 olarak da bilinir.

Joystick modülü nasıl çalışır?
Kolun altında birbirine dik yerleştirilmiş iki adet 10 kΩ potansiyometre bulunur: biri X eksenindeki, diğeri Y eksenindeki hareketi algılar. Her potansiyometre bir gerilim bölücü gibi çalışır; kol ortadayken orta uçtan yaklaşık 2,5 V gelir ve analogRead() yaklaşık 512 okur. Kolu bir uca ittiğinde değer 0'a, diğer uca ittiğinde 1023'e yaklaşır. Kola yukarıdan bastığında ise küçük bir buton SW pinini GND'ye bağlar.
| Kolun konumu | VRx (X) | VRy (Y) |
|---|---|---|
| Ortada (serbest) | ~512 | ~512 |
| Tam sol | ~0 | ~512 |
| Tam sağ | ~1023 | ~512 |
| Tam yukarı | ~512 | ~0 |
| Tam aşağı | ~512 | ~1023 |
Hangi yönün 0, hangisinin 1023 olduğu modülü nasıl tuttuğuna göre değişir. Pinler sana bakacak şekilde tuttuğunda yönler bu tablodan farklıysa telaşlanma; kodda değeri 1023'ten çıkararak ekseni kolayca ters çevirebilirsin.
Joystick pin bağlantısı
| Pin | Görevi | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|---|
| GND | Toprak | GND | GND | GND |
| +5V | Besleme | 5V | 3V3 | 3V3 |
| VRx | X ekseni (analog) | A0 | GPIO 34 | GP26 |
| VRy | Y ekseni (analog) | A1 | GPIO 35 | GP27 |
| SW | Buton (basınca GND) | D2 | GPIO 25 | GP15 |
Arduino ile joystick okuma
Aşağıdaki kod iki ekseni ve butonu okuyup Seri Monitör'e yazar. Butonun ucu basılınca GND'ye bağlandığı ve çoğu modülde pull-up direnci olmadığı için SW pini mutlaka INPUT_PULLUP olarak tanımlanmalıdır; böylece buton serbestken HIGH, basılıyken LOW okunur.
1const int X_PIN = A0;
2const int Y_PIN = A1;
3const int SW_PIN = 2;
4
5void setup() {
6 pinMode(SW_PIN, INPUT_PULLUP); // basınca LOW / LOW when pressed
7 Serial.begin(9600);
8}
9
10void loop() {
11 int x = analogRead(X_PIN); // 0–1023, ortada ~512 / ~512 at center
12 int y = analogRead(Y_PIN);
13 bool pressed = digitalRead(SW_PIN) == LOW;
14
15 Serial.print("X: "); Serial.print(x);
16 Serial.print(" Y: "); Serial.print(y);
17 Serial.print(" Buton / button: ");
18 Serial.println(pressed ? "basılı / pressed" : "-");
19 delay(100);
20}Ölü bölge ve kalibrasyon
Gerçek hayatta kol serbestken değer tam 512 olmaz; 495 ya da 525 gibi bir değer okur ve birkaç birim titrer. Bunu düzeltmezsen joystick'e dokunmadığın hâlde robot araban yavaşça ilerler ya da servo hafifçe kıpırdar. Çözüm iki adımlıdır: açılışta merkez değeri ölçüp kaydetmek (kalibrasyon) ve merkeze çok yakın küçük sapmaları yok saymak (ölü bölge). Aşağıdaki fonksiyon her ekseni -100 ile +100 arasında, ortası tam 0 olan temiz bir değere çevirir:
1int centerX, centerY;
2const int DEAD_ZONE = 40;
3
4int readAxis(int pin, int center) {
5 int v = analogRead(pin) - center;
6 if (abs(v) < DEAD_ZONE) return 0; // ölü bölge / dead zone
7 if (v > 0) return map(v, DEAD_ZONE, 1023 - center, 0, 100); // sağ ya da aşağı / right or down
8 return map(v, -center, -DEAD_ZONE, -100, 0); // sol ya da yukarı / left or up
9}
10
11void setup() {
12 Serial.begin(9600);
13 centerX = analogRead(A0); // açılışta joystick'e dokunma / don't touch it at startup
14 centerY = analogRead(A1);
15}
16
17void loop() {
18 Serial.print(readAxis(A0, centerX));
19 Serial.print(", ");
20 Serial.println(readAxis(A1, centerY));
21 delay(50);
22}Yön algılama: yukarı, aşağı, sol, sağ
Oyunlarda ve menülerde çoğu zaman tam konum değil yalnızca yön gerekir. Değerleri iki eşikle karşılaştırarak joystick'i dört yönlü bir yön tuşuna çevirebilirsin. Menüde gezinmek için bir yönün tek bir adım sayılması istenir; bu yüzden kodda kısa bir bekleme kullanılır ya da kol tekrar ortaya dönene kadar yeni adım alınmaz.
1void loop() {
2 int x = analogRead(A0);
3 int y = analogRead(A1);
4 if (x < 300) Serial.println("Sol / left");
5 else if (x > 700) Serial.println("Sağ / right");
6 else if (y < 300) Serial.println("Yukarı / up");
7 else if (y > 700) Serial.println("Aşağı / down");
8 delay(150);
9}Joystick ile servo motor kontrolü
Joystick'in bir eksenini 0–180 derece arasına çevirerek bir servo motoru elle yönlendirebilirsin; iki eksen ve iki servoyla kamerayı sağa-sola ve yukarı-aşağı çeviren bir pan-tilt mekanizması kurulur. Servo bağlantısı ve besleme uyarıları için Servo Motor Nedir? yazısına bak.
1#include <Servo.h>
2
3Servo panServo;
4
5void setup() {
6 panServo.attach(9);
7}
8
9void loop() {
10 int x = analogRead(A0);
11 int angle = map(x, 0, 1023, 0, 180); // joystick → açı / joystick → angle
12 panServo.write(angle);
13 delay(15);
14}ESP32 ve Raspberry Pi Pico ile joystick
ESP32'nin ADC'si 12 bittir ve 0–4095 arası değer verir; ancak ADC doğrusal olmadığı için merkez değer çoğu zaman 2048 yerine 1800–1950 civarında çıkar. Bu yüzden yukarıdaki kalibrasyon yöntemi ESP32'de daha da önemlidir. Wi-Fi kullanacaksan eksenleri ADC1 pinlerine (GPIO 32–39) bağla. Pico'da analog girişler GP26–GP28'dir ve read_u16() 0–65535 arası değer döndürür:
1from machine import ADC, Pin
2import time
3
4x_axis = ADC(26) # GP26 → VRx
5y_axis = ADC(27) # GP27 → VRy
6button = Pin(15, Pin.IN, Pin.PULL_UP) # SW, basınca 0 / 0 when pressed
7
8while True:
9 x = x_axis.read_u16() # 0–65535, ortada ~32768 / ~32768 at center
10 y = y_axis.read_u16()
11 print(x, y, "BASILI / PRESSED" if button.value() == 0 else "")
12 time.sleep(0.1)Joystick ile proje fikirleri
- Robot araba kumandası: Joystick'i bir verici karta bağla, nRF24L01 ya da Bluetooth ile arabaya komut gönder.
- Pan-tilt kamera: İki servo ve bir joystick'le kamerayı her yöne çevir.
- LED matrisinde yılan oyunu: 8x8 matriste yılanı joystick'le yönlendir.
- Ekran menüsü: Yukarı-aşağı ile seçenekler arasında gezin, butona basarak seç; ekran tarafı için I2C LCD Ekran Kullanımı.
- Renk seçici: X ekseniyle rengi, Y ekseniyle parlaklığı ayarlayarak bir RGB LED'i kontrol et.
- Bilgisayar faresi: Arduino Leonardo ya da Pro Micro ile joystick'i gerçek bir USB fareye dönüştür.
Sık yapılan hatalar ve çözümleri
- Buton basılmadan basılı görünüyor: SW pini INPUT_PULLUP değil; pin havada kaldığı için rastgele değer okunur.
- Kol serbestken değer 512 değil ve titriyor: Bu normaldir; açılışta kalibrasyon yap ve ölü bölge ekle.
- Eksenler ters ya da yer değiştirmiş: Modülün yönünden kaynaklanır; değeri 1023'ten çıkar ya da VRx ile VRy kablolarını değiştir.
- ESP32'de merkez 2048 değil: ESP32 ADC'si doğrusal değildir; merkezi açılışta ölç ve ona göre hesapla.
- Servo titriyor ya da Arduino yeniden başlıyor: Servo Arduino'nun 5 V'unu zorluyor; servoyu ayrı bir 5 V kaynaktan besle ve GND'leri birleştir.
Joystick aslında iki potansiyometre ve bir butondan ibarettir; bu yüzden Potansiyometre Nedir? ve Arduino'ya Buton Nasıl Bağlanır? yazıları burada öğrendiklerini pekiştirir. BlueGrays uygulamasında joystick ile LED ve servo kontrolü ile LED matris yılan oyunu projelerini devre şemaları ve kodlarıyla bulabilirsin.
Sıkça sorulan sorular
Joystick modülünün pinleri ne işe yarar?
GND ve +5V besleme pinleridir. VRx ve VRy, X ve Y eksenlerindeki konumu analog gerilim olarak verir ve analog pinlere bağlanır. SW ise kola basınca GND'ye bağlanan buton çıkışıdır ve INPUT_PULLUP ile bir dijital pine bağlanır.
Joystick ortadayken neden tam 512 göstermiyor?
Potansiyometreler ve mekanik parçalar mükemmel değildir; serbest konumda değer genelde 490–530 arasında bir yerde durur ve birkaç birim titrer. Açılışta merkez değeri ölçüp kaydetmek ve ±30–50'lik bir ölü bölge kullanmak bu sorunu çözer.
SW pini neden rastgele LOW ve HIGH oluyor?
Çoğu joystick modülünde butonun pull-up direnci yoktur, bu yüzden pin bağlanmamış gibi havada kalır. pinMode(SW_PIN, INPUT_PULLUP) ile Arduino'nun dahili pull-up direncini açarsan buton serbestken HIGH, basılıyken LOW okursun.
Bir joystick ile kaç servo kontrol edebilirim?
Bir joystick'in iki ekseni olduğu için iki servoyu bağımsız kontrol edebilirsin; bu, pan-tilt kamera için idealdir. Daha fazla servo için ikinci bir joystick eklersin; Arduino Uno'nun 6 analog pini üç joystick'e kadar yeter.
Joystick'i kablosuz kumanda olarak kullanabilir miyim?
Evet. Joystick'i bir Arduino'ya bağlayıp değerleri nRF24L01 radyo modülü, HC-05 Bluetooth modülü ya da iki ESP32 arasında ESP-NOW ile başka bir karta gönderebilirsin. Robot araba ve uzaktan kumandalı projelerin çoğu bu yöntemle yapılır.
Joystick modülü ESP32 ve Raspberry Pi Pico ile çalışır mı?
Evet, ama modülü 3V3 pininden beslemelisin. ESP32'de değerler 0–4095, Pico'da 0–65535 arasındadır. ESP32'de Wi-Fi açıkken çalışan ADC1 pinlerini (GPIO 32–39) kullan ve merkez değeri açılışta kalibre et.
Bu yazıdan sonra yapabileceğin projeler
Tüm projeleri gör
Joystick İle Led Kontrol
Joystick modülünün X ve Y eksen değerlerine göre 4 farklı yönde LED'leri yakan kontrol projesi. Analog joystick okuma ve yön algılama mantığını öğretir.

Joystick İle Servo Kontrol
Joystick modülü ile iki servo motoru X ve Y eksenlerinde bağımsız olarak kontrol eden pan-tilt projesi. Joystick-servo entegrasyonu ve konum takibi mantığını öğretir.

Piksel Yılan: 8x8 Matris
Arduino tabanlı, 8x8 WS2812B NeoPixel LED matris ve analog joystick kullanılarak geliştirilmiş donanımsal yılan oyunudur. Sınırlı oyun alanı için özel olarak kalibre edilmiş dinamik hız algoritması ve

Matris Yılan 16x16
Klasik yılan oyununun 16x16 WS2812B NeoPixel matris üzerinde çalışan, 256 piksellik genişletilmiş donanım portudur. Arduino ve analog joystick ile kontrol edilen bu projede, genişletilmiş ızgara (grid

ESP32 Servo Motor (Potansiyometre Kontrolü)
Bu projede potansiyometre ile SG90 servo motoru kontrol ediyoruz. Potansiyometreden okunan analog değeri 0-180 derece aralığına map'leyerek servo açısını ayarlıyoruz. ESP32Servo kütüphanesi sayesinde ESP32'nin herhangi bir GPIO'su PWM sinyali üretebiliyor. Bu, robotik kollar, kamera gimbal'ları ve otomatik kapı mekanizmaları için temel bir kontrol yöntemidir.

Pong Oyunu - SSD1306
Arduino ve SSD1306 OLED ekran kullanılarak hazırlanmış; topun hareketlerini anlık olarak takip edip yörüngesine göre tepki veren otonom yapay zeka (CPU) rakibiyle donatılmış ve ses efektleriyle zengin

OLED T-Rex Run: Arduino Dinazor Oyunu 🦖
Efsanevi "İnternet Yok" dinozor oyununu donanıma taşıdık! Arduino, OLED ekran (SH1106/SSD1306) ve TM1637 skor göstergesi kullanarak geliştirdiğimiz bu projeyle retro oyun heyecanını fiziksel bir mini

Arduino LCD Koşucu Oyunu
6x2 karakter LCD ekranda çalışan yandan kaydırmalı sonsuz koşucu oyunu. Kahraman otomatik olarak koşar, oyuncu butona basarak engellerin üzerinden zıplar. Alt ve üst sırada rastgele engeller oluşur. Pasif buzzer ile açılış melodisi, zıplama sesi, 50 puan kutlama sesi ve oyun sonu melodisi çalar. Açılışta "BlueGrays — Arduino Projects" splash ekranı gösterilir. Skor ekranın sağ üst köşesinde anlık olarak güncellenir.
Diğer yazılar
Joystick'in içindeki iki potansiyometreyi ve butonu okumayı, merkez kaymasını ölü bölgeyle düzeltmeyi, yön algılamayı ve joystick'le servo motor kontrol etmeyi öğren.

