Membuat Robot Line Follower dengan 5 sensor IR dan motor shield L293D

Membuat Robot Line Follower dengan 5 sensor IR dan motor shield L293D

Assalamualaikum, bertemu lagi di web saya yang sederhana ini. Kali ini saya akan berbagi cara membuat robot line follower dengan menggunakan Arduino, 5 buah sensor infra merah dan motor shield L293D. Robot ini akan berjalan mengikuti jalur berwarna hitam diatas lantai yang berwarna terang. OK, tanpa panjang lebar lagi kita sediakan bahan-bahannya:

Bahan-bahan

NoBahanJumlahGambarLink Pembelian
1Arduino Uno / Arduino Mega1 buahhttps://tokopedia.link/5LTV65Bj8Kb
2Sensor Infra Red5 buahhttps://tokopedia.link/3XxhVMxj8Kb
3Push Button1 buah
4L293D Motor Shield1 buahhttps://tokopedia.link/qzFY1LFj8Kb
5Chassis Robot + motor1 sethttps://tokopedia.link/KMoIvqDj8Kb
6Rumah baterai 18650 2 slot seri1 buah
7Baterai 186502 buah
8Kabel jumper Secukupnya
9acrylic 2 mmsecukupnya

Gambar rangkaian

ikutilah gambar rangkaian dibawah ini. Arduino tidak terlihat didalam gambar karena motorshield akan digabung dengan Arduino dan semua wiring dihubungkan ke motor shield. Saya menggunakan Arduino Mega sebagai mikrokontroler, namun kalian tetap bisa menggunakan Arduino UNO seperti pada gambar.

supaya pin A0 sampai A5 dapat digunakan, pasangkan pin header di barisan lubang dekat posisi pin analog in pada motor shield. Pemasangan pin header ini juga mempermudah kita mengakses 5V dan GND.

Code

#include <AFMotor.h>     //Adafruit Motor Shield Library.
#include <QTRSensors.h>  //Pololu QTR Sensor Library versi 3.1.0.

AF_DCMotor motor1(2);  //konektor M2
AF_DCMotor motor2(1);  //konektor M1


#define KP 0.2  //naikkan nilainya perlahan-lahan untuk menambah keakuraran gerakan robot
#define KD 0.7
#define M1_minumum_speed 200   //motor 1 min speed, perlu diatur masing-masing terutama jika kecepatan putaran roda tidak sama
#define M2_minumum_speed 200   //motor 2 min speed
#define M1_maksimum_speed 255  //motor 1 max speed
#define M2_maksimum_speed 255  //motor 2 max speed
#define NUM_SENSORS 5          //jumlah sensor
#define TIMEOUT 2500
#define EMITTER_PIN 2
#define DEBUG 1
const int buttonPin1 = A0;


int buttonPushCounter = 0;
int buttonState = 0;
int lastButtonState = 0;

QTRSensorsRC qtrrc((unsigned char[]){ A5, A4, A3, A2, A1 }, NUM_SENSORS, TIMEOUT, EMITTER_PIN);

unsigned int sensorValues[NUM_SENSORS];

void setup() {
  Serial.begin(9600);
  pinMode(buttonPin1, INPUT_PULLUP);
  delay(3000);
}

int lastError = 0;
int last_proportional = 0;
int integral = 0;

void loop() {
  buttonState = digitalRead(buttonPin1);
  if (buttonState != lastButtonState) {
    if (buttonState == LOW) {
      buttonPushCounter++;
      buttonState++;
      Serial.println(buttonPushCounter);
      Serial.println(buttonState);

    } else {
      Serial.println("off");
    }
    delay(100);
  }
  lastButtonState = buttonState;

  if (buttonPushCounter == 1) {
    Serial.println("calibrating");
    manual_calibration();
    Serial.println("Stop");
    motor1.run(RELEASE);
    motor2.run(RELEASE);
    motor1.setSpeed(0);
    motor2.setSpeed(0);
    buttonPushCounter = 2;
  }

  if (buttonPushCounter == 3) {
    unsigned int sensors[5];
    int position = qtrrc.readLine(sensors);
    int error = position - 2000;
    Serial.print("error: ");
    Serial.print(error);
    Serial.print(" ");

    int motorSpeed = KP * error + KD * (error - lastError);  //1 x 2000 +
    lastError = error;
    int leftMotorSpeed = M1_minumum_speed + motorSpeed;
    int rightMotorSpeed = M2_minumum_speed - motorSpeed;
    Serial.print(motorSpeed);
    Serial.print(", ");
    Serial.print(leftMotorSpeed);
    Serial.print(", ");
    Serial.print(rightMotorSpeed);
    set_motors(leftMotorSpeed, rightMotorSpeed);
  }

  if (buttonPushCounter == 4) {
    Serial.println("Stop");
    motor1.run(RELEASE);
    motor2.run(RELEASE);
    motor1.setSpeed(0);
    motor2.setSpeed(0);
    buttonPushCounter = 2;
  }
}

void set_motors(int motor1speed, int motor2speed) {
  if (motor1speed > M1_maksimum_speed) motor1speed = M1_maksimum_speed;
  if (motor2speed > M2_maksimum_speed) motor2speed = M2_maksimum_speed;
  if (motor1speed < 0) motor1speed = 0;
  if (motor2speed < 0) motor2speed = 0;
  motor1.setSpeed(motor1speed);
  Serial.print("speed kiri: ");
  Serial.print(motor1speed);
  motor2.setSpeed(motor2speed);
  Serial.print(" | speed kanan: ");
  Serial.println(motor2speed);

  motor1.run(FORWARD);
  motor2.run(FORWARD);
}

void manual_calibration() {
  int i;
  for (i = 0; i < 250; i++) {
    if (i <= 25 || i >= 75) {
      motor1.run(FORWARD);
      motor2.run(BACKWARD);
      motor1.setSpeed(100);
      motor2.setSpeed(100);
    } else {
      motor1.run(BACKWARD);
      motor2.run(FORWARD);
      motor1.setSpeed(100);
      motor2.setSpeed(100);
    }
    qtrrc.calibrate(QTR_EMITTERS_ON);
    delay(20);
  }


  if (DEBUG) {
    Serial.begin(9600);
    for (int i = 0; i < NUM_SENSORS; i++) {
      Serial.print(qtrrc.calibratedMinimumOn[i]);
      Serial.print(' ');
    }
    Serial.println();

    for (int i = 0; i < NUM_SENSORS; i++) {
      Serial.print(qtrrc.calibratedMaximumOn[i]);
      Serial.print(' ');
    }
  }
}

Foto-Foto

untuk memeprmudah proses perakitan, saya lampirkan foto-foto robot dari segala sisi. Di sini saya menggunakan Arduino Mega sebagai mikrokontroler

Selanjutnya, kita coba menjalankan robot di jalur garis yang terbuat dari isolasi listrik atau lakban hitam. Selamat mencoba