MASIGNALPHAS2101
6680671983845063762

Robotic ARM Pemisah Barang Otomatis dengan Arduino

Robotic ARM Pemisah Barang Otomatis dengan Arduino
Add Comments
4/09/2020
Robot adalah sebuah manipulator yang dapat di program ulang untuk memindahkan tool, material, atau peralatan tertentu dengan berbagai program pergerakan untuk berbagai tugas dan juga mengendalikan serta mensinkronkan peralatan dengan pekerjaannya, - oleh Robot Institute of America, (Gonzalez,1987).
Inspiration
Di Indonesia, kita dapat menjumpai berbagai macam jenis Robotic Arm. Arm robot tersebut digunakan dalam berbagai bidang antara lain dibidang industri, kesehatan, pertanian dll.

Hardware
Adapun perangkat keras yang dibutuhkan dalam pembuatan Robotic Arm ini adalah:
  1. Arduino Uno,
  2. Sensor Warna (RGB),
  3. Sensor IR Obstacle,
  4. Motor DC,
  5. Motor Servo,
  6. LCD 16x2 dengan I2C
  7. Relay.
Diagram Blok
Cara kerja atau prinsip Robotic Arm akan dijelaskan pada diagram blok berikut:
Diagram Blok Arm Robot Berdasarkan Warna
Berdasarkan blok diagram sistem yang telah digambarkan diatas, maka dapat diuraikan secara detail mengenai perancangan dan pembuatan Robotic Arm baik dari segi hardware (perangkat keras) maupun software. Perancangan pembuatan rangkaian elektronik ini menggunakan Arduino sebagai pemrosesan data keseluruhannya.

Sensor RGB
Baca: Cara Membuat Alat Pendeteksi Warna dengan Sensor LDR dan RGB
Sensor yang digunakan dalam pembuatan alat ini adalah dengan memanfaatkan rangkaian LDR dan led RGB sebagai pembaca objek. Berikut adalah rangkaiannya:
Rangkaian Sensor RGB
Ket:
  1. LED RGB
  2. LDR
  3. Resistor 220 ohm
  4. Resistor 33K ohm
Atur tata letak sensor seperti pada gambar dibawah ini:
Tata letak sensor RGB
Rangkailah komponen sensor seperti gambar diatas, kemudian upload program dibawah ini untuk memastikan sensor berfungsi dengan baik.
/* Program sensor warna
   Oleh   : HESTECH iNDONESIA
   web    : Hestech.id
*/
  
#include <Servo.h> 
Servo myservo; 
int sensorPin = A0;
int LedBiru =3; // Led warna biru digital pin 3
int LedHijau=4; // Led warna hijau digital pin 4
int LedMerah=5; // Led warna merah digital pin 5
int hasil,hasilb,hasilm,hasilh;
int k=8;  // toleransi warna

void setup() {
// declare the ledPin as an OUTPUT:
  pinMode(LedBiru,OUTPUT);
  pinMode(LedMerah,OUTPUT);
  pinMode(LedHijau,OUTPUT);  
  digitalWrite(LedBiru,LOW);
  digitalWrite(LedMerah,LOW);
  digitalWrite(LedHijau,LOW);
  myservo.attach(6);  // motor servo pin digital 9
  myservo.write(90);      
  delay(100);       
  Serial.begin(9600);
  delay(1000);
}

void loop() {
  // nyalakan LedMerah
  digitalWrite(LedMerah,HIGH);
  //delay 150 ms agar LDR baca stabil
  delay(150);
  // baca data sensor
  hasil= analogRead(sensorPin);
  hasilm=map(hasil,0,1023,0,255);
  Serial.print("R,G,B = ");
  Serial.print(hasilm); 
  digitalWrite(LedMerah,LOW);    
  delay(150);

  // nyalakan LedHijau
  digitalWrite(LedHijau,HIGH);
  //delay 150 ms agar LDR baca stabil
  delay(150);
  // baca data sensor
  hasil= analogRead(sensorPin);
  hasilh=map(hasil,0,1023,0,255);  
  Serial.print(",");
  Serial.print(hasilh); 
  digitalWrite(LedHijau,LOW);    
  delay(150);
  
  // nyalakan LedBiru
  digitalWrite(LedBiru,HIGH);
  //delay 150 ms agar LDR baca stabil
  delay(150);
  // baca data sensor
  hasil= analogRead(sensorPin);
  hasilb=map(hasil,0,1023,0,255);  
  Serial.print(",");
  Serial.println(hasilb); 
  digitalWrite(LedBiru,LOW);  
  delay(150);

  // cek warna dibandingkan dengan nilai hasil kalibrasi
  if(abs(hasilm-209)<k && abs(hasilh-165)<k && abs(hasilb-139)<k){
    Serial.println(" -> WARNA MERAH !\n");
    myservo.write(30);   } else
  if(abs(hasilm-135)<k && abs(hasilh-182)<k && abs(hasilb-147)<k){
    Serial.println(" -> WARNA HIJAU !\n");
     myservo.write(50); }  else  
  if(abs(hasilm-186)<k && abs(hasilh-225)<k && abs(hasilb-202)<k){
    Serial.println(" -> WARNA BIRU !\n");
    myservo.write(70);   } else
  if(abs(hasilm-156)<k && abs(hasilh-184)<k && abs(hasilb-172)<k){
    Serial.println(" -> WARNA CYAN !\n");
    myservo.write(90);   } else
  if(abs(hasilm-199)<k && abs(hasilh-159)<k && abs(hasilb-170)<k){
    Serial.println(" -> WARNA UNGU !\n");
     myservo.write(110); }  else  
  if(abs(hasilm-154)<k && abs(hasilh-231)<k && abs(hasilb-239)<k){
    Serial.println(" -> WARNA KUNING !\n");
    myservo.write(130);   }  else  
  if(abs(hasilm-210)<k && abs(hasilh-206)<k && abs(hasilb-211)<k){
    Serial.println(" -> WARNA PINK !\n");
    myservo.write(150);   } else
  if(abs(hasilm-168)<k && abs(hasilh-230)<k && abs(hasilb-225)<k){
    Serial.println(" -> WARNA HIJAU MUDA !\n");
    myservo.write(170);   } else
//  if(abs(hasilm-203)<k && abs(hasilh-73)<k && abs(hasilb-87)<k){
//    Serial.println(" -> WARNA KUNING MUDA!\n");
//     myservo.write(180); } else
    Serial.println(" -> ???\n");     
    
  delay (1000);
}
  • Setelah diuplod kedalam arduino, bukalah serial monitor untuk mengambil sampel warna.
  • Siapkan warna yang akan dijadikan objek untuk deteksi, (warna merah)
  • Letakan sampel warna (merah) tersebut tepat didepan sensor RGB untuk mengambil nilai kalibrasi, maka akan diperoleh hasil seperti berikut:
  • Hasil kalibrasi pada gambar diatas dimasukan kedalam program sebagai hasil kalibrasi warna merah. Letakan nilai tersebut disini:

  • Upload ulang kedalam arduino, dan lakukan kalibrasi ulang terhadap warna merah yang tadi sudah di ambil nilainya. Maka akan menampilkan hasil seperti gambar dibawah:

  • Hasil kalibrasi ulang pada gambar diatas menunjukan bahwa warna merah telah terdeteksi, meskipun berbeda nilai dari hasil kalibrasi awal. Hal itu tidak mempengaruhi hasil selama nilai RGB nya masih berselisih 8 angka. karena nilai toleransi pada program dibuat 8. Jika ingin merubah nilai toleransinya, rubah pada program ini:
int k=8;  // toleransi warna
Setelah memahami rangkaian diatas, selanjutnya adalah merangkai keseluruhan komponen.

Schematich
Setelah memahami rangkaian sensor diatas, selanjutnya merangkai seluruh komponen seperti gambar dibawah ini:
Schematich Robot Arm Pemindah barang
Pada gambar diatas terdapat beberapa bagian penting diataranya adalah:
  1. Servo, untuk menggerakkan lengan robot (4-axis),
  2. Relay, untuk menggerakan Motor dc yang dipakai sebagai aktuator pada Conveyor Belt
  3. Sensor RGB, pendeteksi warna
  4. Sensor IR obstacle, digunakan sebagai saklar otomatis ketika terdeteksi ada benda yang lewat diatas konveyor. Jika sensor ini mendeteksi benda, maka konveyor akan berhenti berputar, kemudian lengan robot akan mengarahkan capit ke depan benda. Setelah warna benda berhasil dideteksi, kemudian capit akan membawa benda tersebut ke tempat penampungan warna.
  5. LCD, untuk menampilkan hasil warna yang terdeteksi.

Agar lebih jelas, desain awal robot arm pemindah barang dapat dilihat pada gambar dibawah ini:
Desain dan tata Letak Robot Arm
Flowchart
Untuk lebih mudah memahami diagram alir (Flowchart) cara kerja robot arm pemindah barang akan ditunjukkan pada gambar dibawah ini:
Flowcart Robot Arm
Berdasarkan perencanaan sistem diatas dibuatlah perencanaan program. Program akan didesain atau dirancang secara sistematis terlebih dahulu, dimana langkah-langkah yang sistematis untuk menyelesaikan suatu masalah dinamakan algoritma. Kemudian langkah-langkah tersebut akan dikonversikan ke dalam bahasa pemrograman dengan menggunakan perintah-perintah yang sesuai.

Source Code
Berikut adalah source code keseluruhan.
/* Program Robot Arm
   Oleh   : hesctech indonesia
   update : 2019
*/
  
#include <Servo.h>
#include <Wire.h>  // i2C Conection Library
#include <LiquidCrystal_I2C.h>  //i2C LCD Library
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo ServoBase;
Servo ServoCapit;
Servo ServoSikut;
Servo ServoLengan;

int isObstaclePin = 10;  // Sensor IR berada pada pin 10
int isObstacle = HIGH;  // sinyal awal sensor 
int PinSensor = A0; // Sensor (LDR) pada Pin Nomor A0
int PinLedMerah =3; // Led Warna Merah pada Pin Nomor 3
int PinLedHijau=4; // Led Warna Hijau pada Pin Nomor 4
int PinLedBiru=5; // Led Warna Biru pada Pin Nomor 5
int Conveyor=11;
int Hasil,HasilMerah,HasilHijau,HasilBiru;
int k=15;  // Toleransi Warna

void setup() {
  Serial.begin(9600);
  lcd.begin();

// Menetapkan Pin Led Merah, Hijau, Biru sebagai OUTPUT:
  pinMode(isObstaclePin, INPUT);
  pinMode(PinLedMerah,OUTPUT);
  pinMode(PinLedHijau,OUTPUT);
  pinMode(PinLedBiru,OUTPUT);
  pinMode(Conveyor,OUTPUT); 
  digitalWrite(PinLedMerah,LOW);
  digitalWrite(PinLedHijau,LOW);
  digitalWrite(PinLedBiru,LOW);
 
 
  ServoCapit.attach(9); // Menempatkan Servo Capit pada Pin Nomor 9
  ServoSikut.attach(8); // Menempatkan Servo Sikut pada Pin Nomor 10
  ServoLengan.attach(7); // Menempatkan Servo1 Lengan pada Pin Nomor 11 
  ServoBase.attach(6); //Menempatkan Servo Capit pada Pin 6
  
  ServoCapit.write(50); // Menetapkan Putaran Awal Servo Capit pada Sudut 15 derajat     
  ServoSikut.write(70); // Menetapkan Putaran Awal Servo Sikut pada Sudut 30 derajat
  ServoLengan.write(180); // Menetapkan Putaran Awal Servo Lengan pada Sudut 0 derajat
  ServoBase.write(0); // Menetapkan Putaran Awal Servo Lengan pada Sudut 0 derajat
  delay(100);      

//  delay(500);
}

void loop() {

  //Menempatkan posisi pengambilan barang
  isObstacle = digitalRead(isObstaclePin);
  if (isObstacle == LOW)
  {
    digitalWrite(Conveyor,LOW);
    lcd.clear();
    lcd.print("Ada Barang...!");
      

  delay(100);
  for(int i = 150; i > 78; i--) 
    ServoBase.write(87); 
    ServoLengan.write(180); // 
    delay(500);
    ServoLengan.write(38);
    ServoCapit.write(135); //membuka capit
    ServoSikut.write(87);
    delay(1000);
  
   digitalWrite(PinLedMerah,HIGH); // Menyalakan Led Merah
   delay(150); // Jeda 150 milidetik agar LDR bisa Membaca Warna Merah dengan Stabil
// Membaca Data Sensor (LDR) :
   Hasil= analogRead(PinSensor);
   HasilMerah=map(Hasil,0,1023,0,255);
   Serial.print(HasilMerah);
   digitalWrite(PinLedMerah,LOW);   
   delay(150);

   digitalWrite(PinLedHijau,HIGH); // Menyalakan Led Hijau
   delay(150); // Jeda 150 milidetik agar LDR bisa Membaca Warna Hijau dengan Stabil
// Membaca Data Sensor (LDR) :
   Hasil= analogRead(PinSensor);
   HasilHijau=map(Hasil,0,1023,0,255); 
   Serial.print(" ");
   Serial.print(HasilHijau);
   digitalWrite(PinLedHijau,LOW);   
   delay(150);

   digitalWrite(PinLedBiru,HIGH); // Menyalakan Led Biru
   delay(150); // Jeda 150 milidetik agar LDR bisa Membaca Warna Biru dengan Stabil
// Membaca Data Sensor (LDR) :
   Hasil= analogRead(PinSensor);
   HasilBiru=map(Hasil,0,1023,0,255); 
   Serial.print(" ");
   Serial.println(HasilBiru);
   digitalWrite(PinLedBiru,LOW); 
   delay(150);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Mengambil Barang...!");
  delay(1000);

// Membandingkan Warna Hasil Peneraan Sensor dengan Hasil Kalibrasi :

  if(abs(HasilMerah-232)<k && abs(HasilHijau-177)<k && abs(HasilBiru-90)<k){
    Serial.println("WARNA MERAH\n");
    lcd.clear();
    lcd.setCursor(0, 1);
    lcd.print("WARNA MERAH.!");
    ServoLengan.write(85); // Lengan menuju capit menuju benda
    delay(1000);
    ServoSikut.write(95); // Sikut membawa capit menuju benda  
    delay(1000);
    ServoCapit.write(65); // Capit memegang benda
    delay(1000);
    ServoLengan.write(190); // lengan menaikkan capit yang membawa benda
    ServoSikut.write(70); // Sikut menaikkan capit yang membawa benda
    delay(1000);
    ServoBase.write(0); // Base berputar kerah kotak sesuai warna
    ServoLengan.write(190); // lengan menaikkan capit yang membawa benda
    ServoSikut.write(70); // Sikut menaikkan capit dan mengarahkan ke kotak warna
    delay(1000);
    ServoLengan.write(75); // Lengan membawa benda ke tempat Warna Merah
    ServoSikut.write(110); // Sikut menurunkan capit pembawa benda menuju tempat benda  
    delay(1000);
    ServoCapit.write(135); // Capit melepas benda
    delay(1000);
    ServoLengan.write(130); // Lengan menuju posisi istirahat
    ServoSikut.write(70); // Sikut mengangkat capit kosong
    delay(500);
    ServoLengan.write(180); // Lengan menuju posisi istirahat
    delay(500);
    ServoBase.write(30); // Base menuju posisi istirahat
    delay(500);
    ServoSikut.write(70); // Sikut menuju posisi istirahat 
    ServoCapit.write(50); // Capit menutup (posisi istirahat)
    } else

   if(abs(HasilMerah-232)<k && abs(HasilHijau-223)<k && abs(HasilBiru-125)<k){
    Serial.println("WARNA KUNING\n");
    lcd.clear();
    lcd.setCursor(0, 1);
    lcd.print("WARNA KUNING.!");
    ServoLengan.write(85); // Lengan menuju capit menuju benda
    delay(1000);
    ServoSikut.write(95); // Sikut membawa capit menuju benda  
    delay(1000);
    ServoCapit.write(65); // Capit memegang benda
    delay(1000);
    ServoLengan.write(190); // lengan menaikkan capit yang membawa benda
    ServoSikut.write(70); // Sikut menaikkan capit yang membawa benda
    delay(1000);
    ServoBase.write(8); // Base berputar kerah kotak sesuai warna
    ServoLengan.write(190); // lengan menaikkan capit yang membawa benda
    ServoSikut.write(70); // Sikut menaikkan capit dan mengarahkan ke kotak warna
    delay(1000);
    ServoLengan.write(75); // Lengan membawa benda ke tempat Warna Merah
    ServoSikut.write(110); // Sikut menurunkan capit pembawa benda menuju tempat benda  
    delay(1000);
    ServoCapit.write(135); // Capit melepas benda
    delay(1000);
    ServoLengan.write(130); // Lengan menuju posisi istirahat
    ServoSikut.write(70); // Sikut mengangkat capit kosong
    delay(500);
    ServoLengan.write(180); // Lengan menuju posisi istirahat
    delay(500);
    ServoBase.write(30); // Base menuju posisi istirahat
    delay(500);
    ServoSikut.write(70); // Sikut menuju posisi istirahat 
    ServoCapit.write(50); // Capit menutup (posisi istirahat)
    } else

 if(abs(HasilMerah-213)<k && abs(HasilHijau-220)<k && abs(HasilBiru-138)<k){
    Serial.println("WARNA HIJAU\n");
    lcd.clear();
    lcd.setCursor(0, 1);
    lcd.print("WARNA HIJAU..");
    ServoLengan.write(85); // Lengan menuju menuju benda
    delay(1000);
    ServoSikut.write(95); // Sikut membawa capit menuju benda  
    delay(1000);
    ServoCapit.write(65); // Capit memegang benda
    delay(1000);
    ServoLengan.write(190); // lengan menaikkan capit yang membawa benda
    ServoSikut.write(70); // Sikut menaikkan capit yang membawa benda
    delay(1000);
    ServoBase.write(17); // Base berputar kerah kotak sesuai warna
    ServoLengan.write(190); // lengan menaikkan capit yang membawa benda
    ServoSikut.write(70); // Sikut menaikkan capit dan mengarahkan ke kotak warna
    delay(1000);
    ServoLengan.write(75); // Lengan membawa benda ke tempat Warna Merah
    ServoSikut.write(110); // Sikut menurunkan capit pembawa benda menuju tempat benda  
    delay(1000);
    ServoCapit.write(135); // Capit melepas benda
    delay(1000);
    ServoLengan.write(130); // Lengan menuju posisi istirahat
    ServoSikut.write(70); // Sikut mengangkat capit kosong
    delay(500);
    ServoLengan.write(180); // Lengan menuju posisi istirahat
    delay(500);
    ServoBase.write(30); // Base menuju posisi istirahat
    delay(500);
    ServoSikut.write(70); // Sikut menuju posisi istirahat 
    ServoCapit.write(50); // Capit menutup (posisi istirahat)
    } else

 if(abs(HasilMerah-187)<k && abs(HasilHijau-213)<k && abs(HasilBiru-176)<k){
    Serial.println("WARNA BIRU\n");
    lcd.clear();
    lcd.setCursor(0, 1);
    lcd.print("WARNA BIRU.!");
    ServoLengan.write(85); // Lengan menuju capit menuju benda
    delay(1000);
    ServoSikut.write(95); // Sikut membawa capit menuju benda  
    delay(1000);
    ServoCapit.write(65); // Capit memegang benda
    delay(1000);
    ServoLengan.write(190); // lengan menaikkan capit yang membawa benda
    ServoSikut.write(70); // Sikut menaikkan capit yang membawa benda
    delay(1000);
    ServoBase.write(24); // Base berputar kerah kotak sesuai warna
    ServoLengan.write(190); // lengan menaikkan capit yang membawa benda
    ServoSikut.write(70); // Sikut menaikkan capit dan mengarahkan ke kotak warna
    delay(1000);
    ServoLengan.write(75); // Lengan membawa benda ke tempat Warna Merah
    ServoSikut.write(110); // Sikut menurunkan capit pembawa benda menuju tempat benda  
    delay(1000);
    ServoCapit.write(135); // Capit melepas benda
    delay(1000);
    ServoLengan.write(130); // Lengan menuju posisi istirahat
    ServoSikut.write(70); // Sikut mengangkat capit kosong
    delay(500);
    ServoLengan.write(180); // Lengan menuju posisi istirahat
    delay(500);
    ServoBase.write(30); // Base menuju posisi istirahat
    delay(500);
    ServoSikut.write(70); // Sikut menuju posisi istirahat 
    ServoCapit.write(50); // Capit menutup (posisi istirahat)
    } else
    
  Serial.println("Warna Tidak Dikenal\n");
  lcd.setCursor(0, 1);
  lcd.clear();
    lcd.print("Warna tdk diknal");
        digitalWrite(Conveyor, HIGH);
        delay(500);      
  }  
  else
  {
    digitalWrite(Conveyor, HIGH);
    lcd.clear();
    lcd.setCursor(0, 1);
    lcd.print("Tidak Ada Barang");
    
    delay(100);
  }
  
  delay (100);
}

Result

Desain bentuk robot arm pemindah barang otomatis ini didesan dengan menggunakan acrylic 3mm yang didesain dengan menggunakan alat khusus pembengkok acrylic.disamping itu juga base robot dibuat dengan menggunakan triplek dan kayu blok 3 cm2. Untuk desain lengan robot ini kamu bisa bereksperimen sendiri sesuai keinginan. Berikut adalah hasil pembuatan lengan robot yang telah selesai dibuat oleh Hestech Indonesia bersama team.
Lengan Robot Arm 4 axis
Gambar diatas merupakan last result yang telah di uji coba berdasarkan teori dan skema sederhana.
Capit/Gripper

Conveyor Belt dengan gear box 
Pada gambar diatas terdapat 4 buah gear yang berfungsi sebagai pemutar konveyor dengan 1 tumpuan gear utama.
Peletakan sensor IR dan RGB
Selesai.
Selamat mencoba dan bereksperimen sendiri...!
Hestech Indonesia

Innovasi di bidang Teknologi, Listrik, Teknik Komputer dan gaya Hidup. Info lainnya tentang praktik konservasi berbasis Sains, inovasi, dan kearifan lokal