Tgl : 7-Januari-2019
CARA MEMBACA DATA JOYSTICK PLAYSTATION DENGAN MENGGUNAKAN ARDUINO UNO
Tutorial membaca data stick Playstation ini
sudah banyak dibuat oleh blogger khususnya di Indonesia. Hanya saja pemroses yang
digunakan adalah menggunakan AVR development
board dengan menggunakan pemrograman CVAVR. Untuk Arduino sendiri, saya
lihat blogger Indonesia belum ada yang membuatkan tutorial ini.
Mungkin banyak yang telah berhasil membuatkan programnya, hanya saja tidak memiliki waktu atau kesempatan untuk membuat tutorialnya. Sedangkan untuk tutorial dari luar Indonesia saya lihat sudah ada, hanya saja program Arduino sudah dibuat dalam bentuk library. Menurut saya pribadi, library yang dibuat agak sedikit membingungkan dan sulit dimengerti terutama untuk teman-teman yang baru dalam menggunakan Arduino. Padahal setelah saya buat, ternyata programnya sangat sederhana. Selain itu, terkadang kita masih membutuhkan data mentah dari Joystick PS, yang ternyata setelah program dibuat dalam bentuk library, data ini tidak ditampilkan lagi. Semoga tutorial ini bisa bermanfaat untuk kita semua. Mohon maaf jika didalam tutorial ini terdapat kekurangan atau kesalahan, karena tutorial ini dibuat sepanjang pengetahuan admin blog, sehingga mungkin saja terdapat kekurangan atau kesalahan. Silahkan komentar jika ada kesalahan, kekurangan, atau pertanyaan dalam pembahasan tutorial kali ini.
Mungkin banyak yang telah berhasil membuatkan programnya, hanya saja tidak memiliki waktu atau kesempatan untuk membuat tutorialnya. Sedangkan untuk tutorial dari luar Indonesia saya lihat sudah ada, hanya saja program Arduino sudah dibuat dalam bentuk library. Menurut saya pribadi, library yang dibuat agak sedikit membingungkan dan sulit dimengerti terutama untuk teman-teman yang baru dalam menggunakan Arduino. Padahal setelah saya buat, ternyata programnya sangat sederhana. Selain itu, terkadang kita masih membutuhkan data mentah dari Joystick PS, yang ternyata setelah program dibuat dalam bentuk library, data ini tidak ditampilkan lagi. Semoga tutorial ini bisa bermanfaat untuk kita semua. Mohon maaf jika didalam tutorial ini terdapat kekurangan atau kesalahan, karena tutorial ini dibuat sepanjang pengetahuan admin blog, sehingga mungkin saja terdapat kekurangan atau kesalahan. Silahkan komentar jika ada kesalahan, kekurangan, atau pertanyaan dalam pembahasan tutorial kali ini.
Salah satu alasan saya membuat tutorial ini
adalah karena adanya kebutuhan pengontrolan robot pada Kontes Robot Indonesia
(KRI) secara khusus ataupun pengontrolan suatu sistem dengan menggunakan
Joystick secara umumnya. Pada dasarnya teknik membaca Joystick PS ini berasal
dari sumber yang sama, yakni file PDF milik saudara Agung Nugroho Adi. Langkah-langkah
yang beliau jelaskan pada tutorial tersebut sangat baik sekali, sehingga pembaca
dapat memahami dan mengaplikasikannya dengan mudah. Sebagai informasi tambahan, tidak ada perbedaan dalam
menggunakan Joystick PS dengan tipe yang menggunakan kabel ataupun yang jenis
wireless, karena sudah pernah saya coba dan keduanya dapat bekerja dengan baik
dengan program yang sama.
Beberapa materi yang akan dibahas dalam tutorial ini adalah
:
- Teknik Interfacing Arduino UNO dengan Joystick PS
- Membuat Program SPI Arduino UNO untuk Membaca Data Joystick PS
- Video Hasil Percobaan
I. Teknik Interfacing Arduino UNO dengan
Joystick PS
Cara menghubungkan Joystick PS dengan
Arduino UNO sebenarnya sangatlah mudah. Rangkaiannya hanya membutuhkan 4 buah resistor
saja. Gambar rangkaian cara menghubungkan Joystick dari saudara Agung Nugroho Adi adalah sebagai
berikut.
Lalu bagaimana cara
menyesuaikannya untuk menghubungkan Joystick PS dengan Arduino UNO. Hal yang harus
diketahui adalah bahwa Joystick PS memiliki standar komunikasi SPI untuk
terhubung dengan perangkat luar. Komunikasi SPI memiliki 3 kabel sebagai jalur
komunikasi data, yakni bernama jalur MOSI, MISO, dan SCK. Serta satu buah kabel
untuk memilih perangkat Slave yang akan diajak berkomunikasi yakni bernama SS (Slave Select). Dengan mengetahui
hal ini, maka sangat mudah untuk menghubungkan Joystick PS dengan Arduino UNO, yakni cukup mencari Pin pada Arduino Uno yang
memiliki nama yang sama seperti yang telah disebutkan diatas. Perhatikan gambar dibawah ini yang merupakan bagian dari skematik Arduino Uno.
Seperti yang diperlihatkan pada gambar diatas, pin dengan nama MOSI, MISO, SCK, dan SS berada pada PORT B pada ATmega 328P yakni Port
B5 (SCK), Port B4 (MISO), Port B3 (MOSI), dan Port B2 (SS). Atmega 328P
merupakan mikrokontroler yang digunakan sebagai pemroses data pada Arduino UNO. Kemudian berdasarkan gambar diatas, maka Pin MOSI, MISO, SCK, dan SS pada ATmega328P dihubungkan dengan
Pin nomor 13 (SCK), 12 (MISO), 11 (MOSI), dan 10 (SCK) pada Arduino UNO. Maka
pin SPI pada Joystick cukup dihubungkan dengan pin-pin tersebut. Atau perhatikan
gambar dibawah ini.
Dengan gambar diatas saya kira sudah sangat
jelas bagaimana cara menghubungkan Joystick PS dengan Arduino UNO. Untuk jalur kabel
9 Volt maka cukup abaikan saja, karena kita tidak akan menggunakannya. Sedangkan
untuk jenis Arduino yang lain tinggal menyesuaikan saja dengan gambar diatas,
intinya hubungkan saja Joystick ke pin dengan nama MOSI, MISO, SCK, dan SS pada Arduino yang digunakan. Gambar rangkaian diatas saya kira berlaku untuk jenis Arduino NANO yang menggunakan pemroses yang sama yakni ATmega328P, atau Arduino Pro Mini dengan jenis ATmega328P dengan tegangan 5V dan memiliki frekuensi 16 MHz. Karena setelah saya pelajari pada dasarnya memiliki pemetaan pin yang sama serta memiliki fungsi yang sama saja. Contohnya Arduino Pro Mini, pada dasarnya memiliki pemetaan pin yang sama, fungsi yang sama dengan UNO dan NANO, hanya saja ditujukan khusus pada project yang membutuhkan tempat yang kecil serta pada project yang sudah final, berbeda dengan UNO yang memang ditujukan untuk pembelajaran baik elektronik maupun pemgrograman.
Untuk menghubungkan Joystick PS dengan Arduino UNO maka mau tidak mau harus memotong kabel Joystick. Atau jika memiliki PS bekas, maka dapat diambil port female yang merupakan pasangan dari Joystick PS. Atau dapat menggunakan USB Joystick Adapter, yang kemudian diambil bagian port female-nya. Berikut ini tampilan dari USB Joystick Adapter.
Untuk menghubungkan Joystick PS dengan Arduino UNO maka mau tidak mau harus memotong kabel Joystick. Atau jika memiliki PS bekas, maka dapat diambil port female yang merupakan pasangan dari Joystick PS. Atau dapat menggunakan USB Joystick Adapter, yang kemudian diambil bagian port female-nya. Berikut ini tampilan dari USB Joystick Adapter.
Jika memiliki port female Joystick, maka tidak perlu memotong kabel Joystick lagi. Untuk mengetahui pin mana yang harus dihubungkan ke Arduino UNO, maka perhatikan gambar
berikut ini.
Dengan adanya gambar tersebut maka tinggal
disesuaikan saja dengan konfigurasi gambar sebelumnya. Jika Disesuaikan dengan gambar sebelumnya maka pin Joystick nomor 1 adalah berada di paling bawah dengan keterangan berwarna coklat dengan nama PsxDat, dan seterusnya secara berurutan sampai dengan paling atas dengan keterangan berwarna hijau dengan nama PsxAck. Saya kira tata cara
menghubungkan Joystick PS dengan Arduino UNO sudah sangat jelas. Maka tahap selanjutnya adalah membuat programnya.
II. Membuat
Program SPI Arduino UNO Untuk Membaca Data Joystick PS
Setelah selesai menghubungkan Joystick PS
dengan Arduino UNO, maka langkah selanjutnya adalah membuat program untuk
membaca data dari Joystick PS. Silahkan copy
dan paste program dibawah ini ke
dalam Arduino IDE milik anda. Program ini seharusnya juga dapat digunakan untuk Arduino Nano dan Pro Mini, namun tidak berlaku untuk Arduino Mega 2560.
/*
* Playstation Joystick Meet Arduino UNO
* Created by Catur Pebriandani
* 06-01-2019
* Please visit My Blog caturcreativeproject.com
* My Youtube Channel Catur Pebriandani
* My IG catur_pebriandani
* Thanks a Lot
*
* Arduino UNO PLAYSTATION JOYSTICK
* PIN 13 >> BLUE (PsxClock)
* PIN 12 >> BROWN (PsxDat)
* PIN 11 >> ORANGE (PsxCmd)
* PIN 10 >> YELLOW (PsxAttn)
*/
#include <SPI.h>
// Global Variable
uint8_t stick_ready, stick_type, byte4, byte5, byte6, byte7, byte8, byte9;
void setup() {
// put your setup code here, to run once:
// Port B initialization
DDRB=(0<<DDB7) | (0<<DDB6) | (1<<DDB5) | (0<<DDB4) | (1<<DDB3) | (1<<DDB2) | (0<<DDB1) | (0<<DDB0);
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (1<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
// SPI initialization = SPI Type: Master, SPI Clock Rate: 125.000 kHz, SPI Clock Phase: Cycle Half, SPI Clock Polarity: High, SPI Data Order: LSB First
SPCR=(0<<SPIE) | (1<<SPE) | (1<<DORD) | (1<<MSTR) | (1<<CPOL) | (1<<CPHA) | (1<<SPR1) | (1<<SPR0);
SPSR=(0<<SPI2X);
// Open Serial Communication to PC
Serial.begin(9600);
while(!Serial);
pinMode(10, OUTPUT); //Set pin 10 Arduino UNO as OUTPUT
digitalWrite(10, HIGH); delay(200); //Set pin 10 HIGH
}
void loop() {
// put your main code here, to run repeatedly:
//*GET THE DATA
digitalWrite(10, LOW); // Activate the Slave
SPI.transfer(0x01); // Start Communication
stick_type=SPI.transfer(0x42); // Get Data (Stick Type, one of 65 for "Digital" or 115 for "Analog" or 255 if no Joystick Plugged)
stick_ready=SPI.transfer(0); // Get Data (Stick Status, either 90 for "Ready" or 255 for "Not Ready"
byte4=SPI.transfer(0); // Get Joystick Data (up, down, left, right, start, select, joy-L/L3, joy-R/R3)
byte5=SPI.transfer(0); // Get Joystick Data (triangle, square, circle, x, R1, R2, L1, L2)
byte6=SPI.transfer(0); // Get Joystick Data (Analog Right Side x Axis - Analog Move Right or Left)
byte7=SPI.transfer(0); // Get Joystick Data (Analog Right Side y Axis - Analog Move Up or Down)
byte8=SPI.transfer(0); // Get Joystick Data (Analog Left Side x Axis - Analog Move Right or Left)
byte9=SPI.transfer(0); // Get Joystick Data (Analog Left Side y Axis - Analog Move Up or Down)
digitalWrite(10, HIGH); // Disconnect the slave
//*SHOW THE DATA
Serial.print("byte4=" + (String)byte4); Serial.print("\t"); //Show Byte 4 Data
Serial.print("byte5=" + (String)byte5); Serial.print("\t"); //Show Byte 5 Data
Serial.print("byte6=" + (String)byte6); Serial.print("\t"); //Show Byte 6 Data
Serial.print("byte7=" + (String)byte7); Serial.print("\t"); //Show Byte 7 Data
Serial.print("byte8=" + (String)byte8); Serial.print("\t"); //Show Byte 8 Data
Serial.print("byte9=" + (String)byte9); Serial.print("\t"); //Show Byte 9 Data
Serial.print("Stick Type= " + (String)stick_type); //Show Stick Type Data either 65 or 115
Serial.print("\t"); //Give one Tab
if(stick_type==65) { Serial.println("(Digital)"); } //Show "Digital" if Data equal 65
else if(stick_type==115) { Serial.println("(Analog)"); } //Show "Analog" if Data equal 115
Serial.println("\n\n"); //Give Two enter
delay(1000); // Relative Value, this show the data 1 time for a second
}
Selanjutnya silahkan upload program tersebut ke Arduino UNO anda. Setelah program selesai di upload maka silahkan buka serial monitor atau tekan Ctrl+Shift+M. Kemudian
ubah pengaturan Baud Rate pada Serial Monitor menjadi 9600. Pengaturan ini
berada dibagian bawah Serial Monitor
atau perhatikan gambar berikut ini.
Tampilan yang muncul di Serial monitor seharusnya adalah seperti berikut ini.
Jika anda menekan salah satu tombol maka data yang ada pada serial monitor akan berubah. Ada perlu sedikit teliti untuk melihat data mana yang berubah. Atau untuk memudahkannya silahkan perhatikan Gambar dibawah ini.
Pertama-tama yang harus anda ketahui adalah pembacaan data Joystick PS memiliki dua mode yakni mode Digital dan mode Analog. Mode Analog diaktifkan dengan cara menekan tombol Mode yang berada dibagian tengah Joystick, dan ketika aktif ditandai dengan LED yang berada didekat tombol tersebut menjadi menyala. Jika tombol Mode kembali ditekan dan LED mati maka Joystick PS berada pada mode Digital. Kemudian maksud pada gambar diatas adalah jika anda menekan tombol pad kiri, kanan, atas, bawah, serta tombol start dan select maka nilai byte 4 akan berubah. Sedangkan jika anda menekan tombol segiempat, x, bulat, segitiga, serta tombol R1, R2, L1, L2 maka nilai byte 5 akan berubah. Tiap tombol memiliki nilai yang berbeda meskipun berada pada byte yang sama. Contohnya tombol R1 dan R2 sama-sama berada pada byte 5, namun ketika ditekan memiliki nilai yang berbeda, misal tombol R1 bernilai 247 sedangkan R2 bernilai 253 dan seterusnya. Jika mode analog diaktifkan, maka ketika tombol analog sebelah kanan digerakkan secara horizontal atau sumbu x maka nilai Byte 6 akan berubah dan jika digerakkan secara vertikal atau sumbu y maka nilai byte 7 akan berubah. Sedangkan jika tombol analog sebelah kiri digerakkan secara horizontal atau sumbu x maka nilai Byte 8 akan berubah dan jika digerakkan secara vertikal atau sumbu y maka nilai byte 9 akan berubah. Korelasi penjelasan saya ini dengan tampilan yang ada di serial monitor adalah ketika anda menekan tombol pada Joystick maka nilai byte pada serial monitor akan berubah-ubah.
Setelah memahami cara membaca data dari Joystick PS, maka saya akan menjelaskan sedikt tentang Program Arduino yang telah dibuat. Pada bagian Void Setup terdapat beberapa program inisialisasi yakni inisialisasi Port B dan komunikasi SPI. Bagian yang wajib diatur adalah Port B2, B3, dan B5 diatur sebagai OUTPUT, sedangkan PortB4 diatur sebagai INPUT. Sedangkan komunikasi SPI diatur sebagai berikut, tipe SPI adalah Master dengan Clock rate 125 kHz, dengan Clock Phase Cycle Half, dan Clock Polarity High, serta pertukaran data dimulai dari LSB. Pengaturan komunikasi SPI dilakukan melalui register SPCR dan SPSR. Anda tidak perlu terlalu pusing dengan hal ini, cukup gunakan saja program yang telah saya bagikan. Kemudian pada baris program pin mode 10 dijadikan OUTPUT, sebenarnya telah diatur pada program inisialisasi Port B2, maka relatif boleh anda tulis dan boleh tidak. Disini saya hanya berniat mempermudah pembaca program saya. Kemudian Port B2 pada kondisi awal diberikan kondisi logika HIGH karena jika Port B2 LOW adalah untuk mengaktifkan SLAVE yang dalam hal ini adalah Joystick PS.
Selanjutnya proses pertukaran data antara Arduino UNO dengan Joystick PS adalah sebgai berikut. Port 10 Arduino UNO diberikan logika LOW untuk mengaktifkan SLAVE dalam hal ini adalah Joystick PS. Kemudian Arduino UNO mengirim data 0x01 untuk memulai komunikasi data. Selanjutnya Arduino UNO mengirim data 0x42 ke Joystick PS. Joystick PS kemudian merespon dengan mengirimkan data yang mewakili tipe stick saat ini, yakni nilai 65 jika mode digital dan nilai 115 jika mode analog atau bernilai 255 jika Joystick tidak terpasang. Selanjutnya Arduino UNO mengirimkan byte data 0 ke Joystick. Joystick merespon dengan mengirimkan data yang mengisyaratkan Status Joystick, yakni nilai 90 jika dalam kondisi siap, atau nilai 255 jika tidak siap atau jika Joystick tidak terhubung atau jika tiba-tiba koneksi Joystick terlepas dari Arduino UNO. Sedangkan pada program selanjutnya Arduino UNO mengirimkan byte 0 ke Joystick dan Joystick merespon dengan mengirinkan data yang berisi informasi tombol Joystick. Data tersebut disimpan ke dalam variable byte 4, begitu seterusnya sampai dengan byte 9. Kemudian pada akhir prgram pin 10 diberi logika HIGH untuk menonaktifkan SLAVE.
III. Video
Hasil Percobaan
Video hasil percobaan harap menunggu karena Tripod Admin hilang, takut gambar goyang2, jadi ditunda dulu.heee
Saya kira hanya ini saja materi yang dapat saya
sampaikan kepada para pembaca blog caturcretiveproject.com. Semoga bermanfaat
untuk kita semua. Jika pembaca blog masih bingung atau ada pertanyaan, maka silahkan
komen dibawah. Sebagai catatan akhir, isi tutorial ini dapat diperbarui
sewaktu-waktu agar isinya lebih lengkap. Terima kasih sudah berkunjung ke blog
caturcreativeproject.com
Artikel & Tutorial Terkait :
- Antarmuka Joystick PlayStation Dengan Mikrokontroler AVR Menggunakan CVAVR : Agung Nugroho Adi
- Playstation Control Redux : Jon Williams
Artikel & Tutorial Terkait :
- Antarmuka Joystick PlayStation Dengan Mikrokontroler AVR Menggunakan CVAVR : Agung Nugroho Adi
- Playstation Control Redux : Jon Williams
Tag : SPI, Playstation Joystick, Arduino UNO
Mksh pak piter
ReplyDeleteAmazing website, and thanks for posting this fascinating data that is very helpful and engaging blog post, continue sharing things like this helpful material. erp customization
ReplyDelete