stik ps2 with arduino un

Wireless PlayStation 2 Controller dengan Arduino Uno

PS2WirelessControllerArduino
Sudah lama sebenarnya saya ingin mempunyai cara untuk mengendalikan Arduino, terutama yang sudah digunakan untuk aplikasi robotik, secara remote (dari jarak jauh). Ada banyak cara yang bisa dilakukan, tapi rata-rata masih lumayan kompleks dan belum cukup praktis untuk dicoba. Alangkah lebih bagusnya lagi kalau bisa mengendalikan secara wireless, wah itu akan banyak menghasilkan ide-ide proyek Arduino yang kreatif.
Nah, secara tidak sengaja ketemu artikel ini, PlayStation 2 Controller Arduino Library v1.0, buatan Bill Porter. Disitu dijelaskan tentang Library Arduino yang dibuat untuk mengendalikan Arduino menggunakan PlayStation 2 Controller. Artikel di sana menggunakan PlayStation 2 Controller yang menggunakan kabel. Hmm…kalau mau pakai yang wireless kira-kira bisa gak ya? Ya coba aja deh…
Akhirnya dibeli tuh ‘2.4GHz Wireless Magic Light-Tube Dual Shock 2 Controller’ seharga Rp. 150.000,-. Gambar-nya seperti di bawah ini.
Add caption
PS2 Wireless Controller dalam kemasan
PS2 Wireless Controller dan Wireless Receiver-nya
Ok, Wireless Controller sudah ada, sekarang download Library Arduino-nya, link-nya bisa dilihat di dalam artikel di atas, atau di sini. Ekstrak file tersebut dan copy folder PS2X_lib ke dalam folder libraries yang ada di folder Software Arduino (saya kebetulan pakai software IDE Arduino versi 22). Kalau anda sudah membuka IDE Arduino, tutup dan buka kembali agar library yang baru bisa terdaftar.
Siapkan board Arduino anda, saya kebetulan menggunakan Arduino Uno, dan pasang kabel USB-nya ke Arduino dan komputer anda. Buka file contoh program yang sudah disertakan di dalam folder PS2X_lib tersebut, file-nya: PS2X_Example.pde. Jalankan Verify/Compile (Ctrl+R) untuk memastikan tidak ada error dan library yang tadi di-copy sudah terdaftar. Kemudian lakukan Upload to I/O board (Ctrl+U). Apabila sketch sudah diupload tanpa error, lepaskan kabel USB dari board Arduino anda, saatnya kita menghubungkan PlayStation 2 Wireless Receiver dengan Arduino.
Kode program yang terdapat pada file contoh dapat dilihat di bawah ini.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169


#include <PS2X_lib.h>  //for v1.6

PS2X ps2x; // create PS2 Controller Class

//right now, the library does NOT support hot pluggable controllers, meaning
//you must always either restart your Arduino after you conect the controller,
//or call config_gamepad(pins) again after connecting the controller.
int error = 0;
byte type = 0;
byte vibrate = 0;

void setup(){
 Serial.begin(57600);

 //CHANGES for v1.6 HERE!!! **************PAY ATTENTION*************

 error = ps2x.config_gamepad(13,11,10,12, true, true);   //setup pins and settings:  GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error

 if(error == 0){
   Serial.println("Found Controller, configured successful");
   Serial.println("Try out all the buttons, X will vibrate the controller, faster as you press harder;");
  Serial.println("holding L1 or R1 will print out the analog stick values.");
  Serial.println("Go to www.billporter.info for updates and to report bugs.");
 }

  else if(error == 1)
   Serial.println("No controller found, check wiring, see readme.txt to enable debug. visit www.billporter.info for troubleshooting tips");

  else if(error == 2)
   Serial.println("Controller found but not accepting commands. see readme.txt to enable debug. Visit www.billporter.info for troubleshooting tips");

  else if(error == 3)
   Serial.println("Controller refusing to enter Pressures mode, may not support it. ");

   //Serial.print(ps2x.Analog(1), HEX);

   type = ps2x.readType();
     switch(type) {
       case 0:
        Serial.println("Unknown Controller type");
       break;
       case 1:
        Serial.println("DualShock Controller Found");
       break;
       case 2:
         Serial.println("GuitarHero Controller Found");
       break;
     }

}

void loop(){
   /* You must Read Gamepad to get new values
   Read GamePad and set vibration values
   ps2x.read_gamepad(small motor on/off, larger motor strenght from 0-255)
   if you don't enable the rumble, use ps2x.read_gamepad(); with no values

   you should call this at least once a second
   */


 if(error == 1) //skip loop if no controller found
  return; 

 if(type == 2){ //Guitar Hero Controller

   ps2x.read_gamepad();          //read controller 

   if(ps2x.ButtonPressed(GREEN_FRET))
     Serial.println("Green Fret Pressed");
   if(ps2x.ButtonPressed(RED_FRET))
     Serial.println("Red Fret Pressed");
   if(ps2x.ButtonPressed(YELLOW_FRET))
     Serial.println("Yellow Fret Pressed");
   if(ps2x.ButtonPressed(BLUE_FRET))
     Serial.println("Blue Fret Pressed");
   if(ps2x.ButtonPressed(ORANGE_FRET))
     Serial.println("Orange Fret Pressed");

    if(ps2x.ButtonPressed(STAR_POWER))
     Serial.println("Star Power Command");

    if(ps2x.Button(UP_STRUM))          //will be TRUE as long as button is pressed
     Serial.println("Up Strum");
    if(ps2x.Button(DOWN_STRUM))
     Serial.println("DOWN Strum");

    if(ps2x.Button(PSB_START))                   //will be TRUE as long as button is pressed
         Serial.println("Start is being held");
    if(ps2x.Button(PSB_SELECT))
         Serial.println("Select is being held");

    if(ps2x.Button(ORANGE_FRET)) // print stick value IF TRUE
    {
        Serial.print("Wammy Bar Position:");
        Serial.println(ps2x.Analog(WHAMMY_BAR), DEC);
    }
 }

 else { //DualShock Controller

    ps2x.read_gamepad(false, vibrate);          //read controller and set large motor to spin at 'vibrate' speed

    if(ps2x.Button(PSB_START))                   //will be TRUE as long as button is pressed
         Serial.println("Start is being held");
    if(ps2x.Button(PSB_SELECT))
         Serial.println("Select is being held");

     if(ps2x.Button(PSB_PAD_UP)) {         //will be TRUE as long as button is pressed
       Serial.print("Up held this hard: ");
       Serial.println(ps2x.Analog(PSAB_PAD_UP), DEC);
      }
      if(ps2x.Button(PSB_PAD_RIGHT)){
       Serial.print("Right held this hard: ");
        Serial.println(ps2x.Analog(PSAB_PAD_RIGHT), DEC);
      }
      if(ps2x.Button(PSB_PAD_LEFT)){
       Serial.print("LEFT held this hard: ");
        Serial.println(ps2x.Analog(PSAB_PAD_LEFT), DEC);
      }
      if(ps2x.Button(PSB_PAD_DOWN)){
       Serial.print("DOWN held this hard: ");
     Serial.println(ps2x.Analog(PSAB_PAD_DOWN), DEC);
      }   

      vibrate = ps2x.Analog(PSAB_BLUE);        //this will set the large motor vibrate speed based on
                                              //how hard you press the blue (X) button    

    if (ps2x.NewButtonState())               //will be TRUE if any button changes state (on to off, or off to on)
    {

        if(ps2x.Button(PSB_L3))
         Serial.println("L3 pressed");
        if(ps2x.Button(PSB_R3))
         Serial.println("R3 pressed");
        if(ps2x.Button(PSB_L2))
         Serial.println("L2 pressed");
        if(ps2x.Button(PSB_R2))
         Serial.println("R2 pressed");
        if(ps2x.Button(PSB_GREEN))
         Serial.println("Triangle pressed");

    }   

    if(ps2x.ButtonPressed(PSB_RED))             //will be TRUE if button was JUST pressed
         Serial.println("Circle just pressed");

    if(ps2x.ButtonReleased(PSB_PINK))             //will be TRUE if button was JUST released
         Serial.println("Square just released");     

    if(ps2x.NewButtonState(PSB_BLUE))            //will be TRUE if button was JUST pressed OR released
         Serial.println("X just changed");    

    if(ps2x.Button(PSB_L1) || ps2x.Button(PSB_R1)) // print stick values if either is TRUE
    {
        Serial.print("Stick Values:");
        Serial.print(ps2x.Analog(PSS_LY), DEC); //Left stick, Y axis. Other options: LX, RY, RX
        Serial.print(",");
        Serial.print(ps2x.Analog(PSS_LX), DEC);
        Serial.print(",");
        Serial.print(ps2x.Analog(PSS_RY), DEC);
        Serial.print(",");
        Serial.println(ps2x.Analog(PSS_RX), DEC);
    } 

 }

 delay(50);

}



Di dalam artikel Bill Porter terdapat gambar yang menjelaskan koneksi kabel yang ada di connector-nya PlayStation 2. Gambar tersebut diambil dari artikel yang dibuat oleh Curios Inventor tentang Interfacing a PS2 (PlayStation 2) Controller. Koneksi kabel pada konektor tersebut dapat dilihat pada gambar di bawah ini.
PlayStation 2 Connector Wiring
Jadi ada 9 pin di dalam konektor PS2 Controller, yaitu:
  1. Pin Data
  2. Pin Command
  3. Pin Vibration Motor Power
  4. Pin Ground
  5. Pin Power 3.3V
  6. Pin Attention
  7. Pin Clock
  8. Pin Unknown
  9. Pin Acknowledge
Tetapi dari 9 pin tersebut, kita hanya akan memakai 6 buah saja, yaitu Pin 1, 2, 4, 5, 6 dan 7. Sesuai dengan library yang sudah dibuat oleh Bill Porter, koneksi pin-pin tersebut dengan board Arduino  (dapat dilihat pada kode program, pada baris ke 17) adalah sebagai berikut:
  1. Pin 1 (Data) –> Pin Digital 12 Arduino
  2. Pin 2 (Command) –> Pin Digital 11 Arduino
  3. Pin 4 (Ground) –> Pin Ground Arduino
  4. Pin 5 (Power 3.3V) –> Pin 3.3V Arduino
  5. Pin 6 (Attention) –> Pin Digital 10 Arduino
  6. Pin 7 (Clock) –> Pin Digital 13 Arduino
Untuk menghubungkan konektor PS2 dengan Arduino, anda membutuhkan jumper wires 1 pin dual-female, seperti yang ada di sini, dan jumper wires, seperti yang ada di sini. Berikut gambar jumper wires yang digunakan tersebut.
Jumper Wires 1 Pin Dual-Female
Jumper Wires
Pasang kabel jumper wires 1 pin pada konektor Wireless Receiver, hasilnya seperti pada gambar berikut.
Konektor wireless sudah dipasangkan jumper wires 1 pin
Biar gampang, kita pasangkan label di tiap-tiap kabel jumper, hasilnya seperti di bawah ini.
Konektor wireless dipasang jumper wires 1 pin dengan label
Kemudian kita hubungkan jumper wires tersebut dengan board Arduino (lihat kembali koneksi 6 pin konektor dengan board Arduino di bagian atas) , gunakan jumper wires yang dual-male. Hasilnya dapat dilihat pada gambar ini.
Konektor Wireless terhubung dengan Arduino Uno
Ok, setelah koneksi sudah terpasang, sekarang kita siap untuk mencoba koneksi wireless dengan PlayStation 2 Controller ini. Hubungkan kabel USB dari komputer ke boar Arduino. Buka IDE Arduino, siapkan Serial Monitor ( Ctrl+Shift+M) dan atur baud rate-nya pada posisi 57600. Kalau semua berjalan lancar, maka Serial Monitor akan menampilkan output dari tombol yang kita tekan pada Controller PS2. Tampilan pada Serial Monitor dapat dilihat pada gambar di bawah ini.
PS2 Wireless Controller Serial Monitor Output
Wow, kayaknya gampang ya…hmm gimana kalau kita coba untuk menggerakkan Servo. Ok, kode program di atas kita tambahkan beberapa baris kode untuk menggerakkan servo, kode lengkap dengan tambahannya dapat dilihat di bawah ini.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196


#include <PS2X_lib.h>  //for v1.6
#include <Servo.h> 

PS2X ps2x; // create PS2 Controller Class

//right now, the library does NOT support hot pluggable controllers, meaning
//you must always either restart your Arduino after you conect the controller,
//or call config_gamepad(pins) again after connecting the controller.
int error = 0;
byte type = 0;
byte vibrate = 0;

Servo myservo;
int pos = 90;

void setup(){
 Serial.begin(57600);

 //CHANGES for v1.6 HERE!!! **************PAY ATTENTION*************

 error = ps2x.config_gamepad(13,11,10,12, true, true);   //setup pins and settings:  GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error

 if(error == 0){
   Serial.println("Found Controller, configured successful");
   Serial.println("Try out all the buttons, X will vibrate the controller, faster as you press harder;");
  Serial.println("holding L1 or R1 will print out the analog stick values.");
  Serial.println("Go to www.billporter.info for updates and to report bugs.");
 }

  else if(error == 1)
   Serial.println("No controller found, check wiring, see readme.txt to enable debug. visit www.billporter.info for troubleshooting tips");

  else if(error == 2)
   Serial.println("Controller found but not accepting commands. see readme.txt to enable debug. Visit www.billporter.info for troubleshooting tips");

  else if(error == 3)
   Serial.println("Controller refusing to enter Pressures mode, may not support it. ");

   //Serial.print(ps2x.Analog(1), HEX);

   type = ps2x.readType();
     switch(type) {
       case 0:
        Serial.println("Unknown Controller type");
       break;
       case 1:
        Serial.println("DualShock Controller Found");
       break;
       case 2:
         Serial.println("GuitarHero Controller Found");
       break;
     }

  myservo.attach(9);
  myservo.write(pos);
}

void loop(){
   /* You must Read Gamepad to get new values
   Read GamePad and set vibration values
   ps2x.read_gamepad(small motor on/off, larger motor strenght from 0-255)
   if you don't enable the rumble, use ps2x.read_gamepad(); with no values

   you should call this at least once a second
   */


 if(error == 1) //skip loop if no controller found
  return; 

 if(type == 2){ //Guitar Hero Controller

   ps2x.read_gamepad();          //read controller 

   if(ps2x.ButtonPressed(GREEN_FRET))
     Serial.println("Green Fret Pressed");
   if(ps2x.ButtonPressed(RED_FRET))
     Serial.println("Red Fret Pressed");
   if(ps2x.ButtonPressed(YELLOW_FRET))
     Serial.println("Yellow Fret Pressed");
   if(ps2x.ButtonPressed(BLUE_FRET))
     Serial.println("Blue Fret Pressed");
   if(ps2x.ButtonPressed(ORANGE_FRET))
     Serial.println("Orange Fret Pressed");

    if(ps2x.ButtonPressed(STAR_POWER))
     Serial.println("Star Power Command");

    if(ps2x.Button(UP_STRUM))          //will be TRUE as long as button is pressed
     Serial.println("Up Strum");
    if(ps2x.Button(DOWN_STRUM))
     Serial.println("DOWN Strum");

    if(ps2x.Button(PSB_START))                   //will be TRUE as long as button is pressed
         Serial.println("Start is being held");
    if(ps2x.Button(PSB_SELECT))
         Serial.println("Select is being held");

    if(ps2x.Button(ORANGE_FRET)) // print stick value IF TRUE
    {
        Serial.print("Wammy Bar Position:");
        Serial.println(ps2x.Analog(WHAMMY_BAR), DEC);
    }
 }

 else { //DualShock Controller

    ps2x.read_gamepad(false, vibrate);          //read controller and set large motor to spin at 'vibrate' speed

    if(ps2x.Button(PSB_START))                   //will be TRUE as long as button is pressed
         Serial.println("Start is being held");
    if(ps2x.Button(PSB_SELECT))
         Serial.println("Select is being held");

     if(ps2x.Button(PSB_PAD_UP)) {         //will be TRUE as long as button is pressed
       Serial.print("Up held this hard: ");
       Serial.println(ps2x.Analog(PSAB_PAD_UP), DEC);
      }
      if(ps2x.Button(PSB_PAD_RIGHT)){
       Serial.print("Right held this hard: ");
        Serial.println(ps2x.Analog(PSAB_PAD_RIGHT), DEC);
      }
      if(ps2x.Button(PSB_PAD_LEFT)){
       Serial.print("LEFT held this hard: ");
        Serial.println(ps2x.Analog(PSAB_PAD_LEFT), DEC);
      }
      if(ps2x.Button(PSB_PAD_DOWN)){
       Serial.print("DOWN held this hard: ");
     Serial.println(ps2x.Analog(PSAB_PAD_DOWN), DEC);
      }   

      vibrate = ps2x.Analog(PSAB_BLUE);        //this will set the large motor vibrate speed based on
                                              //how hard you press the blue (X) button    

    if (ps2x.NewButtonState())               //will be TRUE if any button changes state (on to off, or off to on)
    {

        if(ps2x.Button(PSB_L3))
         Serial.println("L3 pressed");
        if(ps2x.Button(PSB_R3))
         Serial.println("R3 pressed");
        if(ps2x.Button(PSB_L2))
         Serial.println("L2 pressed");
        if(ps2x.Button(PSB_R2))
         Serial.println("R2 pressed");
        if(ps2x.Button(PSB_GREEN))
         Serial.println("Triangle pressed");

    }   

    if(ps2x.ButtonPressed(PSB_RED))             //will be TRUE if button was JUST pressed
         Serial.println("Circle just pressed");

    if(ps2x.ButtonReleased(PSB_PINK))             //will be TRUE if button was JUST released
         Serial.println("Square just released");     

    if(ps2x.NewButtonState(PSB_BLUE))            //will be TRUE if button was JUST pressed OR released
         Serial.println("X just changed");    

    if(ps2x.Button(PSB_L1) || ps2x.Button(PSB_R1)) // print stick values if either is TRUE
    {
        Serial.print("Stick Values:");
        Serial.print(ps2x.Analog(PSS_LY), DEC); //Left stick, Y axis. Other options: LX, RY, RX
        Serial.print(",");
        Serial.print(ps2x.Analog(PSS_LX), DEC);
        Serial.print(",");
        Serial.print(ps2x.Analog(PSS_RY), DEC);
        Serial.print(",");
        Serial.println(ps2x.Analog(PSS_RX), DEC);
    } 

    if(ps2x.Analog(PSS_RX) != 128) //if right analog stick is moved on X axis right-left
    {
      Serial.println("Right Stick Moves!");
      if(ps2x.Analog(PSS_RX) > 128)
      {
        myservo.write( map(ps2x.Analog(PSS_RX), 129,255,91,180));
        delay(15);
      }
      if(ps2x.Analog(PSS_RX) < 128)
      {
        myservo.write( map(ps2x.Analog(PSS_RX), 0,127,0,89));
        delay(15);
      }
    }
    if(ps2x.Analog(PSS_RX) == 128) //if right analog stick is center
    {
        Serial.println("Servo Centered!");
        myservo.write(90);
        delay(15);
    }

 }

 delay(50);

}



Ok, kode tambahan untuk menggerakkan servo dapat dilihat pada baris 2, 13, 14, 54, 55 dan 171-190. Hasil dari kode program tersebut, servo akan bergerak ke kanan atau ke kiri mengikuti gerakan Stik Analog bagian kanan pada sumbu X. Hehehe…makin seru nih, tertarik untuk mencoba?
Baiklah, itu tadi tutorial tentang interfacing PlayStation 2 Wireless Controller dengan Arduino Uno. Semoga dapat membantu teman-teman yang memerlukannya. Silahkan berkreasi untuk membuat karya yang makin unik!


http://blog.famosastudio.com/2011/10/tutorial/wireless-playstation-2-controller-dengan-arduino-uno/396

Popular Posts