Monday 7 January 2019

CARA MEMBACA DATA JOYSTICK PLAYSTATION DENGAN MENGGUNAKAN ARDUINO UNO

Penulis : Catur Pebriandani 
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.

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 :
  1. Teknik Interfacing Arduino UNO dengan Joystick PS
  2. Membuat Program SPI Arduino UNO untuk Membaca Data Joystick PS
  3. 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.


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





Tag : SPI, Playstation Joystick, Arduino UNO






2 comments:

  1. Amazing 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

Adbox