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
No | Bahan | Jumlah | Gambar | Link Pembelian |
---|---|---|---|---|
1 | Arduino Uno / Arduino Mega | 1 buah | ![]() | https://tokopedia.link/5LTV65Bj8Kb |
2 | Sensor Infra Red | 5 buah | ![]() | https://tokopedia.link/3XxhVMxj8Kb |
3 | Push Button | 1 buah | ![]() | |
4 | L293D Motor Shield | 1 buah | ![]() | https://tokopedia.link/qzFY1LFj8Kb |
5 | Chassis Robot + motor | 1 set | ![]() | https://tokopedia.link/KMoIvqDj8Kb |
6 | Rumah baterai 18650 2 slot seri | 1 buah | ![]() | |
7 | Baterai 18650 | 2 buah | ![]() | |
8 | Kabel jumper | Secukupnya | ||
9 | acrylic 2 mm | secukupnya |
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