Komponen · 4 mnt baca

Cara Memakai Modul Joystick: Membaca Sumbu X-Y dan Tombol dengan Arduino

Bagaimana cara kerja modul joystick analog (KY-023)? Pin VRx, VRy, dan SW, pengkabelan Arduino, dead zone dan kalibrasi, deteksi arah, kendali servo dengan joystick, serta kode ESP32 dan Pico.

Modul joystick adalah versi ramah Arduino dari stik jempol yang kamu lihat di controller game. Ketika stiknya kamu gerakkan ke kiri-kanan dan maju-mundur, modul ini melaporkan posisinya di dua sumbu, dan ketika stiknya kamu tekan ke bawah, tombol di dalamnya terpicu. Ini input paling praktis untuk remote mobil robot, dudukan kamera pan-tilt, game di matriks LED, dan menu di layar. Model yang paling umum juga dikenal dengan nama KY-023.

Modul joystick analog KY-023
Modul joystick analog: berisi dua potensiometer untuk dua sumbu dan tombol yang bekerja ketika stik ditekan; punya 5 pin: GND, +5V, VRx, VRy, dan SW.

Bagaimana cara kerja modul joystick?

Di bawah stik ada dua potensiometer 10 kΩ yang dipasang tegak lurus satu sama lain: satu mendeteksi gerakan di sumbu X, satunya lagi di sumbu Y. Setiap potensiometer berfungsi sebagai pembagi tegangan; ketika stik di tengah, wiper-nya memberi sekitar 2,5 V dan analogRead() membaca sekitar 512. Dorong stik ke satu ujung dan nilainya mendekati 0; dorong ke ujung lain dan nilainya mendekati 1023. Tekan stik ke bawah dan tombol kecil akan menghubungkan pin SW ke GND.

Posisi stikVRx (X)VRy (Y)
Tengah (dilepas)~512~512
Penuh ke kiri~0~512
Penuh ke kanan~1023~512
Penuh ke atas~512~0
Penuh ke bawah~512~1023

Arah mana yang memberi 0 dan mana yang memberi 1023 tergantung cara kamu memegang modul. Kalau arahnya berbeda dari tabel ini ketika pin menghadap ke arahmu, tidak perlu khawatir; kamu bisa dengan mudah membalik sumbu di kode dengan mengurangkan nilainya dari 1023.

Pinout dan pengkabelan joystick

PinFungsiArduino UnoESP32Raspberry Pi Pico
GNDGroundGNDGNDGND
+5VDaya5V3V33V3
VRxSumbu X (analog)A0GPIO 34GP26
VRySumbu Y (analog)A1GPIO 35GP27
SWTombol (ke GND ketika ditekan)D2GPIO 25GP15
Di ESP32 dan Pico, beri daya modul dari pin 3V3, bukan 5V; walaupun pinnya berlabel “+5V”, modul ini bekerja dengan baik di 3,3 V. Kalau kamu memberinya daya 5 V, pin analog akan menerima lebih dari 3,3 V dan board bisa rusak. Di ESP32, jangan pakai pin 34–39 untuk SW; pin-pin itu tidak punya resistor pull-up internal.

Membaca joystick dengan Arduino

Kode di bawah membaca kedua sumbu dan tombol lalu menampilkannya di Serial Monitor. Karena tombol terhubung ke GND ketika ditekan dan sebagian besar modul tidak punya resistor pull-up, pin SW harus diatur sebagai INPUT_PULLUP; dengan begitu pin membaca HIGH ketika dilepas dan LOW ketika ditekan.

C++ (Arduino IDE)
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}
Kalau kamu membuka Serial Plotter, kamu bisa melihat kedua sumbu di grafik yang sama. Mengamati kedua garis berubah ketika kamu memutar stik pelan-pelan adalah cara tercepat untuk memahami arah setiap sumbu.

Dead zone dan kalibrasi

Di dunia nyata, nilainya tidak tepat 512 ketika stik dilepas; pembacaannya bisa sekitar 495 atau 525 dan bergoyang beberapa angka. Kalau ini tidak dikoreksi, mobil robotmu merayap maju atau servo bergetar walaupun joystick tidak kamu sentuh. Solusinya ada dua langkah: ukur dan simpan nilai tengah ketika program mulai (kalibrasi), lalu abaikan simpangan kecil di dekat titik tengah (dead zone). Fungsi di bawah mengubah setiap sumbu menjadi nilai bersih dari -100 sampai +100 dengan titik tengah tepat di 0:

C++ (Arduino IDE)
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}

Mendeteksi arah: atas, bawah, kiri, kanan

Di game dan menu, sering kali kamu hanya butuh arah, bukan posisi persisnya. Dengan membandingkan nilainya terhadap dua ambang, kamu bisa mengubah joystick menjadi tombol arah empat arah. Untuk navigasi menu, setiap dorongan sebaiknya dihitung sebagai satu langkah, jadi kodenya memakai jeda singkat, atau mengabaikan langkah baru sampai stik kembali ke tengah.

C++ (Arduino IDE)
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}

Mengendalikan motor servo dengan joystick

Dengan memetakan satu sumbu joystick ke 0–180 derajat, kamu bisa mengarahkan motor servo secara manual; dengan dua sumbu dan dua servo, kamu mendapat dudukan pan-tilt yang memutar kamera ke kiri-kanan dan atas-bawah. Untuk pengkabelan servo dan peringatan soal daya, lihat Apa Itu Motor Servo?

C++ (Arduino IDE)
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}

Joystick dengan ESP32 dan Raspberry Pi Pico

ADC ESP32 adalah 12-bit dan memberi nilai dari 0 sampai 4095, tetapi karena ADC-nya tidak linear, nilai tengahnya sering keluar di sekitar 1800–1950, bukan 2048. Itu membuat metode kalibrasi di atas makin penting di ESP32. Kalau kamu akan memakai Wi-Fi, hubungkan sumbu ke pin ADC1 (GPIO 32–39). Di Pico, input analognya adalah GP26–GP28, dan read_u16() mengembalikan nilai dari 0 sampai 65535:

MicroPython
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)

Ide proyek dengan joystick

  • Remote mobil robot: hubungkan joystick ke board pemancar dan kirim perintah ke mobil lewat nRF24L01 atau Bluetooth.
  • Kamera pan-tilt: arahkan kamera ke segala arah dengan dua servo dan satu joystick.
  • Game ular di matriks LED: kendalikan ular di matriks 8x8 dengan joystick.
  • Menu di layar: berpindah antarpilihan dengan atas dan bawah lalu pilih dengan tombol; untuk bagian layarnya, lihat Cara Memakai Layar LCD I2C.
  • Pemilih warna: kendalikan LED RGB dengan mengatur warna lewat sumbu X dan kecerahan lewat sumbu Y.
  • Mouse komputer: ubah joystick menjadi mouse USB sungguhan dengan Arduino Leonardo atau Pro Micro.

Kesalahan umum dan cara mengatasinya

  • Tombol terbaca ditekan padahal tidak: pin SW tidak diatur INPUT_PULLUP; pinnya mengambang, jadi membaca nilai acak.
  • Nilainya bukan 512 ketika diam dan bergoyang: ini normal; lakukan kalibrasi ketika program mulai dan tambahkan dead zone.
  • Sumbunya terbalik atau tertukar: ini soal orientasi modul; kurangkan nilainya dari 1023 atau tukar kabel VRx dan VRy.
  • Titik tengah di ESP32 bukan 2048: ADC ESP32 tidak linear; ukur titik tengah ketika program mulai dan hitung dari nilai itu.
  • Servo bergetar atau Arduino reset: servo membebani 5 V Arduino secara berlebihan; beri daya servo dari catu daya 5 V terpisah dan satukan ground-nya.

Joystick sebenarnya hanyalah dua potensiometer dan satu tombol, jadi Apa Itu Potensiometer? dan Cara Menghubungkan Push Button ke Arduino akan memperkuat apa yang kamu pelajari di sini. Di aplikasi BlueGrays kamu akan menemukan proyek kendali LED dan servo dengan joystick serta game ular di matriks LED, lengkap dengan skema rangkaian dan kode.

Pertanyaan umum

Apa fungsi pin-pin modul joystick?

GND dan +5V adalah pin daya. VRx dan VRy memberi posisi di sumbu X dan Y sebagai tegangan analog dan dihubungkan ke pin analog. SW adalah output tombol, yang terhubung ke GND ketika stik ditekan, dan dihubungkan ke pin digital yang diatur sebagai INPUT_PULLUP.

Kenapa joystick-ku tidak membaca tepat 512 ketika di tengah?

Potensiometer dan bagian mekanisnya tidak sempurna; ketika diam, nilainya biasanya berada di antara 490 dan 530 dan bergoyang beberapa angka. Mengukur dan menyimpan nilai tengah ketika program mulai serta memakai dead zone ±30–50 menyelesaikan masalah ini.

Kenapa pin SW berganti-ganti antara LOW dan HIGH secara acak?

Sebagian besar modul joystick tidak punya resistor pull-up untuk tombolnya, jadi pinnya mengambang seolah-olah tidak terhubung. Aktifkan pull-up internal Arduino dengan pinMode(SW_PIN, INPUT_PULLUP), dan kamu akan membaca HIGH ketika dilepas dan LOW ketika ditekan.

Berapa banyak servo yang bisa dikendalikan dengan satu joystick?

Joystick punya dua sumbu, jadi kamu bisa mengendalikan dua servo secara terpisah, ideal untuk kamera pan-tilt. Untuk lebih banyak servo, tambahkan joystick kedua; 6 pin analog Arduino Uno cukup untuk sampai tiga joystick.

Bisakah joystick dipakai sebagai remote nirkabel?

Bisa. Hubungkan joystick ke satu Arduino lalu kirim nilainya ke board lain dengan modul radio nRF24L01, modul Bluetooth HC-05, atau ESP-NOW di antara dua ESP32. Sebagian besar proyek mobil robot dan remote control dibuat dengan cara ini.

Apakah modul joystick bisa dipakai dengan ESP32 dan Raspberry Pi Pico?

Bisa, tetapi beri daya dari pin 3V3. Nilainya berkisar dari 0 sampai 4095 di ESP32 dan dari 0 sampai 65535 di Pico. Di ESP32, pakai pin ADC1 (GPIO 32–39) yang tetap berfungsi ketika Wi-Fi aktif, dan kalibrasi nilai tengah ketika program mulai.

Lihat semua proyek
Kendali LED dengan Joystick
#59Menengah
Premium

Kendali LED dengan Joystick

Dorong tuas kecil joystick sampai mentok ke arah mana pun dan LED untuk arah itu menyala: ada empat warna berbeda untuk kanan, kiri, atas, dan bawah. Lepaskan tuasnya, ia kembali ke tengah dan semua L

4.7(50)
67
Kendali Servo dengan Joystick
#60Menengah
Premium

Kendali Servo dengan Joystick

Arahkan dua motor dengan joystick, persis seperti memutar kamera keamanan. Dorong tuas ke kiri atau kanan dan servo bawah berputar perlahan, dorong ke atas atau bawah dan servo atas mendongak dan menu

4.7(42)
58
Ular Piksel Matrix 8x8
#88Mahir
Premium

Ular Piksel Matrix 8x8

Buat sendiri dan mainkan game ular klasik. Di matrix lampu 8x8 yang berwarna-warni, kamu mengarahkan ular hijau dengan joystick dan memakan apel merah; di setiap apel ular bertambah panjang, sedikit l

4.7(39)
57
Ular Matrix 16x16
#89Mahir
Premium

Ular Matrix 16x16

Game ular klasik, kali ini di layar LED raksasa dari 256 lampu. Kamu mengarahkan ular hijau dengan joystick dan mengumpulkan apel merah; di setiap apel ular bertambah panjang, skormu naik di layar ang

4.8(52)
67
Motor Servo ESP32 (Kendali Potensiometer)
#118Menengah
Premium

Motor Servo ESP32 (Kendali Potensiometer)

Di proyek ini, kita mengendalikan motor servo SG90 memakai potensiometer. Kita mengatur sudut servo dengan memetakan nilai analog yang dibaca dari potensiometer ke rentang 0–180 derajat. Library ESP32Servo menghasilkan sinyal servo di pin GPIO ESP32 yang sesuai dan bisa menjadi output; proyek ini memakai GPIO 18. Ini metode kendali dasar untuk lengan robot, gimbal kamera, dan mekanisme pintu otomatis.

4.3(29)
42
Game Bola Pemukul - SSD1306
#86Menengah
Premium

Game Bola Pemukul - SSD1306

Satu bola, dua pemukul, dan kamu: kamu bermain tenis meja, salah satu video game paling awal, di layar OLED kecil. Dua tombol menggerakkan pemukulmu di kanan ke atas dan ke bawah, sementara komputer m

4.5(47)
65
OLED T-Rex Run: Game Dinosaurus Arduino
#87Mahir
Premium

OLED T-Rex Run: Game Dinosaurus Arduino

Game dinosaurus yang muncul ketika internetmu putus, sekarang ada di mejamu: dinosaurus berlari di layar OLED kecil, kaktus datang menghampiri, dan kamu melompat dengan satu tombol. Skormu naik secara

4.7(33)
53
Game Lari LCD Arduino
#98Menengah
Premium

Game Lari LCD Arduino

Game lari tanpa akhir yang bergulir ke samping di layar LCD karakter 16x2. Sang jagoan berlari otomatis, dan pemain melompati rintangan dengan menekan tombol. Rintangan acak muncul di baris atas dan bawah. Buzzer pasif memainkan melodi pembuka, suara lompat, suara perayaan 50 poin, dan melodi akhir game. Layar pembuka "BlueGrays - Arduino Projects" tampil ketika mulai. Skor langsung diperbarui di pojok kanan atas layar.

4.6(32)
55