Wireless PlayStation 2 Controller dengan FSRB

Setelah pada posting sebelumnya kita mempelajari cara interfacing Wireless PlayStation 2 Controller dengan Arduino Uno, maka pada posting kali ini kita mencoba menerapkannya pada aplikasi Robotik. Aplikasi Robotik paling pas untuk mencoba tentu saja Famosa Studio Robotik Kit atau FSRB. FSRB adalah produk buatan Famosa Studio, yang bisa dilihat di sini. Tutorial lengkap tentang cara merakit FSRB dan pemrogramannya bisa dilihat di sini.

Pertama kita siapkan FSRB-nya. Lepaskan Sensor Jarak Sharp GP2D12 dan Micro Servo-nya, serta kabel jumper-nya. Sehingga tampilan FSRB menjadi seperti pada gambar berikut ini.

FSRB tanpa Micro Servo dan Sensor Jarak

Kemudian siapkan Wireless PlayStation 2 Controller dan Receiver-nya.

FSRB, Wireless PS2 Controller dan Receiver

Hubungkan Receiver dengan Arduino Uno seperti yang sudah dijelaskan pada posting ini. Hasilnya seperti pada gambar berikut ini.

Wireless Receiver terhubung dengan Arduino Uno via Motor Shield 1A

Ok, sekarang kita siap dengan pemrogramannya.

Kita akan menggunakan Analog Stik Kanan untuk menggerakkan FSRB maju, mundur, belok kanan dan kiri. Selain analog stik, kita juga memakai tombol Up, Down, Right dan Left pada controller untuk menggerakkan FSRB.

Untuk tombol Up, Down, Right dan Left, kita cukup menggunakan kode-kode ini:

  • Tombol Up: ps2x.Button(PSB_PAD_UP)
  • Tombol Down: ps2x.Button(PSB_PAD_DOWN)
  • Tombol Right: ps2x.Button(PSB_PAD_RIGHT)
  • Tombol Left: ps2x.Button(PSB_PAD_LEFT)

Nah, untuk analog stik agak sedikit berbeda pendekatannya.

Analog stik, baik yang kanan maupun yang kiri, terdiri dari 2 sumbu, X dan Y. Masing-masing dengan nilai minimum 0 sampai dengan 255, dengan nilai tengah 128. Untuk lebih jelasnya lihat gambar berikut ini.

Koordinat X, Y pada PS2 Controller

Jadi bila analog stik berada pada posisi netral (posisi tengah), koordinat X dan Y adalah: (128, 128). Pada posisi netral ini kita tetapkan bahwa FSRB tidak akan bergerak alias motor stop. Motor bergerak maju (Forward) apabila koordinat X lebih kecil dari 128, lalu bergerak mundur (Backward) bila koordinat X lebih besar dari 128. Begitu juga untuk belok kanan dan kiri, motor berbelok ke kiri (Left) apabila koordinat Y lebih kecil dari 128, kemudian berbelok ke kanan (Right) bila koordinat Y lebih besar dari 128. Agar ada sedikit ruang pada koordinat masing-masing gerakan, kita buat pemetaan seperti pada gambar berikut ini.

Pemetaan Gerakan FSRB pada Sumbu XY

Berdasarkan pemetaan di atas, gerakan FSRB menggunakan analog stik adalah sebagai berikut:

  • Bergerak maju pada koordinat berwarna Merah
  • Bergerak mundur pada koordinat berwarna Kuning
  • Berbelok ke kanan pada koordinat berwarna Biru
  • Berbelok ke kiri pada koordinat berwarna Hijau
  • Berhenti pada koordinat berwarna Putih
Dari pemetaan gerakan tersebut, diterjemahkan ke dalam angka koordinat, kurang lebih seperti ini:
  • Maju: Y < 64 dan X di antara 64 dan 192
  • Mundur: Y > 192 dan X di antara 64 dan 192
  • Kanan: X > 192 dan Y di antara 64 dan 192
  • Kiri: X < 64 dan Y di antara 64 dan 192
Angka-angka koordinat tersebut kita terjemahkan ke dalam program Arduino yang sesuai dengan library PS2 Controller, menjadi seperti ini:
  • Maju: ((ps2x.Analog(PSS_RY) < 64) && ((ps2x.Analog(PSS_RX) >= 64) && (ps2x.Analog(PSS_RX) <= 192)))
  • Mundur: ((ps2x.Analog(PSS_RY) < 64) && ((ps2x.Analog(PSS_RX) >= 64) && (ps2x.Analog(PSS_RX) <= 192)))
  • Kanan:((ps2x.Analog(PSS_RX) < 64) && ((ps2x.Analog(PSS_RY) >= 64) && (ps2x.Analog(PSS_RY) <= 192)))
  • Kiri:((ps2x.Analog(PSS_RX) < 64) && ((ps2x.Analog(PSS_RY) >= 64) && (ps2x.Analog(PSS_RY) <= 192)))

Lebih lengkapnya dapat dilihat pada kode pemrograman 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
197
198
199
200
201
202
/*
 * Program utk Famosa Studio Robotik Kit ini diadaptasi dari
 * program yang dibuat oleh
 * George Frick ([email protected])
 * dan dipublikasikan di sini:
 * http://georgefrick.blogspot.com/2010/02/arduino-robot-2-wandering-tank.html
 *
 * Famosa Studio Robotik Kit (FSRB) adalah produk robotik dari Toko Online Famosa Studio.
 * Dilengkapi Arduino Uno, Motor Shield 1A, Standard Servo, Micro Servo dan Sharp GP2D12.
 *
 * Tambahan kode untuk penggunaan PS2 Wireless Controller dengan FSRB
 */

#include <PS2X_lib.h> //PS2X Library

//PS2X - Start
PS2X ps2x; // create PS2 Controller Class

int error = 0;
byte type = 0;
byte vibrate = 0;
//PS2X - End

// Constants for robot wheel.
const int RIGHTSPEED = 255;  //right motor speed
const int LEFTSPEED  = 255;  //left motor speed
int motorR = 5;       //right motor
int dirmotorR = 4;    //motor direction
int motorL = 6;       //left motor
int dirmotorL = 7;    //motor direction

/*
 * Initializes everything. Is run once.
 */

void setup() {
  //PS2X - Start
  Serial.begin(57600);
  //Serial.begin(9600);           // set up Serial library at 9600 bps
  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;
    }

  //PS2X - End

}  

/*
 * Runs continuously.
 * 1. Update Servo.
 * 2. Check IR range sensor.
 * 3. Move Robot
 */
 

void loop() {
  //PS2X - Start
  if(error == 1) //skip loop if no controller found
    return;
  if(type == 2) //Guitar Hero Controller
    return; //not used
  else { //DualShock Controller
    ps2x.read_gamepad(false, vibrate);          //read controller and set large motor to spin at 'vibrate' speed

    //if right analog stick is moved on Y axis forward-backward, or X axis right-left turn
    if((ps2x.Analog(PSS_RY) < 64) && ((ps2x.Analog(PSS_RX) >= 64) && (ps2x.Analog(PSS_RX) <= 192)))
    {
      //move forward
      Serial.println("FORWARD");
      RMotor(RIGHTSPEED,true); // turn it on going forward
      LMotor(LEFTSPEED,true);  // turn it on going forward
    }
    else if((ps2x.Analog(PSS_RY) > 192) && ((ps2x.Analog(PSS_RX) >= 64) && (ps2x.Analog(PSS_RX) <= 192)))
    {
      //move backward
      Serial.println("BACKWARD");
      RMotor(RIGHTSPEED,false); // turn it on going backward
      LMotor(LEFTSPEED,false);  // turn it on going backward
    }
    else if((ps2x.Analog(PSS_RX) < 64) && ((ps2x.Analog(PSS_RY) >= 64) && (ps2x.Analog(PSS_RY) <= 192)))
    {
      //move left
      Serial.println("LEFT");
      RMotor(RIGHTSPEED,true); // turn it on going left
      LMotor(LEFTSPEED,false); // turn it on going left
    }
    else if((ps2x.Analog(PSS_RX) > 192) && ((ps2x.Analog(PSS_RY) >= 64) && (ps2x.Analog(PSS_RY) <= 192)))
    {
      //move right
      Serial.println("RIGHT");
      RMotor(RIGHTSPEED,false); // turn it on going right
      LMotor(LEFTSPEED,true);   // turn it on going right
    }
    //using button up, down, right and left for movement
    else if(ps2x.Button(PSB_PAD_UP))
    {
      Serial.print("Up held this hard: ");
      Serial.println(ps2x.Analog(PSAB_PAD_UP), DEC);
      //move forward
      Serial.println("FORWARD");
      RMotor(RIGHTSPEED,true); // turn it on going forward
      LMotor(LEFTSPEED,true);  // turn it on going forward
    }
    else if(ps2x.Button(PSB_PAD_RIGHT))
    {
      Serial.print("Right held this hard: ");
      Serial.println(ps2x.Analog(PSAB_PAD_RIGHT), DEC);
      //move right
      Serial.println("RIGHT");
      RMotor(RIGHTSPEED,false); // turn it on going right
      LMotor(LEFTSPEED,true);   // turn it on going right
    }
    else if(ps2x.Button(PSB_PAD_LEFT))
    {
      Serial.print("LEFT held this hard: ");
      Serial.println(ps2x.Analog(PSAB_PAD_LEFT), DEC);
      //move left
      Serial.println("LEFT");
      RMotor(RIGHTSPEED,true); // turn it on going left
      LMotor(LEFTSPEED,false); // turn it on going left
    }
    else if(ps2x.Button(PSB_PAD_DOWN))
    {
      Serial.print("DOWN held this hard: ");
      Serial.println(ps2x.Analog(PSAB_PAD_DOWN), DEC);
      //move backward
      Serial.println("BACKWARD");
      RMotor(RIGHTSPEED,false); // turn it on going backward
      LMotor(LEFTSPEED,false);  // turn it on going backward
    }
    else
    {
      //stopped
      Serial.println("Robot Stopped!");
      RMotor(0,false); //stopped
      LMotor(0,false); //stopped
    }

  }  

  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);
  //PS2X - End

}  

// right motor
void RMotor(int pwmspeed, boolean forward) {
  analogWrite(motorR, pwmspeed);
  if (forward) {
    digitalWrite(dirmotorR, HIGH);
  }
  else {
    digitalWrite(dirmotorR, LOW);
  }
}

//left motor
void LMotor(int pwmspeed, boolean forward) {
  analogWrite(motorL, pwmspeed);
  if (forward) {
    digitalWrite(dirmotorL, HIGH);
  }
  else {
    digitalWrite(dirmotorL, LOW);
  }
}

/* EOF */

Apabila tidak terdapat kesalahan dalam pemrograman, maka FSRB siap digerakkan secara remote dengan Wireless PlayStation 2 Controller.

FSRB siap digerakkan dengan Wireless PS2 Controller

Kode program di atas dapat digunakan untuk robot-robot yang lain, asal dilakukan penyesuaian pada kode program dengan hardware yang dipergunakan. Selamat mencoba!

You may also like...

14 Responses

  1. bahar says:

    range dari joysticknya seberapa jauh ???

    • Zerfani Yulias says:

      Wireless Playstation 2 Controller ini punya jangkauan 10 meter. Saya coba sekitar 9,5m adalah jarak terjauh yang masih bisa menangkap sinyal. Tapi lumayan lah 🙂

  2. susiloharjo says:

    Pak kalau menggunakan tombol action lainnya bagaimana bisa dishare?

    • Zerfani Yulias says:

      Mas Susilo, di tutorial Wireless PlayStation 2 Controller dengan Arduino Uno sudah ada contoh cara pakai semua tombol yang ada di PlayStation Controller tersebut.

      Misalnya, untuk tombol Bulat (tombol dengan gambar lingkaran berwarna Merah), kodenya: ps2x.ButtonPressed(PSB_RED) , nah kode ini tinggal disesuaikan dengan pemakaiannya. Contoh pemakaian: if (ps2x.ButtonPressed(PSB_RED)) { di sini dituliskan kode untuk menjalankan sesuatu jika tombol tersebut ditekan } dan seterusnya.

      Mudah-mudahan cukup jelas 🙂

  3. Anggit Virgiawan says:

    Pak kalau misalkan untuk analog yg seblah kiri,,,untuk gerak ke kiri,kanan,depan belakang itu gmn pak kodenya saya liat yg bapak
    Maju: ((ps2x.Analog(PSS_RY) = 64) && (ps2x.Analog(PSS_RX) <= 192)))
    Mundur: ((ps2x.Analog(PSS_RY) = 64) && (ps2x.Analog(PSS_RX) <= 192)))

    untuk kode maju dan mundur ko sama pak?
    mohon bantuannya ya pak

    • Zerfani Yulias says:

      Coba dilihat lagi Mas 🙂
      Untuk maju kodenya spt ini:

      1
      ((ps2x.Analog(PSS_RY) < 64) && ((ps2x.Analog(PSS_RX) >= 64) && (ps2x.Analog(PSS_RX) <= 192)))

      Untuk mundur:

      1
      ((ps2x.Analog(PSS_RY) > 192) && ((ps2x.Analog(PSS_RX) >= 64) && (ps2x.Analog(PSS_RX) <= 192)))

      Kode diatas itu untuk Stik Analog Kanan, untuk Stik Analog Kiri, tinggal diganti PSS_RX –> PSS_LX, PSS_RY –> PSS_LY.

  4. Firman says:

    siang pak

    kalo boardnya pake DFRduino UNO V2.0 kira2 bisa ga?

  5. ryza says:

    Pak kalo dihubungkan dgn bluetooth slave trus di kendalikan dgn accelometernya android kira2 program arduinonya gmn ya kalo pake motor servo??

    kalo di arduino menggunakan motor DC yg saya tahu menggunakan 1A Motor Shield ,tp kalo menggunakan motor servo apa harus menggunakan jg pak??

    maaf masih newbie pak 😀

  6. Ryza says:

    Pak kalo arduino nya saya hubungkan dengan bluetooth slave trus dikontrol dengan sensor accelometer pada android kira2 programnya gmn ya??
    apa hampir sama dengan yg di atas??

    maaf terlalu banyak tanya masih newbie
    thx

  7. ilham says:

    maaf mas zerfani, saya mau tanya…
    kalau untuk kontrol servo sesuai derajatnya gimana ya sesuai dengan penekanan button stick wireless…

    mohon bantuannya, terima kasih…. 🙂

  8. Gusti Ngurah W W says:

    Pak Zerfani Yulias Saya mau tanya?? saya sebagai orang awan di dunia robotik lebih gampang menggunakan Bluetooth Shield apa menggunakan Wireless PlayStation 2 Controller untuk pembuatan robot berbasis mikrokontroler menggunakan sistem pengendali remot kontrol???

  9. hasan says:

    pak mohon dijelaskan PWMnya dari arduino Uno, ouputanya di pin mana?? saya newbie pak terima kasih,,,

  10. Hasan says:

    Pak maaf saya mau tanya, itu outputan PWM dari arduino yg dimasukan ke drivermotor itu di pin mana?? terima kasih mohon penjelasan pak

  11. fitri aulia says:

    saya mau bertanya , jika arduino.exe cannot run because it could create folder to store your setting. bagaimana itu caranya biar bisa run ya? terimakasih

Leave a Reply

Your email address will not be published. Required fields are marked *

Facebook