Perancangan dan Demonstrasi 2 Controller PS2 dengan ESP32 dan LCD 16×2 https://youtu.be/RE6vSJaUc8E| Simak vidio selengkapnyaMenggunakan 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. | Daftar Isi Alat dan Bahan Design Wiring Diagram Blok Implementasi Hasil Akhir Code Kesimpulan Frequently Asked Questions | Alat dan Bahan Controller PS2 ESP-32 Link Pembelian Kabel Jumper Link Pembelian 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. | 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 16x2 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 Buka Arduino IDE, pilih board ESP32 Dev Module dan port yang sesuai. Jika belum ada, masukkan URL https://dl.espressif.com/dl/package_esp32_index.json di Preferences, lalu install ESP32 dari Boards Manager. Tempelkan kode program, klik Verify (✓), lalu klik Upload (→). Buka Serial Monitor dan periksa tampilan pada layar LCD 16×2.Library yang dipakai:1.https://github.com/SukkoPera/PsxNewLib2.https://github.com/arduino-libraries/LiquidCrystal | 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.