Lompat ke konten Lompat ke sidebar Lompat ke footer

Cara merakit Robot Lengan menggunakan 6 buah motor servo

Robot lengan atau arm robot banyak ditemui di industri dan otomatisasi. Robot ini dapat digunakan untuk mengangkat benda atau memindahkan benda

dari tempat satu ke tempat lainnya.Untuk merakit Robot lengan (arm robot) maka bisa menggunakan motor servo dan dikontrol pergerakannya menggunakan mikrokontroller. Dalam pembahasan ini kita menggunakan mikrokontroller Arduino Uno dengan menggunakan bahasa pemograman C++.

Guna merakit lengan robot maka dibutuhkan berbagai alat dan bahan yaitu :


  1. Plat almunium robot lengan
  2. Motor servo type MG996R sebanyak 6 buah
  3. Board Arduino UNO R3
  4. Driver servo PCA9685
  5. Sensor Ultrasonic
  6. Kabel jumper
  7. Power supply 5 V / 3 A
  8. Obeng +
  9. Tang lancip
  10. Bor tangan
  11. Kabel
  12. Buzzer

Setelah alat dan bahan disiapkan, maka proses pertama adalah merakit lengan robot (arm robot).

Proses perakitan  robot lengan dimulai dari memasang motor servo 0 pada bagian bawah, lalu dilanjutkan persendian pada lengan robot dengan menggunakan motor servo 1, 2, 3, 4. Sedangkan untuk japit lengan robot (arm robot) diletakkan motor servo 5. 

Dalam merakit ini gunakan obeng plus dan tang. Pada saat memasang motor servo pada persendian robot waka wajib menggunakan bearing supaya pergerakan sendinya menjadi lancar. Pemasangan plat dan motor servo harus benar karena kalau tidak benar maka pergerakan sendinya bisa saja tidak lancar atau tidak sesuai. 


Dalam proses perakitan robot lengan ini tidak mungkin di lampirkan foto-fotonya secara detail dalam website ini, sehingga sebaiknya anda menyimak pada video dibawah ini :


sumber video : https://www.youtube.com/watch?v=WQRPdNfW80Q&t=34s

Setelah proses perakitan maka kita harus memastikan ke 6 buah servo bekerja normal dan dicari data sudut pergerakan maksimum / minimum setiap motor servo sesuai sendi pergerakannya. Karena jika pergerakan motor servo melebihi batas dalam pergerakan sendinya, maka motor bisa nyangkut atau bergerak tidak normal. Jadi data sudut pergerakan servo 1,2,3,4,5, dan 6 akan berbeda-beda sesuai pergerakannya. Didalam program sudah diatur pergerakan maksimum dan mnimum, tetapi pergerakan tersebut masih bisa di modifikasi sesuai keinginan.

Untuk mengatur pergerakan sudut motor servo maka harus memahami prinsip kerja motor servo. Motor Servo diputar berdasarkan sinyal Pulse width Modulation (PWM). Jadi sebelum merakit lengan robot harus menguasai bagaimana cara memutar motor servo sesuai sudutnya melalui sinyal PWM. Sinyal PWM bisa dibangkitkan oleh mikrokontroller arduino melalui pemograman. Untuk jelasnya tentang pembahasan PWM bisa lihat disini

Jika ingin mengetahui cara mengendalikan putaran motor servo menggunakan arduino maka bisa buka materi di website ini, dengan cara klik mengendalikan motor servo. Jika dirasa penjelasannya masih kurang maka bisa tonton video youtubenya tentang motor servo yaitu pada channel youtube "HENDRY KURNIAWAN" judulnya : Tutorial motor Servo Arduino.

Setelah menguasai prinsip kerja motor servo maka anda bisa melakukan proses pemograman lengan robot. Untuk menggerakkan motor servo yang banyak pada lengan robot maka jangan menggunakan catu daya 5 volt langsung keluaran dari Arduino uno karena arus listriknya terbatas. Jadi khusus catu daya motor servonya kita  menggunakan catu daya eksternal tersendiri misalnya power supply 5 volt/ 3 s.d 5 Ampere.

Sebagai pengendali motor servo yang banyak maka kita membutuhkan modul driver khusus motor servo yaitu modul  PCA9685. Pada program Arduino IDE standar belum dilengkapi library PCA9685. Jadi anda harus menambahkan librarynya terlebih dahulu. Tentang cara penambahan library PCA9685 bisa dibrowsing di internet.

Setelah selesai menambahkan library PCA9685 lalu hubungkan arduino uno, PCA9685 dan motor servo seperti gambar di bawah ini:

 

sumber gambar : https://learn.adafruit.com/assets/2221

Jika menggunakan motor servo yang bnyak maka bisa menggunakan semua output modul PCA9685. Untuk jelasnya bisa dilihat pada gambar dibawah ini : 

sumber gambar : https://steemit.com/utopian-io/@drencolha/adafruit-pca9685-pwm-servo-driver-setup-arduino-library-use-shown-with-an-example-project-tutorial

Pada robot lengan ini digunakan juga sensor ultara sonic untuk mendeteksi objek/benda. Pada saat benda terdeteksi maka robot akan aktif dan pada saat benda tidak terdeteksi maka robot selalu standbye menunggu bendanya ada.Type Sensor Ultarasonic yang digunakan adalah HC-SR04. Pin Trig pada HC-SR04 dihubungkan  ke pin 13 Arduino Uno dan pin Echo HC-SR04 dihubungkan ke pin 12 Arduino Uno. Sedangkan Tegangan Vcc HC-SR04 hubungkan dengan 5 volt Arduino dan GND HC-SR04 disatukan dengan GND Arduino Uno.

Pada robot lengan ini dilengkapi juga dengan buzzer. Buzzer dihubungkan dengan pin 11 Arduino. Buzzer kita gunakan sebagai tanda isyarat. Pada saat robot pertama kali di hidupkan akan ada bunyi buzzer 3 kali, ini memberi peringatan di sekitar robot agar jangan terlalu dekat dengan lengan robot karena robot sudah aktif. Tanda bunyi buzzer berikutnya adalah saat ada objek atau benda yang akan dipindahkan sudah terpasang dengan benar di posisinya. Selama benda tidak terpasang dengan tepat di posisinya maka buzzer tidak akan berbunyi. Jika buzzer berbunyi maka robot akan segera bereaksi untuk memindahkan barang tersebut. 

Setelah selesai merakit maka bisa membuat sketch program Arduino robot lengan seperti dibawah ini :

//Program robot lengan mengunakan PCA9685

//Oleh : Hendry Kurniawan,S.Pd
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
uint8_t servonum0 = 0; //servo 0 paling bawah untuk kanan kiri
uint8_t servonum1 = 1; //sevo 1 sendi pertama untuk naik turun
uint8_t servonum2 = 2; //sevo 2 sendi kedua untuk naik turun
uint8_t servonum3 = 3; //sevo 3 sendi ketiga untuk naik turun
uint8_t servonum4 = 4; //sevo 4 sendi rotate kiri kanan pada capit
uint8_t servonum5 = 5; //sevo 5 capit buka tutup
 
const int PIN_TRIG = 13;
const int PIN_ECHO = 12;
int BUZ = 11;
 
void setup(){
  delay(1000);
  Serial.begin (9600);
  pinMode(PIN_TRIG, OUTPUT);
  pinMode(PIN_ECHO, INPUT);
  pinMode(BUZ, OUTPUT);
  pwm.begin();
  pwm.setOscillatorFrequency(27000000);
  pwm.setPWMFreq(50); 
  delay(1000);
 
  //buzzer
  digitalWrite(BUZ,HIGH);
  delay(1000);
  digitalWrite(BUZ,LOW);
  delay(500);
  digitalWrite(BUZ,HIGH);
  delay(1000);
  digitalWrite(BUZ,LOW);
  delay(500);
  digitalWrite(BUZ,HIGH);
  delay(1000);
  digitalWrite(BUZ,LOW);
  delay(1000);
 
  //Robot standbye
    pwm.setPWM(servonum0, 0, 250); //
    delay(1000);
    pwm.setPWM(servonum1, 0, 250); //
    delay(1000);
    pwm.setPWM(servonum2, 0, 400); //
    delay(1000);
    pwm.setPWM(servonum3, 0, 400); //
    delay(1000);
   
    pwm.setPWM(servonum4, 0, 100); // kiri
    delay(1000);
    pwm.setPWM(servonum4, 0, 400); // kanan
    delay(1000);
    pwm.setPWM(servonum4, 0, 290); // center.
    delay(1000);
    pwm.setPWM(servonum5, 0, 220); // buka capit
    delay(1000);
    pwm.setPWM(servonum5, 0, 320); // tutup capit
    delay(1000);
}
 
void loop(){
  // Berikan isyarat HIGH pada pin trig 10 mikrodetik
     digitalWrite(PIN_TRIG, HIGH);
     delayMicroseconds(10);  // Tunda 10 mikrodetik
     digitalWrite(PIN_TRIG, LOW);

  // Baca hasilnya di pin echo
     double selang = pulseIn(PIN_ECHO, HIGH);
 
  // Hitung jarak yang diperoleh
     double jarak = 0.0343 * ( selang / 2);
 
  //deteksi objek jika ada lalu ambil objek
      if (jarak > 4.5)
        {
        Serial.println("Barang tidak ada atau posisi belum tepat");
        }
      else
        {
        digitalWrite(BUZ,HIGH);
        delay(300);
        digitalWrite(BUZ,LOW);
        delay(100);
        Serial.print(jarak);
        Serial.println(" cm");
        delay(1000);
       
        //----MENUJU OBJEK
       
        //-----------Servo 2 turun
        for (uint16_t pulselen2 = 400; pulselen2 > 330; pulselen2--)
          {
          pwm.setPWM(servonum2, 0, pulselen2);
          delay (10);
          }
 
        //-----------Servo 1 angkat sedikit
        for (uint16_t pulselen1 = 250; pulselen1 > 210; pulselen1--)
          {
          pwm.setPWM(servonum1, 0, pulselen1);
          delay (10);
          }
         
         //-----------Servo 0 menuju objek
        for (uint16_t pulselen0 = 250; pulselen0 < 380; pulselen0++)
          {
          pwm.setPWM(servonum0, 0, pulselen0);
          delay (10);
          }
 
       //-----------Servo 3 turun
        for (uint16_t pulselen3 = 400; pulselen3 < 450; pulselen3++)
          {
          pwm.setPWM(servonum3, 0, pulselen3);
          delay (10);
          }
 
        //-----------Servo 5 buka capit
        for (uint16_t pulselen5 = 320; pulselen5 > 210; pulselen5--)
          {
          pwm.setPWM(servonum5, 0, pulselen5);
          delay (10);
          }
     
       //-----------Servo 1 turun
        for (uint16_t pulselen1 = 210; pulselen1 < 250; pulselen1++)
          {
          pwm.setPWM(servonum1, 0, pulselen1);
          delay (10);
          }
 
        //-----------Servo 2 turun
        for (uint16_t pulselen2 = 330; pulselen2 > 280; pulselen2--)
          {
          pwm.setPWM(servonum2, 0, pulselen2);
          delay (20);
          }
 
        delay(2000);
       
        //-----------Servo 5 tutup capit
        for (uint16_t pulselen5 = 220; pulselen5 < 280; pulselen5++)
          {
          pwm.setPWM(servonum5, 0, pulselen5);
          delay (10);
          }
 
        //-----------Servo 2 naik
        for (uint16_t pulselen2 = 280; pulselen2 < 330; pulselen2++)
          {
          pwm.setPWM(servonum2, 0, pulselen2);
          delay (10);
          }
 
        //-----------Servo 1 naik
        for (uint16_t pulselen1 = 250; pulselen1 > 200; pulselen1--)
          {
          pwm.setPWM(servonum1, 0, pulselen1);
          delay (10);
          }
 
        //-----------Servo 3 turun
        for (uint16_t pulselen3 = 450; pulselen3 < 500; pulselen3++)
          {
          pwm.setPWM(servonum3, 0, pulselen3);
          delay (10);
          }
 
        //------MENUJU PELETAKAN BARANG
        //-----------Servo 0 menuju peletakan barang
        pwm.setPWM(servonum0, 0, 150);
       
        /*for (uint16_t pulselen0 = 380; pulselen0 > 150; pulselen0--)
          {
          pwm.setPWM(servonum0, 0, pulselen0);
          delay (5);
          }*/
       
        //-----------Servo 3 naik
        for (uint16_t pulselen3 = 500; pulselen3 > 450; pulselen3--)
          {
          pwm.setPWM(servonum3, 0, pulselen3);
          delay (10);
          }
 
        //-----------Servo 1 turun
        for (uint16_t pulselen1 = 200; pulselen1 < 240; pulselen1++)
          {
          pwm.setPWM(servonum1, 0, pulselen1);
          delay (10);
          }
 
        //-----------Servo 4 putar ke kiri
        for (uint16_t pulselen4 = 290; pulselen4 > 250; pulselen4--)
          {
          pwm.setPWM(servonum4, 0, pulselen4);
          delay (10);
          }
 
        //-----------Servo 2 turun

        for (uint16_t pulselen2 = 330; pulselen2 < 350; pulselen2++)

          {
          pwm.setPWM(servonum2, 0, pulselen2);
          delay (20);
          }
 
        //-----------Servo 1 turun
        for (uint16_t pulselen1 = 240; pulselen1 < 300; pulselen1++)
          {
          pwm.setPWM(servonum1, 0, pulselen1);
          delay (20);
          }
       
        delay(1000);
       
        //-----------Servo 5 buka capit
        for (uint16_t pulselen5 = 300; pulselen5 > 220; pulselen5--)
          {
          pwm.setPWM(servonum5, 0, pulselen5);
          delay (10);
          }
 
        delay(1000);
        //-----------MENUJU TEMPAT STANDBYE
 
        //-----------Servo 1 naik
        for (uint16_t pulselen1 = 300; pulselen1 > 250; pulselen1--)
          {
          pwm.setPWM(servonum1, 0, pulselen1);
          delay (10);
          }
 
        //-----------Servo 2 naik
        for (uint16_t pulselen2 = 350; pulselen2 < 400; pulselen2++)
          {
          pwm.setPWM(servonum2, 0, pulselen2);
          delay (20);
          }
 
        //-----------Servo 3 naik
        for (uint16_t pulselen3 = 450; pulselen3 > 400; pulselen3--)
          {
          pwm.setPWM(servonum3, 0, pulselen3);
          delay (10);
          }
 
        //-----------Servo 0 menuju titik standbye
        for (uint16_t pulselen0 = 150; pulselen0 < 250; pulselen0++)
          {
          pwm.setPWM(servonum0, 0, pulselen0);
          delay (10);
          }
        //-----------Servo 2 turun
        for (uint16_t pulselen2 = 400; pulselen2 > 300; pulselen2--)
          {
          pwm.setPWM(servonum2, 0, pulselen2);
          delay (20);
          }
 
        //-----------Servo 5 tutup capit
        for (uint16_t pulselen5 = 220; pulselen5 < 340; pulselen5++)
          {
          pwm.setPWM(servonum5, 0, pulselen5);
          delay (10);
          }
 
        //-----------Servo 4 putar ke center
        for (uint16_t pulselen4 = 250; pulselen4 < 290; pulselen4++)
          {
          pwm.setPWM(servonum4, 0, pulselen4);
          delay (10);
          }
         
        //-----------Servo 1 turun
        for (uint16_t pulselen1 = 250; pulselen1 < 285; pulselen1++)
          {
          pwm.setPWM(servonum1, 0, pulselen1);
          delay (20);
          }
        }
      delay(1000);
   
}
 
Hasil dari program tersebut akan menghasilkan pergerakan lengan robot seperti di bawah ini: 


sumber video : https://www.youtube.com/watch?v=j8HDogCJZmE

Demikianlah pembahasan tentang cara merakit  lengan robot menggunakan arduino uno R3. 

Posting Komentar untuk "Cara merakit Robot Lengan menggunakan 6 buah motor servo"