Member

Search

Memuat...

Google+ Followers

Iklan

promo mobil murah
Diberdayakan oleh Blogger.
Kamis, 24 Oktober 2013

FSRBSiapDigerakkanSecaraRemoteControl300 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 (george.frick@gmail.com)  * 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!

Silahkan Gunakan Facebook Comment, Jika Anda Tidak Memiliki Url Blog!

Like Facebook ya! Follow Twitter mu by Invader's , Ingin ingin menerima posting terbarunya? TWITTER?
Related Posts Plugin for WordPress, Blogger...

Total Tayangan Laman

Translate