const int TRIG = 7;
const int ECHO = 6;
const int DIR1 = 12;
const int STEP1 = 13;
const int DIR2 = 2;
const int STEP2 = 3;
const int REV = 200;
const int DIS_THRESHOLD = 10; // Distance threshold for obstacle detection (in cm)
const int SAFETY_MARGIN = 2; // Safety margin for obstacle distance
float duration_us, distance_cm;
void setup() {
Serial.begin(9600);
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
pinMode(STEP1, OUTPUT);
pinMode(DIR1, OUTPUT);
pinMode(STEP2, OUTPUT);
pinMode(DIR2, OUTPUT);
}
// Loop function
void loop() {
distance_cm = getUltrasonicDistance();
if (distance_cm < DIS_THRESHOLD + SAFETY_MARGIN) {
avoidObstacle();
} else {
moveForward(1000);
}
}
float getUltrasonicDistance() {
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
duration_us = pulseIn(ECHO, HIGH);
float distance = duration_us * 0.017;
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
return distance;
}
void moveForward(int speed) {
digitalWrite(DIR1, HIGH);
digitalWrite(DIR2, HIGH);
for (int x = 0; x < REV; x++) {
digitalWrite(STEP1, HIGH);
digitalWrite(STEP2, HIGH);
delayMicroseconds(speed);
digitalWrite(STEP1, LOW);
digitalWrite(STEP2, LOW);
delayMicroseconds(speed);
}
}
void avoidObstacle() {
turnLeft(500);
delay(500);
moveForward(1000);
}
void turnLeft(int speed) {
digitalWrite(DIR1, HIGH);
digitalWrite(DIR2, LOW);
for (int x = 0; x < REV / 2; x++) {
digitalWrite(STEP1, HIGH);
digitalWrite(STEP2, HIGH);
delayMicroseconds(speed);
digitalWrite(STEP1, LOW);
digitalWrite(STEP2, LOW);
delayMicroseconds(speed);
}
}