DIEKONET1

Dieko Warnet, Service Komputer, & Micro Controller

Kamis, 18 Oktober 2012

ROBOT ARDUINO DENGAN STICK WIRELESS PS2 SEBAGAI CONTROLLER

 Pada Video diatas adalah robot arduino yang di kendalikan dengan stick ps 2 wireless, untuk membuat robot seperti itu kita membutuhkan bahan-bahan sebagai berikut :

1.    1 Board Arduino Uno/DFRduino

2.    1 Motor driver 1A sebagai penggerak motor dc 6V

3.    2 Motor DC 6 V

4.    1 Stick Ps2 wireless beserta receivernya

5.    2 Roda Motor DC

6.    1 Baterai 9V

7.    1 Clip baterai 9V

8.    1 Jack Dc 3.5mm



9.    4 Baterai AA

10.  Male in Header secukupnya
11.  Female Pin Header

12. Kabel
13.  Doa


Nah setelah mempersiapkan bahan-bahannya sekarang kita mulai merakit robot tapi sebelum merakit robot tersebut ada baiknya anda mengerti cara kerja daripada stick PS tersebut untuk itu perhatikan pada gambar berikut :

Sumbu Koordinat X dan Y

Pada gambar diatas merupakan cara kerja dari analog stick yang terdiri dari 2 sumbu X dan Y pada sumbu Y terdapat nilai minimum 0, 128 sebagai nilai tengah dan 255 sebagai nilai maksimal sehingga apabila dalam posisi netral maka stick analog bernilai 128, 128 yang mana penerapannya pada motor robot yang akan kita buat pada posisi ini robot akan diam ( tidak bergerak ) sedangkan untuk membuat motor maju maka koordinat X < dari 128 dan untuk bergerak mundur nilai koordinat X > dari 128 sedang untuk bergerak ke kiri maka nilai koordinat Y < 128 dan untuk berbelok kekanan nilai koordinat Y > dari 128 untuk lebih jelas perhatikan pada gambar yang diarsir dengan warna.

Berdasarkan gambar diatas dapat diartikan seperti berikut :

  • Motor bergerak maju apabila stick berada pada koordinat berwarna Merah
  • Motor bergerak mundur apabila stick berada pada koordinat berwarna Kuning
  • Motor berbelok ke kanan apabila stick berada pada koordinat berwarna Biru
  • Motor berbelok ke kiri apabila stick berada pada koordinat berwarna Hijau
  • Motor Berhenti apabila stick berada pada koordinat berwarna Putih
Pada penjelasan diatas maka pergerakan stick dapat diterjemahkan kedalam koordinat dan angka yang kurang lebihnya seperti ini :

  • Untuk maju maka : Y < 64 dan X di antara 64 dan 192
  • Untuk mundur maka: Y > 192 dan X di antara 64 dan 192
  • Untuk kanan maka : X > 192 dan Y di antara 64 dan 192
  • Untuk kiri maka : X < 64 dan Y di antara 64 dan 192
Apabila telah memahami pergerakan daripada stick tersebut maka analogi diatas dapat di buatkan kode untuk arduino  program :
  • 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)))
Setelah penjelasan diatas maka tibalah saatnya untuk merakit robot setelah mempersiapkan bahan-bahannya, untuk merakit stick pada board arduino ada baiknya anda memperhatikan gambar berikut :


Skema receiver stick Ps2 Wireless




Pada gambar diatas dijelaskan 9 pin dari receiver wireless ps2 yang akan kita hubungkan pada pin arduino :

  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
Namun kita hanya membutuhkan 6 pin dari pin wireless tersebut yang diantaranya Pin 1, 2, 4, 5, 6 dan 7.Merujuk pada library Bill Porter maka pin yang akan dihubungkan pada board arduino 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 pin pada wireless stick dan arduino kita membutuhkan yang namanya black housing yang telah di solder dengan pin male header perhatikan gambar di bawah :

Black Housing / female header pin

Pin header Male

Solderlah kabel pada female header pin lalu pada ujung female header solder dengan pin header male sehingga akan terlihat seperti gambar di bawah ini :

Jumper kabel DIY

Wireless Pins & Arduino Pins





Anda dapat menambahkan led bila anda mau seperti robot yang saya buat ada dua led yang terpasang pada body robot satu di depan dan satu dibelakang ,...nah setelah semua pin terhubung maka kita tinggal membuat kode program yang kurang lebihnya seperti dibawah ini :


 #include <PS2X_lib.h> //PS2X Library
int led1 = 4;  //Penambahan Led 1
int led2 = 7;  //Penambahan Led 2
//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() {
pinMode(led1, OUTPUT);  // Tambahan Led1
pinMode(led2, OUTPUT);  // Tambahan Led2
  //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
       digitalWrite(led1, HIGH);
      Serial.println("FORWARD");
      RMotor(RIGHTSPEED,true); // turn it on going forward
      LMotor(LEFTSPEED,true);  // turn it on going forward
      digitalWrite(led1, LOW);
    }
    else if((ps2x.Analog(PSS_RY) > 192) && ((ps2x.Analog(PSS_RX) >= 64) && (ps2x.Analog(PSS_RX) <= 192)))
    {
      //move backward
      digitalWrite(led2, HIGH);
      Serial.println("BACKWARD");
      RMotor(RIGHTSPEED,false); // turn it on going backward
      LMotor(LEFTSPEED,false);  // turn it on going backward
      digitalWrite(led2, LOW);

    }
    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);
  }
}
Sebelum membuat kode program tersebut anda harus menginstal library yang dapat di download dari http://www.billporter.info/playstation-2-controller-arduino-library-v1-0/ setelah anda mendownload install library tersebut pada directory arduino anda tutorial ini dibuat berdasarkan pada FSR famosastudio.com .

Ok sampai disini tutorial saya  selamat mencoba..........

9 komentar:

  1. Balasan
    1. Silahkan kesini gan http://www.billporter.info/2010/06/05/playstation-2-controller-arduino-library-v1-0/ maaf balasnya lama

      Hapus
    2. gan jika saya mengganti Motor driver 1A menjadi IC L932D, bisa tolong jelaskan di bagian mana saya harus mengganti programnya?

      Hapus
    3. gan kalo saya menggunakan IC L293D sebagai pengganti Motor driver 1A , bisa tolong jelaskan di bagian mana saya harus mengganti programnya? terimakasih gan :)

      Hapus
  2. Driver motor l293d itu merupakan driver motor 1A gan, sebenarnya penggantian kode programnya tinggal agan ganti aja pin mana yang mau agan inputkan ke arduino kalau saya dari driver motor 1a nya saya inputkan ke pwn pin 5 arduino sedangkan motor kiri saya inputkan ke pin pwm 6 arduino sedangkan untuk direction kanan pin 4 arduino sedangkan kiri pin 7 arduino semoga ini dapat membantu agan.

    BalasHapus
  3. Gan, Sehabis Di Download Library-v1-0, Trus Di Apain Lagi Gan ??

    BalasHapus
    Balasan
    1. Setelah di download bisa di gunakan dengan arduino IDE pak

      Hapus
  4. kalau komponennya itu belinya dimana?
    terima kasih

    BalasHapus
    Balasan
    1. Boleh beli di saya boleh juga di tempat lain

      Hapus