Perancangan dan Demonstrasi 2 Controller PS2 dengan ESP32 dan LCD 16×2

| Simak vidio selengkapnya

Menggunakan controller PS2 untuk proyek elektronika maupun robotika selalu jadi pilihan favorit banyak hobiis dan engineer. Selain harganya yang ramah di kantong, stik PS2 menyajikan kontrol penuh: belasan tombol digital, dua analog yang responsif, hingga fitur getar.

Kendala yang sering muncul adalah saat kita ingin menghubungkan lebih dari satu stik ke mikroprosesor. Banyak yang bingung mengatur jalur komunikasi datanya agar tidak terjadi bentrokan sinyal (collision) atau delay saat ditekan bersamaan.

Di artikel ini, kita akan bedah tuntas cara menghubungkan dua stik PS2 sekaligus ke satu papan ESP32, lalu memproses datanya secara real-time untuk ditampilkan langsung di layar LCD 16×2 I2C.

| Alat dan Bahan

Controller PS2

Kabel Jumper

LCD 16x2

| Design Wiring

Proses penyambungan kabel harus dilakukan secara teliti. Hal ini bertujuan agar ESP32 bisa membaca data dari kedua stik sekaligus tanpa ada bentrokan sinyal.

skema pin out wiring

| Diagram Blok

Gambar diagram di bawah ini memperlihatkan alur kerja sistem secara singkat, mulai dari input stik hingga output ke layar LCD.

| Implementasi

Berikut adalah panduan pemasangan kabel dari stik PS2 dan LCD ke pin-pin yang ada di ESP32.

Tabel koneksi ESP32 dengan Controller PS2
ESP-32 CONTROLLER 1 CONTROLLER 2
D34
ACK
ACK
NC
NC
D18
CLK
CLK
D5 & D17
ATT
ATT
5V
VCC
VCC
GND
GND
GND
VIBR
VIBR
D23
CMD
CMD
D19
DATA
DATA
Tabel koneksi ESP32 dengan LCD 16×2
ESP-32 LCD 16x2
GND
GND
5V
VCC
D21
SDA
D22
SCL

Hardware

  • Siapkan ESP32, 2 Controller PS2, dan LCD 16×2 I2C.

  • Hubungkan seluruh kabel jumper sesuai tabel koneksi di atas.

  • Pastikan semua pin terpasang kencang agar sinyal tidak goyah.

Software

| Hasil Akhir

Menghubungkan dua stik PS2 ke satu ESP32 ternyata sangat fleksibel dan hemat pin GPIO. Kunci utamanya berada pada penggunaan jalur kabel sharing untuk DATA, CMD, dan CLK, serta memisahkan jalur ATT sebagai penentu target komunikasi. Konfigurasi ini sangat ideal jika Anda ingin membangun proyek seperti robot bertema multiplayer, konsol kustom, hingga sistem otomasi interaktif.

| Code

➕➕
ControllerPS2Code.cpp
#include <PsxControllerBitBang.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

const byte PS1_ATT = 5;
const byte PS2_ATT = 17;
const byte PS_CMD  = 23;
const byte PS_DAT  = 19;
const byte PS_CLK  = 18;

PsxControllerBitBang<PS1_ATT, PS_CMD, PS_DAT, PS_CLK> psx1;
PsxControllerBitBang<PS2_ATT, PS_CMD, PS_DAT, PS_CLK> psx2;

LiquidCrystal_I2C lcd(0x27, 16, 2);

bool stik1Terhubung = false;
bool stik2Terhubung = false;
uint16_t lastButtons1 = 0;
uint16_t lastButtons2 = 0;

String tombolStik1 = "READY";
String tombolStik2 = "READY";

void tampilLCD() {
  lcd.setCursor(0, 0);
  lcd.print("STIK 1=");
  lcd.print(tombolStik1);
  lcd.print("       ");

  lcd.setCursor(0, 1);
  lcd.print("STIK 2=");
  lcd.print(tombolStik2);
  lcd.print("       ");
}

void setup() {
  Serial.begin(115200);
  Wire.begin(21, 22);

  lcd.init();
  lcd.backlight();
  lcd.clear();

  if (psx1.begin()) {
    stik1Terhubung = true;
    Serial.println("Stik 1 terhubung!");
  } else {
    Serial.println("Stik 1 tidak terdeteksi.");
  }
  
  delay(500);

  if (psx2.begin()) {
    stik2Terhubung = true;
    Serial.println("Stik 2 terhubung!");
  } else {
    Serial.println("Stik 2 tidak terdeteksi.");
  }

  tampilLCD();
}

void loop() {
  if (stik1Terhubung && psx1.read()) {
    uint16_t buttons1 = psx1.getButtonWord();
    if (buttons1 != lastButtons1 && buttons1 != 0) {
      if (psx1.buttonPressed(PSB_CROSS)) tombolStik1 = "X";
      else if (psx1.buttonPressed(PSB_CIRCLE)) tombolStik1 = "O";
      else if (psx1.buttonPressed(PSB_SQUARE)) tombolStik1 = "KOTAK";
      else if (psx1.buttonPressed(PSB_TRIANGLE)) tombolStik1 = "SEGITIGA";
      else if (psx1.buttonPressed(PSB_L1)) tombolStik1 = "L1";
      else if (psx1.buttonPressed(PSB_L2)) tombolStik1 = "L2";
      else if (psx1.buttonPressed(PSB_R1)) tombolStik1 = "R1";
      else if (psx1.buttonPressed(PSB_R2)) tombolStik1 = "R2";
      else if (psx1.buttonPressed(PSB_START)) tombolStik1 = "START";
      else if (psx1.buttonPressed(PSB_SELECT)) tombolStik1 = "SELECT";
      else if (psx1.buttonPressed(PSB_PAD_UP)) tombolStik1 = "ATAS";
      else if (psx1.buttonPressed(PSB_PAD_DOWN)) tombolStik1 = "BAWAH";
      else if (psx1.buttonPressed(PSB_PAD_LEFT)) tombolStik1 = "KIRI";
      else if (psx1.buttonPressed(PSB_PAD_RIGHT)) tombolStik1 = "KANAN";

      Serial.print("STIK 1 = ");
      Serial.println(tombolStik1);
      tampilLCD();
    }
    lastButtons1 = buttons1;
  }

  if (stik2Terhubung && psx2.read()) {
    uint16_t buttons2 = psx2.getButtonWord();
    if (buttons2 != lastButtons2 && buttons2 != 0) {
      if (psx2.buttonPressed(PSB_CROSS)) tombolStik2 = "X";
      else if (psx2.buttonPressed(PSB_CIRCLE)) tombolStik2 = "O";
      else if (psx2.buttonPressed(PSB_SQUARE)) tombolStik2 = "KOTAK";
      else if (psx2.buttonPressed(PSB_TRIANGLE)) tombolStik2 = "SEGITIGA";
      else if (psx2.buttonPressed(PSB_L1)) tombolStik2 = "L1";
      else if (psx2.buttonPressed(PSB_L2)) tombolStik2 = "L2";
      else if (psx2.buttonPressed(PSB_R1)) tombolStik2 = "R1";
      else if (psx2.buttonPressed(PSB_R2)) tombolStik2 = "R2";
      else if (psx2.buttonPressed(PSB_START)) tombolStik2 = "START";
      else if (psx2.buttonPressed(PSB_SELECT)) tombolStik2 = "SELECT";
      else if (psx2.buttonPressed(PSB_PAD_UP)) tombolStik2 = "ATAS";
      else if (psx2.buttonPressed(PSB_PAD_DOWN)) tombolStik2 = "BAWAH";
      else if (psx2.buttonPressed(PSB_PAD_LEFT)) tombolStik2 = "KIRI";
      else if (psx2.buttonPressed(PSB_PAD_RIGHT)) tombolStik2 = "KANAN";

      Serial.print("STIK 2 = ");
      Serial.println(tombolStik2);
      tampilLCD();
    }
    lastButtons2 = buttons2;
  }

  delay(20);
}

| Kesimpulan

Menghubungkan dua stik PS2 ke ESP32 terbukti sangat mudah dan hemat pin. Kuncinya terletak pada pemisahan pin Attention (ATT) untuk tiap stik. Sistem pembacaan ini berjalan sangat cepat tanpa jeda (delay), sehingga sangat cocok dipakai sebagai kendali kontroler robot multiplayer, mobil RC, maupun proyek otomasi interaktif lainnya.

Kami Siap Bantu Kamu

Jasa IoT Industri

Integrasi IoT untuk efisiensi industri.

  • ✔ Solusi custom
  • ✔ Implementasi profesional
  • ✔ Support berkelanjutan
Konsultasi Gratis

Web Dashboard IoT

Monitoring data real-time & modern.

  • ✔ Real-time
  • ✔ UI modern
  • ✔ Aman & scalable
Hubungi Kami

Sertifikasi IoT BNSP

Upgrade skill + sertifikat resmi.

  • ✔ Sertifikasi BNSP
  • ✔ Praktik langsung
  • ✔ Untuk profesional
Daftar Sekarang

| FAQ (Frequently Asked Questions)

Mengapa LCD 16x2 tidak menampilkan tulisan sama sekali?

Ada dua kemungkinan utama. Pertama, potensiometer pembagi kontras (trimpot warna biru) di belakang modul I2C belum diputar. Coba putar perlahan dengan obeng minus kecil sampai teks terlihat jelas. Kedua, alamat I2C di kode program belum pas. Umumnya alamat I2C modul berada di 0x27 atau 0x3F. Anda bisa gunakan program I2C Scanner untuk memastikannya.

Apakah kedua stik PS2 ini benar-benar bisa ditekan bersamaan?

Ya! Karena ESP32 memproses data dalam hitungan milidetik, pembacaan sinyal bergantian antara Stik 1 dan Stik 2 terjadi secara instan sehingga terasa seolah-olah dibaca bersamaan.

Mengapa stik PS2 saya tidak terdeteksi oleh program?

Pastikan tegangan daya yang diberikan ke stik stabil pada 5V (beberapa jenis stik kloning butuh arus yang stabil) dan pastikan urutan sambungan kabel data, clock, serta ATT tidak tertukar.