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.
Kemudian siapkan Wireless PlayStation 2 Controller dan Receiver-nya.
Hubungkan Receiver dengan Arduino Uno seperti yang sudah dijelaskan pada posting ini. Hasilnya seperti pada gambar berikut ini.
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.
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.
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
- 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
- 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.
Kode program di atas dapat digunakan untuk robot-robot yang lain, asal dilakukan penyesuaian pada kode program dengan hardware yang dipergunakan. Selamat mencoba!
range dari joysticknya seberapa jauh ???
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 🙂
Pak kalau menggunakan tombol action lainnya bagaimana bisa dishare?
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 🙂
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
Coba dilihat lagi Mas 🙂
Untuk maju kodenya spt ini:
Untuk mundur:
Kode diatas itu untuk Stik Analog Kanan, untuk Stik Analog Kiri, tinggal diganti PSS_RX –> PSS_LX, PSS_RY –> PSS_LY.
siang pak
kalo boardnya pake DFRduino UNO V2.0 kira2 bisa ga?
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 😀
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
maaf mas zerfani, saya mau tanya…
kalau untuk kontrol servo sesuai derajatnya gimana ya sesuai dengan penekanan button stick wireless…
mohon bantuannya, terima kasih…. 🙂
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???
pak mohon dijelaskan PWMnya dari arduino Uno, ouputanya di pin mana?? saya newbie pak terima kasih,,,
Pak maaf saya mau tanya, itu outputan PWM dari arduino yg dimasukan ke drivermotor itu di pin mana?? terima kasih mohon penjelasan pak
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