#include <AFMotor.h>
// Deklarasi motor
AF_DCMotor motor1(1, MOTOR12_1KHZ);
AF_DCMotor motor2(2, MOTOR12_1KHZ);
AF_DCMotor motor3(3, MOTOR34_1KHZ);
AF_DCMotor motor4(4, MOTOR34_1KHZ);
// Pin Lampu, Klakson, dan Ekstra
const int frontLights = A0;
const int backLights = A1;
const int horn = A2;
const int extra = A3;
// Variabel untuk perintah dan kecepatan
char command;
int speedVal = 255; // default 100%
// ⬇️ Variabel timeout untuk deteksi disconnect
unsigned long lastCommandTime = 0;
const unsigned long timeoutDuration = 1000; // 1 detik
bool motorsRunning = false;
void setup() {
Serial.begin(9600);
// Inisialisasi pin output
pinMode(frontLights, OUTPUT);
pinMode(backLights, OUTPUT);
pinMode(horn, OUTPUT);
pinMode(extra, OUTPUT);
Stop();
}
void loop() {
if (Serial.available()) {
command = Serial.read();
handleCommand(command);
lastCommandTime = millis(); // catat waktu terakhir command diterima
motorsRunning = true;
}
// Cek timeout jika tidak ada data masuk dalam durasi tertentu
if (motorsRunning && (millis() - lastCommandTime > timeoutDuration)) {
Stop();
motorsRunning = false;
// Matikan juga fitur lain kalau perlu
// digitalWrite(horn, LOW);
// digitalWrite(extra, LOW);
// digitalWrite(frontLights, LOW);
// digitalWrite(backLights, LOW);
}
}
void handleCommand(char cmd) {
switch (cmd) {
// Gerakan
case 'F': forward(); break;
case 'B': back(); break;
case 'L': left(); break;
case 'R': right(); break;
case 'G': forwardLeft(); break;
case 'I': forwardRight(); break;
case 'H': backLeft(); break;
case 'J': backRight(); break;
case 'S': Stop(); break;
// Lampu depan A0
case 'W': digitalWrite(frontLights, HIGH); break;
case 'w': digitalWrite(frontLights, LOW); break;
// Lampu belakang A1
case 'U': digitalWrite(backLights, HIGH); break;
case 'u': digitalWrite(backLights, LOW); break;
// Klakson A2
case 'V': digitalWrite(horn, HIGH); break;
case 'v': digitalWrite(horn, LOW); break;
// Ekstra A3
case 'X': digitalWrite(extra, HIGH); break;
case 'x': digitalWrite(extra, LOW); break;
// Kecepatan
case '0' ... '9': speedVal = map(cmd - '0', 0, 9, 0, 90); speedVal = speedVal * 255 / 100; break;
case 'q': speedVal = 255; break; // 100%
// Stop all
case 'D':
Stop();
digitalWrite(frontLights, LOW);
digitalWrite(backLights, LOW);
digitalWrite(horn, LOW);
digitalWrite(extra, LOW);
break;
}
}
// Fungsi: Maju lurus
void forward() {
// Semua motor maju dengan kecepatan speedVal
motor1.setSpeed(speedVal); motor1.run(FORWARD);
motor2.setSpeed(speedVal); motor2.run(FORWARD);
motor3.setSpeed(speedVal); motor3.run(FORWARD);
motor4.setSpeed(speedVal); motor4.run(FORWARD);
}
// Fungsi: Mundur lurus
void back() {
// Semua motor mundur dengan kecepatan speedVal
motor1.setSpeed(speedVal); motor1.run(BACKWARD);
motor2.setSpeed(speedVal); motor2.run(BACKWARD);
motor3.setSpeed(speedVal); motor3.run(BACKWARD);
motor4.setSpeed(speedVal); motor4.run(BACKWARD);
}
// Fungsi: Belok kiri di tempat (berputar ke kiri)
void left() {
// Roda kiri mundur, roda kanan maju → mobil berputar ke kiri
motor1.setSpeed(speedVal); motor1.run(BACKWARD);
motor2.setSpeed(speedVal); motor2.run(BACKWARD);
motor3.setSpeed(speedVal); motor3.run(FORWARD);
motor4.setSpeed(speedVal); motor4.run(FORWARD);
}
// Fungsi: Belok kanan di tempat (berputar ke kanan)
void right() {
// Roda kiri maju, roda kanan mundur → mobil berputar ke kanan
motor1.setSpeed(speedVal); motor1.run(FORWARD);
motor2.setSpeed(speedVal); motor2.run(FORWARD);
motor3.setSpeed(speedVal); motor3.run(BACKWARD);
motor4.setSpeed(speedVal); motor4.run(BACKWARD);
}
// Fungsi: Maju serong ke kiri
void forwardLeft() {
// Roda kiri lebih lambat dari roda kanan → maju ke kiri
motor1.setSpeed(speedVal/2); motor1.run(FORWARD);
motor2.setSpeed(speedVal/2); motor2.run(FORWARD);
motor3.setSpeed(speedVal); motor3.run(FORWARD);
motor4.setSpeed(speedVal); motor4.run(FORWARD);
}
// Fungsi: Maju serong ke kanan
void forwardRight() {
// Roda kanan lebih lambat dari roda kiri → maju ke kanan
motor1.setSpeed(speedVal); motor1.run(FORWARD);
motor2.setSpeed(speedVal); motor2.run(FORWARD);
motor3.setSpeed(speedVal/2); motor3.run(FORWARD);
motor4.setSpeed(speedVal/2); motor4.run(FORWARD);
}
// Fungsi: Mundur serong ke kiri
void backLeft() {
// Roda kiri lebih lambat dari roda kanan → mundur ke kiri
motor1.setSpeed(speedVal/2); motor1.run(BACKWARD);
motor2.setSpeed(speedVal/2); motor2.run(BACKWARD);
motor3.setSpeed(speedVal); motor3.run(BACKWARD);
motor4.setSpeed(speedVal); motor4.run(BACKWARD);
}
// Fungsi: Mundur serong ke kanan
void backRight() {
// Roda kanan lebih lambat dari roda kiri → mundur ke kanan
motor1.setSpeed(speedVal); motor1.run(BACKWARD);
motor2.setSpeed(speedVal); motor2.run(BACKWARD);
motor3.setSpeed(speedVal/2); motor3.run(BACKWARD);
motor4.setSpeed(speedVal/2); motor4.run(BACKWARD);
}
// Fungsi: Stop semua motor
void Stop() {
motor1.setSpeed(0); motor1.run(RELEASE);
motor2.setSpeed(0); motor2.run(RELEASE);
motor3.setSpeed(0); motor3.run(RELEASE);
motor4.setSpeed(0); motor4.run(RELEASE);
}
Follow Us
Were this world an endless plain, and by sailing eastward we could for ever reach new distances