Robot ini memiliki 3 mode, diantaranya adalah: Mode Kontrol Manual, Mode Follow Me, dan Mode Obstacle Avoiding atau biasa disebut Robot Avoider.
Dalam mode kontrol manual, artinya robot dapat dikontrol secara manual di HP via Bluetooth. Sedangkan dalam mode Follow Me, artinya robot akan mengikuti gerakan kita melalui sensor Infrared dan sensor Ultrasonic. Dan pada mode yang terakhir, mode Obstacle Avoiding, robot akan berjalan terus tanpa menabrak halangan yang ada didepanya melalui sensor Ultrasonic.
Alat dan bahan untuk membuat Robot berbasis arduino ini adalah:
Arduino Uno R3.
Driver Motor Shield L298N.
Motor DC dengan gearbox.
Servo.
Sensor Infrared.
Sensor Ultrasonic.
Modul Bluetooth HC-06.
Sakelar.
Soket baterai 18650.
Baterai 18650.
LED (dengan Resistor 220 ohm).
Kabel jumper.
Stik eskrim atau akrilik (sebagai chasis).
Solder
Timah (bisa ditambah flux)
Lem tembak
Gunting
Untuk Rangkaianya, VCC selalu hubungkan ke sumber tegangan 5V atau 3,3V (Menyesuaikan), GND selalu hubungkan ke GND (Ground), Sedangkan untuk kabel data, bisa mengikuti rangkaian seperti beberapa kode di bawah ini, atau bisa kalian atur sesuai keinginan (Namun kode juga harus berubah). Diagram rangkaian akan aku Upload dalam waktu dekat, karena masih dalam tahap desain.
Dibawah ini, ada 3 buah kode sesuai ketiga mode yang aku jelaskan diatas, yang bisa kalian Copy Paste!
Kode Robot
v1.0
_____________________________________________________
Mode Manual.
#include <Servo.h> // Pastikan Anda meng-include library Servo
// Pin Motor
const int IN1 = 8;
const int IN2 = 9;
const int IN3 = 10;
const int IN4 = 11;
// Pin LED
const int ledPin = 12;
// Pin Servo
const int servoPin = 5; // Pin yang terhubung ke servo
// Pengaturan mode
int mode = 1; // Mode Manual (1)
// Waktu untuk LED
unsigned long lastBlinkTime = 0;
bool ledState = LOW;
// Inisialisasi Servo
Servo myServo;
int servoPos = 90; // Posisi awal servo di 90 derajat (tengah)
bool isServoMoving = false; // Indikasi apakah servo sedang bergerak
int targetServoPos = 90; // Posisi target servo
unsigned long servoStartTime = 0;
unsigned long servoDuration = 250; // Durasi gerakan servo dalam milidetik
// Pengaturan Awal
void setup() {
Serial.begin(9600); // Kecepatan Baud untuk Bluetooth
// Inisialisasi pin motor sebagai output
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
// Inisialisasi LED
pinMode(ledPin, OUTPUT);
// Inisialisasi Servo
myServo.attach(servoPin);
myServo.write(servoPos); // Set posisi awal servo di tengah
// Kedipan cepat untuk indikasi mode manual aktif
lastBlinkTime = millis();
Serial.println("Setup selesai. Mode Kontrol Manual aktif.");
}
void loop() {
updateLED(); // Update kedipan LED untuk mode manual
// Baca data Bluetooth (karakter tunggal)
if (Serial.available() > 0) {
char data = Serial.read();
Serial.print("Data diterima: ");
Serial.println(data); // Debugging: cetak data yang diterima
// Kontrol manual untuk menggerakkan robot
if (mode == 1) {
switch (data) {
case 'F':
maju();
break;
case 'B':
mundur();
break;
case 'L':
kiri();
break;
case 'R':
kanan();
break;
case 'H': // Perintah untuk Servo ke kanan
gerakkanServo(180); // Set target posisi servo ke kanan (180 derajat)
break;
case 'V': // Perintah untuk Servo ke kiri
gerakkanServo(0); // Set target posisi servo ke kiri (0 derajat)
break;
case 'C': // Perintah untuk Servo ke tengah
gerakkanServo(90); // Set target posisi servo ke tengah (90 derajat)
break;
default:
berhenti();
break;
}
}
}
// Update gerakan servo
updateServo();
}
// Fungsi gerakan robot
void maju() {
Serial.println("Maju"); // Debugging
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
}
void mundur() {
Serial.println("Mundur"); // Debugging
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}
void kiri() {
Serial.println("Belok Kiri"); // Debugging
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
}
void kanan() {
Serial.println("Belok Kanan"); // Debugging
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}
void berhenti() {
Serial.println("Berhenti"); // Debugging
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}
// Fungsi untuk menggerakkan servo ke target tertentu
void gerakkanServo(int target) {
if (target != servoPos) {
targetServoPos = target;
isServoMoving = true;
servoStartTime = millis();
}
}
// Update gerakan servo secara bertahap
void updateServo() {
if (isServoMoving) {
unsigned long currentMillis = millis();
unsigned long elapsedTime = currentMillis - servoStartTime;
if (elapsedTime < servoDuration) {
// Hitung posisi baru berdasarkan waktu yang telah berlalu
float progress = (float)elapsedTime / (float)servoDuration;
servoPos = map(progress * 100, 0, 100, servoPos, targetServoPos);
myServo.write(servoPos);
} else {
// Gerakan selesai
servoPos = targetServoPos;
myServo.write(servoPos);
isServoMoving = false;
}
}
}
// Fungsi untuk Update LED
void updateLED() {
unsigned long currentMillis = millis();
// Kedipan LED untuk mode manual
if (currentMillis - lastBlinkTime >= 100) { // Kedipan cepat (indikasi mode manual)
ledState = !ledState;
digitalWrite(ledPin, ledState);
lastBlinkTime = currentMillis;
}
}
____________________________________________
Mode Follow Me.
#include <SoftwareSerial.h>
// Definisikan pin untuk motor
#define IN1 8
#define IN2 9
#define IN3 10
#define IN4 11
// Definisikan pin untuk sensor ultrasonik
#define trigPin 12
#define echoPin 13
// Definisikan pin untuk sensor IR
#define irPin A0 // Pin untuk sensor IR (misalnya pin analog A0)
int irValue = 0; // Variabel untuk membaca nilai dari sensor IR
// Pin untuk tombol dan LED indikator
const int buttonPin = 7; // Tombol push-on (gunakan INPUT_PULLUP)
const int ledPin = 6; // LED indikator
// Variabel untuk perhitungan jarak sensor ultrasonik
long duration;
int distance;
// Komunikasi Bluetooth (jika diperlukan untuk debugging)
SoftwareSerial bluetooth(2, 3); // RX, TX untuk modul Bluetooth
void setup() {
// Inisialisasi pin motor sebagai output
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
// Inisialisasi pin sensor ultrasonik
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// Inisialisasi pin sensor IR
pinMode(irPin, INPUT);
// Inisialisasi pin tombol dan LED
pinMode(buttonPin, INPUT_PULLUP); // Gunakan pull-up internal
pinMode(ledPin, OUTPUT);
// Mulai komunikasi Serial
Serial.begin(9600);
bluetooth.begin(9600);
// Mode Follow Me
Serial.println("Setup selesai. Mode Follow Me aktif.");
}
void loop() {
// Membaca nilai dari sensor IR
irValue = analogRead(irPin);
// Log nilai sensor IR
Serial.print("Nilai sensor IR: ");
Serial.println(irValue);
// Membaca jarak dari sensor ultrasonik
distance = getDistance();
// Log jarak ke Serial Monitor
Serial.print("Jarak terdeteksi: ");
Serial.print(distance);
Serial.println(" cm");
// Jika sensor IR mendeteksi objek dekat, robot akan mengikuti
if (irValue < 500) { // Jika objek mendekat
Serial.println("Objek terdeteksi di depan - Robot mengikuti!");
moveBackward();
}
else {
// Jika jarak dari sensor ultrasonik antara 15 cm hingga 50 cm, bergerak maju
if (distance >= 15 && distance <= 50) {
moveForward();
}
else {
// Jika tidak memenuhi kondisi di atas, berhenti
stopMoving();
}
}
// LED berkedip cepat sebagai indikator Mode Follow Me
blinkFast();
}
// Fungsi untuk mengukur jarak dengan sensor ultrasonik
int getDistance() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034 / 2; // Konversi menjadi cm
return distance;
}
// Fungsi untuk LED berkedip cepat
void blinkFast() {
digitalWrite(ledPin, HIGH);
delay(100);
digitalWrite(ledPin, LOW);
delay(100);
}
// Fungsi gerakan robot
void moveForward() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
}
void moveBackward() {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}
void stopMoving() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}
____________________________________________
Mode Avoider.
#include <SoftwareSerial.h>
// Definisikan pin untuk motor
#define IN1 8
#define IN2 9
#define IN3 10
#define IN4 11
// Definisikan pin untuk sensor ultrasonik
#define trigPin 12
#define echoPin 13
// Variabel untuk perhitungan jarak sensor ultrasonik
long duration;
int distance;
// Komunikasi Bluetooth (jika diperlukan untuk debugging)
SoftwareSerial bluetooth(2, 3); // RX, TX untuk modul Bluetooth
void setup() {
// Inisialisasi pin motor sebagai output
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
// Inisialisasi pin sensor ultrasonik
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// Mulai komunikasi Serial
Serial.begin(9600);
bluetooth.begin(9600);
// Mode Avoider
Serial.println("Setup selesai. Mode Avoider aktif.");
// Berhenti selama 5 detik sebelum memulai
stopMoving();
delay(5000);
}
void loop() {
// Dapatkan jarak dari sensor ultrasonik
distance = getDistance();
// Log jarak ke Serial Monitor
Serial.print("Jarak terdeteksi: ");
Serial.print(distance);
Serial.println(" cm");
// Robot bergerak berdasarkan jarak yang terdeteksi
if (distance > 30) {
// Jika jarak lebih dari 20 cm, bergerak maju
moveForward();
} else {
// Jika jarak kurang atau sama dengan 20 cm, ada halangan
avoidObstacle();
}
}
// Fungsi untuk mengukur jarak dengan sensor ultrasonik
int getDistance() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034 / 2; // Konversi menjadi cm
return distance;
}
// Fungsi untuk menghindari halangan
void avoidObstacle() {
// Berhenti selama 0.5 detik (mengurangi waktu delay agar robot lebih responsif)
stopMoving();
delay(500);
// Mundur selama 0.5 detik
moveBackward();
delay(500);
// Belok kanan selama 0.5 detik
turnRight();
delay(500);
}
// Fungsi gerakan robot
void moveForward() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
}
void moveBackward() {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}
void turnRight() {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
}
void stopMoving() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}