Antarmuka Joystick PlayStation Dengan Mikrokontroler AVR ...

31 downloads 267 Views 52KB Size Report
Antarmuka Joystick PlayStation Dengan Mikrokontroler AVR Menggunakan CVAVR. Oleh : Agung Nugroho Adi. Laboratorium Mekatronika Jurusan Teknik ...
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 langkahlangkah 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

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,

2

Antarmuka Joystick PlayStation Dengan Mikrokontroler AVR Menggunakan CVAVR

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

01

0x01

-

Keterangan

02

0x42

0x41

03

-

0x5A

Bit7

Bit6

Bit5

Bit4

Bit3

04

-

data digital 1









Start

05

-

data digital 2

X

O



R1

Byte

PsxCmd

PsxData

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

Tabel 2

Bit2

Bit1

Bit0 Select

L1

R2

L2

Pertukaran data untuk joystick analog Keterangan

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.

Lab. Mekatronika Jurusan Teknik Mesin UII

3

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

4

Antarmuka Joystick PlayStation Dengan Mikrokontroler AVR Menggunakan CVAVR