Interfacing PSX joystick with ATMega

Embed Size (px)

DESCRIPTION

Interfacing PSX joystick with ATMega

Citation preview

  • Antarmuka Joystick PlayStation Dengan Mikrokontroler AVR Menggunakan CVAVR

    Oleh : Agung Nugroho Adi Laboratorium Mekatronika Jurusan Teknik Mesin Universitas Islam Indonesia

    [email protected] nugroho.staff.uii.ac.id

    Saat ini tampaknya tidak ada orang yang tidak kenal PlayStation sebagai game console yang paling populer di Indonesia. Tentunya kebanyakan dari kita sudah sangat terbiasa menggunakan joystick PS, baik yang analog dan digital. Untuk itu akan menjadi suatu keuntungan tersendiri jika dapat dibuat robot yang menggunakan joystick PS sebagai kontroler karena sudah tidak asing lagi, mudah untuk digunakan, terdapat 16 tombol, dan terdapat 4 jalur analog. Saya pertama kali mencoba untuk menggunakan joystick PS ini setelah membaca artikel dari Jon Williams berjudul PlayStation pada Nuts & Volts of Basic Stamps volume 4 yang juga terdapat pada CD bawaan dari Parallax. Pada artikel tersebut diterangkan cara untuk mengakses data dari joystick PS menggunakan mikrokontroler Basic Stamp 2. Waktu itu saya mengikuti langkah-langkah yang terdapat pada artikel tersebut dan berhasil menampilkan data tombol yang ditekan pada joystick PS pada PC. Tulisan yang saya buat ini sebagian besar bersumber dari artikel Jon Williams tersebut, tentunya dengan penyesuaian dan penjelasan tambahan karena mikrokontroler yang digunakan berbeda, yaitu ATMega8535. Bahasa pemrograman yang digunakan adalah CVAVR, karena nampaknya saat ini pemrograman ini cukup banyak digunakan (di Indonesia).

    Gambar 1 Rangkaian antarmuka joystick PS dengan mikrokontroler ATMega8535

  • Antarmuka Joystick PlayStation Dengan Mikrokontroler AVR Menggunakan CVAVR 2

    Rangkaian yang menghubungkan joystick PS2 cukup sederhana, hanya memerlukan beberapa resistor, yang terdiri dari 3 resistor 220 yang berfungsi sebagai pengaman dan 1 buah resistor 4k7 sebagai pullup. Bahkan sebetulnya PsxCmd, PsxClock, dan PsxAttn dapat langsung dihubungkan tanpa resistor sama sekali, namun tidak ada salahnya berjaga-jaga untuk melindungi jalur I/O keduanya (catatan : biasanya pada pin Basic Stamp memang sangat dianjurkan menggunakan resistor pembatas arus sebagai pengaman). Pin PsxDat, serta PsxAck jika digunakan, harus diberi resistor pullup karena bersifat open collector. Dari mikrokontroler ATMega 8535 dibutuhkan 4 pin, 3 sebagai output (PB7/SCK, PB5/MOSI, dan PB4) serta 1 pin sebagai input (PB6/MISO). Pemilihan pin disesuaikan dengan jalur SPI yang dapat dilihat pada datasheet masing-masing mikrokontroler. Kabel abu-abu dihubungkan dengan catu daya 9V hanya jika motor getar akan diaktifkan. Sebagai catatan, rangkaian ini sedikit berbeda dengan rangkaian pada artikel Jon Williams, karena di sana jalur PsxClock harus diinvert untuk menyesuaikan dengan perintah shiftin/shiftout pada Basic Stamp. Pada setiap joystick PS terdapat kontroler yang bertugas untuk berkomunikasi dengan console PS. Komunikasi yang digunakan adalah serial sinkron, yaitu data dikirim satu per satu melalui jalur data. Untuk mengkoordinasikan antara pengirim dan penerima terdapat satu jalur clock. Hal inilah yang membedakan serial sinkron dengan serial asinkron (UART/RS232) yang dapat bekerja tanpa jalur clock karena masing-masing pengirim dan penerima mempunyai clock.

    Gambar 2 Ilustrasi komunikasi serial sinkron

    Komunikasi serial terdapat beberapa macam, yang terkenal adalah I2C (Inter Integrated Circuit) atau juga dikenal dengan 2 wire (TWI = Two Wire Interface) SPI (Serial Pheriperal Interface) atau kadang-kadang disebut 3 Wire Interface. Yang digunakan pada joystick PS adalah komunikasi SPI. Awalnya saya sempat mengira kalau SPI itu hanya digunakan untuk pemrograman mikrokontroler, tapi ternyata penggunaannya banyak juga, misalnya untuk mengakses shift register 74595/74165, ADC0831, sensor temperatur DS1620, kompas H55B dan masih banyak peranti lainnya. Pada beberapa bahasa pemrograman tingkat tinggi telah tersedia fungsi yang menunjang komunikasi SPI ini, misalnya shiftin/shiftout pada Pbasic atau Bascom dan spi untuk CVAVR. Fungsi spi pada CVAVR mempunyai kelebihan dibandingkan dengan fungsi shiftin/shiftout, karena dapat mengirimkan sekaligus menerima data pada rentang waktu yang sama. Untuk itulah dengan menggunakan CVAVR tidak perlu dibuat subrutin tambahan seperti yang terdapat pada artikel Jon Williams. Pertukaran data antara kontroler joystick PS dan mikrokontroler seperti tercantum pada tabel 1 dan 2. Untuk mengawali komunikasi dengan joystick PS mikrokontroler megirim byte pertama berupa perintah 0x01, kemudian byte kedua perintah 0x42 (baca data) sekaligus menerima tipe joystick (0x41 untuk digital, 0x73 untuk analog) dari kontroler joystick. Byte ketiga dan seterusnya mikrokontroler menerima data dari kontroler joystick berturut-turut 0x5A (ready), data digital 1,

    Lab. Mekatronika Jurusan Teknik Mesin UII 3

    dan data digital 2. Data digital ini bersifat active low, jadi jika tidak ada tombol ditekan akan diterima data 0xff (0b11111111). Jika joystick dalam kondisi operasi analog maka komunikasi dilanjutkan dengan data analog 1, data analog 2, data analog 3, dan data analog 4, yang saat pada kondisi netral berupa data 0x7f (127) dengan nilai minimal 0 dan nilai maksimal 0xff (255). Saat operasi digital byte 6 9 selalu memberikan data 0xff.

    Tabel 1 Pertukaran data untuk joystick digital Byte PsxCmd PsxData Keterangan

    01 0x01 -

    02 0x42 0x41

    03 - 0x5A Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0

    04 - data digital 1

    Start Select

    05 - data digital 2

    X O R1 L1 R2 L2

    Tabel 2 Pertukaran data untuk joystick analog Byte PsxCmd PsxData Keterangan

    1 0x01 -

    2 0x42 0x73

    3 - 0x5A Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0

    4 - data digital 1

    Start Joy-R Joy-L Select

    5 - data digital 2

    X O R1 L1 R2 L2

    6 - data analog 1

    Joystick Analog Kanan Sumbu X 0x00 kiri, 0xff kanan

    7 - data analog 2

    Joystick Analog Kanan Sumbu Y 0x00 atas, 0xff bawah

    8 - data analog 3

    Joystick Analog Kiri Sumbu X 0x00 kiri, 0xff kanan

    9 - data analog 4

    Joystick Analog Kiri Sumbu Y 0x00 atas, 0xff bawah

    Prosedur untuk membaca data dari joystick adalah sebagai berikut. void baca_data(){ psxattn=0; spi(0x01); ID=spi(0x42); SS=spi(0); byte4=spi(0); byte5=spi(0); byte6=spi(0); byte7=spi(0); byte8=spi(0); byte9=spi(0); psxattn=1; } Saat kondisi iddle pin PsxAttn dalam keadaan high. Untuk menandai dimulainya komunikasi pin PsxAttn diberi low, kemudian terjadi pertukaran perintah dan data seperti yang telah dijelaskan di atas. Komunikasi diakhiri dengan membuat PsxAttn high kembali.

  • Antarmuka Joystick PlayStation Dengan Mikrokontroler AVR Menggunakan CVAVR 4

    Pada bagian insisialisasi ada beberapa hal yang perlu diberikan pada program. Yang pertama adalah #include. Selanjutnya hal yang perlu diperhatikan adalah penentuan register SPCR pada bagian SPI Initialization. Nilai SPCR diisi 0b01111110 (0x7e) dengan penjelasan sebagai berikut 7 - SPIE = 0 : interupsi SPI tidak aktif 6 - SPE = 1 : SPI aktif 5 - DORD = 1 : data order LSB first 4 - MSTR = 1 : uc sebagai master 3 CPOL = 1 : saat iddle clock = high 2 CPHA = 1 : ambil/kirim data saat clock transisi turun 1 SPR1 = 1 0 SPR0 = 0 : rate select = 10, fsck = fosc/64, untuk kristal 4 MHz = 62.5 kHz Jika anda menggunakan CodeWizzard AVR, maka parameter untuk tab SPI dapat diatur seperti di atas. Untuk PORTB Initialization PORTB diberi nilai 0x10 (0b00010000) karena PORTB.4 (PsxAttn) diberi nilai awal 1 pada kondisi iddle. DDRB diberi nilai 0xB0 (0b10110000) karena PORTB.7 (PsxSck), PORTB5(PsxCmd), dan PORTB.4 (PsxAttn) sebagai output sedangkan PORTB.6 (PsxDat) sebagai input. Hal-hal yang perlu diperhatikan : Dari percobaan menggunakan beberapa kecepatan transfer data yang berbeda, data yang

    diterima valid untuk frekuensi clock 62.5 kHz dan 31.25 Hz, namun nampaknya kontroler stick PS tidak dapat melayani pertukaran data untuk 125 kHz dan 1 MHz. Sehingga saya memperkirakan jika digunakan kristal 8 MHz maka SPR diberi nilai 11 (fsck = fosc/128).

    Hingga saat ini saya masih belum menemukan konektor female dari joystick PS, sehingga untuk melakukan percobaan ini saya harus menggunting kabel konektornya (yang artinya joysticknya gak bisa dipakai buat main PS lagi). Mungkin konektor female bisa diperoleh dari PS bekas ataupun mencarinya di tempat reparasi PS (jika ada info mengenai hal ini mohon saya dikabari ).

    Dari beberapa joystick yang sudah saya potong kabelnya ada beberapa yang kabelnya 8, tidak 9 seperti yang telah dijelaskan pada gambar 1. Untuk yang seperti ini kabel warna putih yang terhubung dengan pin PsxCmd (yang seharusnya warna oranye). Untuk mengeceknya dapat digunakan multimeter.

    Mikrokontroler juga dapat digunakan untuk mengaktifkan motor getar pada joystick PS, untuk itu kabel abu-abu disambungkan dengan catu daya 9 V. Untuk daftar perintah dan pertukaran data joystick PS dapat dilihat pada http://www.lynxmotion.com/images/files/ps2cmd01.txt

    Demikian tulisan singkat mengenai antarmuka joystick PS dengan mikrokontroler ATMega8535, jika terdapat masukan atau informasi tambahan dapat menghubungi saya. Selamat Mencoba dan Semoga Bermanfaat (0109) Referensi Jon Williams, PlayStation Control Redux, The Nuts 7 Volts of Basic Stamps (Volume 4),

    September 2003, www.nutsvolts.com. Pavel Haiduc, Code Vision AVR User Manual, HP Info Tech S.R.L, 2005. Thomas Scherrer, Playstation Gamepad, http://www.webx.dk/robot-crawler/ps-joy.htm Andrew J McCubbin, Sony Playstation Controller Information,

    http://www.gamesx.com/controldata/psxcont/psxcont.htm Near Future Laboratory, Playstation 2 Logic Analysis,

    http://www.nearfuturelaboratory.com/2008/06/19/playstation2-logic-analysis/ http://www.lynxmotion.com/images/files/ps2cmd01.txt