Membuat Robot Line Follower dengan menggunakan Arduino Uno dan Driver L293D

Akhir semester sudah dekat. Seperti biasa kita akan membuat robot line follower untuk diperlombakan. Robot line follower adalah robot sederhana yang dapat berjalan mengikuti jalur garis tertentu secara otomatis. Berbeda dengan robot line follower yang biasa kita buat, robot kita kali ini akan dilengkapi dengan sensor jarak. Dengan adanya sensor jarak ini, robot nantinya akan mampu menghindari halangan yang ada di depannya dan kembali ke jalurnya semula.

Tanpa panjang lebar lagi, yuk kita ikuti langkah-langkah kerja pembuatannya.

Bahan-Bahan

BahanJumlahGambar
Arduino UNO1 Buah
Motor Shield L293D1 buah
Robot Chassis1 set
Sensor Ultra Sonic1 buah
Male Header1 set
Case Ultra Sonic1 buah
Battery case 2 baterai1 buah
Baterai 186502 buah
Sensor Infra Red2 buah
Kabel Jumper female to femaleSecukupnya

Gambar Rangkaian

Dibawah ini adalah gambar rangkaian masing-masing komponen secara terpisah. masing-masing komponen harus terpasang semuanya dengan benar agar robot dapat bekerja sebagaimana mestinya.

Rangkaian motor dan baterai

Penyambungan Motor dan Baterai

Rangkaian Sensor Inframerah

Sambungan modul sensor inframerah

Rangkaian Modul Sensor Jarak Ultrasonik

Sambungan modul sensor jarak ultrasonik

Tabel Koneksi antar pin

Inframerah kananInframerah kiriUltrasonikMotor KananMotor KiriBateraiArduino + MotorShield
D0A3
GNDGND
VCC+5V
D0A2
GNDGND
VCC+5V
VCC+5V
TrigA4
EchoA5
GNDGND
2 kabelM4
2 KabelM1
Kabel Positif (merah)+M
kabel negatifGND

Pembuatan Terminal untuk Sensor

Motor Shield L293D memiliki lubang-lubang yang bisa dipasangi header untuk mempermudah penyambungan kabel jumper yang menghubungkan sensor inframerah dan sensor jarak ultrasonik dengan Arduino (perhatikan gambar diatas). Pemasangan header ini dilakukan dengan cara menyolder kaki-kaki header ke lubang-lubang yang tersedia. Selain penyolderan header ke papan Shield L293D, Motor DC juga perlu disolder terminal-terminalnya dengan kabel.

Untuk penempatan komponen dan sambungan kabelnya, perhatikan gambar-gambar dibawah ini:

Code

Upload code dibawah ini supaya robot bisa bekerja sesuai fungsinya, beberapa bagian program juga perlu di modifikasi sesuai kebutuhan robot.

#include <NewPing.h>
#include <AFMotor.h>

//hc-sr04 sensor
#define TRIGGER_PIN A4
#define ECHO_PIN A5

#define max_distance 50

//ir sensor
#define irLeft A3
#define irRight A2

//GERAKAN MOTOR
#define MAX_SPEED 200
#define MAX_SPEED_OFFSET 20
#define speedKanan MAX_SPEED - 30
#define speedKiri MAX_SPEED - 60
int speedBelokKiri = speedKiri - 60;
int speedBelokKanan = speedKanan - 60;
int delayBelok = 20;

//HALANGAN
int delayHal1 = 200;
int delayHal2 = 700;
int delayHal3 = 300;

AF_DCMotor motor1(1, MOTOR12_1KHZ);
AF_DCMotor motor2(3, MOTOR12_1KHZ);

NewPing sonar(TRIGGER_PIN, ECHO_PIN, max_distance);


int distance = 0;
boolean object;

void setup() {

  Serial.begin(9600);
  pinMode(irLeft, INPUT);
  pinMode(irRight, INPUT);
}

void loop() {

  if (digitalRead(irLeft) == 0 && digitalRead(irRight) == 0) {
    objectAvoid();
    //forword
  } else if (digitalRead(irLeft) == 0 && digitalRead(irRight) == 1) {
    objectAvoid();
    //leftturn
    Stop();
    delay(10);
    motor1.setSpeed(speedKiri - 50);
    motor2.setSpeed(speedKanan - 50);
    moveLeft();
  } else if (digitalRead(irLeft) == 1 && digitalRead(irRight) == 0) {
    objectAvoid();
    //rightturn
    Stop();
    delay(10);
    motor1.setSpeed(speedKiri - 50);
    motor2.setSpeed(speedKanan - 50);
    moveRight();
  } else if (digitalRead(irLeft) == 1 && digitalRead(irRight) == 1) {
    //Stop
    Stop();
  }
  Serial.print("kiri: ");
  Serial.println(digitalRead(irLeft));
  Serial.print("kanan: ");
  Serial.println(digitalRead(irRight));
}

void objectAvoid() {
  distance = getDistance();
  if (distance <= 15) {
    Stop();
    delay(1000);
    turn();
    Serial.println(distance);
    delay(100);
  } else {
    //forword
    Serial.println("moveforword");
    moveForward();
  }
}

int getDistance() {

  delay(50);
  int cm = sonar.ping_cm();
  if (cm == 0) {
    cm = 100;
  }
  return cm;
}

void Stop() {
  motor1.run(RELEASE);
  motor2.run(RELEASE);
  motor1.setSpeed(0);
  motor2.setSpeed(0);
}
void moveForward() {
  motor1.run(FORWARD);
  motor2.run(FORWARD);
  motor1.setSpeed(speedKiri);
  motor2.setSpeed(speedKanan);
}
void moveBackward() {
  motor1.run(BACKWARD);
  motor2.run(BACKWARD);
  motor1.setSpeed(speedKiri);
  motor2.setSpeed(speedKanan);
}
void turn() {
  if (object == false) {
    Serial.println("turn Right");  //mutar kiri
    motor1.setSpeed(speedKiri);
    motor2.setSpeed(speedKanan);
    motor1.run(FORWARD);
    motor2.run(BACKWARD);
    delay(delayBelok1);
    Stop();
    delay(1000);
    motor1.setSpeed(speedKiri);  //maju
    motor2.setSpeed(speedKanan);
    motor1.run(FORWARD);
    motor2.run(FORWARD);
    delay(delayBelok2);
    motor1.setSpeed(speedKiri);
    motor2.setSpeed(speedKanan);
    motor1.run(BACKWARD);
    motor2.run(FORWARD);
    delay(delayBelok3);
    motor1.setSpeed(speedKiri - 30);  //maju
    motor2.setSpeed(speedKanan - 30);
    motor1.run(FORWARD);
    motor2.run(FORWARD);
    if (digitalRead(irLeft) == 1 || digitalRead(irRight) == 1) {
      Stop();
      delay(100);
      loop();
    } else {
      moveForward();
    }
  }
}
void moveRight() {
  motor1.setSpeed(speedBelokKiri);
  motor2.setSpeed(speedBelokKanan);
  motor1.run(FORWARD);
  motor2.run(BACKWARD);
  delay(delayBelok);
}
void moveLeft() {
  motor1.setSpeed(speedBelokKanan);
  motor2.setSpeed(speedBelokKiri);
  motor1.run(BACKWARD);
  motor2.run(FORWARD);
  delay(delayBelok);
}

Hal-hal yang perlu diperhatikan

Instalasi Library

#include <NewPing.h>
#include <AFMotor.h>

NewPing.h dan AFMotor.h adalah program tambahan yang akan mempermudah proses coding. Program tambahan ini disebut dengan library. Library ini harus diinstal terlebih dahulu sebelum kita mengupload program ke robot line follower yang kita buat. Untuk menginstall library yang dibutuhkan, perlhatikan langkah-langkah berikut:

Buka/klik Library manager yang terdapat dibagian kiri layar

Pada bagian search bar, ketikkan “Adafruit Motor Shield” untuk mencari library yang sesuai. Setelah itu nanti akan terlihat Adafruit Motor Shield library di hasil pencarian, klik instal. Perhatikan gambar

Instalasi bisa dikatakan selesai apabila pada terminal ouput terlihat seperti gambar dibawah ini:

Sampai disitu kita sudah berhasil menginstal library AFMotor. Kita ulangi langkah yang sama dengan sebelumnya untuk menginstal library NewPing. Untuk mempermudah penemuan library NewPing, ketikkan “NewPing” di search bar.

Kecepatan dan Keseimbangan Motor

//GERAKAN MOTOR
#define MAX_SPEED 200
#define MAX_SPEED_OFFSET 20
#define speedKanan MAX_SPEED - 0
#define speedKiri MAX_SPEED - 0
int speedBelokKiri = speedKiri - 30;
int speedBelokKanan = speedKanan - 30;
int delayBelok = 20;

kecepatan maksimal atau MAX_SPEED robot dalam program ini adalah 200. Jika roda kiri dan roda kanan di set dengan nilai MAX_SPEED maka motor akan berputar dengan kecepatan maksimal. Walaupun begitu, seringkali kita harus menyesuaikan kecepatan motor dengan kondisi sebenarnya dilapangan. Untuk mengatur kecepatan motor kanan, kita bisa mengurangi MAX_SPEED secara bertahap pada baris #define speedKanan MAX_SPEED – 0; . Nilai 0 bisa diisi dengan nilai angka misalnya 30 untuk mengurangi kecepatan motor sebelah kanan. Begitu juga dengan motor sebelah kiri, kita ganti nilai 0 pada speedKiri untuk mengurangi kecepatan motor sebelah kiri.

Ada kalanya robot tidak bisa berjalan lurus karena kecepatan real dari motor kanan dan motor kiri berbeda walaupun dalam program kita sudah mengatur dengan nilai yang sama. Untuk mengatasi hal ini, kita bisa mengatur speedKanan dan speedKiri dengan nilai yang berbeda. Misalnya, jika robot ada kecenderungan bergerak kearah kanan, maka kita atur nilai motor sebelah kiri supaya lebih rendah dari motor yang kanan secara bertahap. Uji coba perubahan nilai ini untuk melihat hasilnya secara langsung.

Agar robot bisa berbelok sesuai jalur yang ditentukan, kita juga harus mengatur kecepatan motor saat dibelokan dengan cara menguragi nilai speedKiri dan speed kanan pada variabel speedBelokKiri dan speedBelokKanan. Kurangi nilai ini secara bertahap untuk mendapatkan hasil yang diinginkan. Perlu diingat bahwa pembacaan sensor sering kali gagal jika robot bergerak terlalu cepat.

Melewati Halangan

//HALANGAN
//HALANGAN
int delayHal1 = 200;
int delayHal2 = 700;
int delayHal3 = 300;

Jika terdapat halangan ditengah jalur, robot akan mengambil tindakan mengelak dan memutari halangan tersebut. Tindakan mengelak dan memutari halangan ini memiliki langkah-langkah sebagai berikut:

  1. Robot mendeteksi halangan
  2. Robot berhenti 1 detik
  3. Robot berputar ke kiri dengan gerak rotasi. Jika robot berputar terlalu banyak, kurangi nilai delayHal1
  4. Robot bergerak maju. Jika robot maju terlalu jauh atur nilai delayHal2.
  5. Robot berputar ke kanan dengan gerak rotasi. Jika Robot berputar terlalu banyak, kurangi nilai delayHal3

Posisi kabel Motor Kanan dan Kiri

Sesuai susunan perangkat, kabel motor sebelah kanan bisa dipasang pada terminal M3 dan M4, sedangkan kabel motor kiri bisa dipasang pada terminal M1 dan M2.

Ubah bagian kode dibawah ini untuk menyesuaikan dengan pemasangan terminal yang digunakan. pada kode dibawah ini motor kiri menggunakan terminal M1 dan motor kanan menggunakan terminal M3 (motor1 adalah motor kiri yang terhubung ke M1 dan motor2 adalah motor kanan yang terhubung ke M3.

AF_DCMotor motor1(1, MOTOR12_1KHZ);
AF_DCMotor motor2(3, MOTOR12_1KHZ);

Jika motor bergerak terbalik, gerakan yang seharusnya maju menjadi mundur, tukar/ balik posisi kabel pada terminal motor.

Sensitifitas Sensor InfraRed

Sensor infra merah yang kita gunakan sangat sensitif terhadap gangguan cahaya dari luar. Untuk mengatasi masalah tersebut, kita bisa memberi tambahan penutup disekitar sensor agar terlindung dari cahaya eksternal. Selain itu, jarak sensor ke permukaan lantai juga harus diperhatikan, jangan terlalu jauh dan jangan terlalu dekat.

Sensor Infra merah yang kita gunakan juga dilengkapi dengan potensiometer (berwarna biru dan punya bagian yang dapat diputar dengan obeng). Potensiometer ini berfungsi untuk menyesuaikan akurasi pembacaan sensor. Potensiometer ini . Sesuaikan pembacaan sensor dengan ketentuan jika berada di luar garis (lantai putih), lampu indikator sensor akan menyala, sebaliknya jika sensor berada digaris berwarna hitam, lampu indikator akan mati. Posisikan dan geser-geser sensor dan pastikan lampu indikator secara responsif hidup dan mati yang menandakan sensor juga merespon dengan cepat.

Akhirnya, saya ucapkan selamat mencoba. Terima kasih sudah mengunjungi tulisan ini dan membaca sampai akhir.