Obstacle Avoiding Robot
Explanation
Obstacle Avoiding Robot
1. Motor Control:
Pins ENA and ENB control the motor speeds using analogWrite.
Pins IN1, IN2, IN3, and IN4 control the motor direction.
2. Ultrasonic Sensor: Measures the distance to obstacles using the trigPin and echoPin.
3. Servo Motor: Rotates to scan left and right to find the best direction to avoid obstacles.
4. Simple Logic: Moves forward until an obstacle is detected. Stops, scans left and right, then chooses the direction with more space.
Code
// Motor Pins
int ENA = 9; // Speed control for left motor
int IN1 = 8; // Left motor direction
int IN2 = 7; // Left motor direction
int IN3 = 6; // Right motor direction
int IN4 = 5; // Right motor direction
int ENB = 10; // Speed control for right motor
// Ultrasonic Sensor Pins
int trigPin = 3;
int echoPin = 2;
// Servo Pin
#include <Servo.h>
Servo myServo;
int servoPin = 11;
// Variables
long duration;
int distance;
void setup() {
// Motor Pins as Output
pinMode(ENA, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(ENB, OUTPUT);
// Ultrasonic Sensor Pins
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// Servo Setup
myServo.attach(servoPin);
myServo.write(90); // Center position
Serial.begin(9600); // Serial Monitor for debugging
}
void loop() {
distance = measureDistance();
if (distance < 15) { // Obstacle detected
stopMotors();
delay(500);
// Scan left
myServo.write(45);
delay(500);
int distanceLeft = measureDistance();
// Scan right
myServo.write(135);
delay(500);
int distanceRight = measureDistance();
// Return to center
myServo.write(90);
delay(500);
// Decide direction
if (distanceLeft > distanceRight) {
turnLeft();
} else {
turnRight();
}
delay(500);
} else {
moveForward();
}
}
// Functions for Motor Control
void moveForward() {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
analogWrite(ENA, 150); // Speed
analogWrite(ENB, 150); // Speed
}
void stopMotors() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}
void turnLeft() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
analogWrite(ENA, 150); // Speed
analogWrite(ENB, 150); // Speed
}
void turnRight() {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
analogWrite(ENA, 150); // Speed
analogWrite(ENB, 150); // Speed
}
// Measure Distance using Ultrasonic Sensor
int measureDistance() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
return duration * 0.034 / 2; // Convert to centimeters
}