Cirkit Designer LogoCirkit DesignerYour all-in-one circuit design IDE Launch Cirkit Designer App

Arduino UNO Controlled Line Follower and Obstacle Avoiding Robot with IR and Ultrasonic Sensors

View and Edit Project In Cirkit DesignerImage of Arduino UNO Controlled Line Follower and Obstacle Avoiding Robot with IR and Ultrasonic Sensors

Circuit Documentation

Summary

This circuit is designed to control a robotic system that includes motors, sensors, and a servo. The core of the circuit is an Arduino UNO microcontroller, which interfaces with IR sensors, an ultrasonic sensor, a servo motor, and a DC motor driver that controls four gearmotors. A 4 x AAA battery mount provides power to the system, which is controlled by a rocker switch. The Arduino UNO manages sensor inputs and motor outputs to navigate the robot based on sensor feedback.

Component List

Arduino UNO

4 x AAA Battery Mount

Rocker Switch

L298N DC Motor Driver

Gearmotor DC / Motorreductor

Servo

IR Sensor

HC-SR04 Ultrasonic Sensor

Wiring Details

Arduino UNO

4 x AAA Battery Mount

Rocker Switch

L298N DC Motor Driver

Gearmotors

Servo

IR Sensors

HC-SR04 Ultrasonic Sensor

Documented Code

#define enA 10 // Enable1 L298 Pin enA
#define in1 9  // Motor1 L298 Pin in1
#define in2 8  // Motor1 L298 Pin in2
#define in3 7  // Motor2 L298 Pin in3
#define in4 6  // Motor2 L298 Pin in4
#define enB 5  // Enable2 L298 Pin enB
#define L_S A0 // IR sensor Left
#define R_S A1 // IR sensor Right
#define echo A2    // Echo pin
#define trigger A3 // Trigger pin
#define servo A5   // Servo pin

int Set = 15; // Threshold distance for obstacle avoidance
int distance_L, distance_F, distance_R; // Distances from sensors

void setup() {
  Serial.begin(9600); // Start serial communication at 9600bps
  // Initialize IR sensors as inputs
  pinMode(R_S, INPUT);
  pinMode(L_S, INPUT);
  // Initialize ultrasonic sensor pins
  pinMode(echo, INPUT);
  pinMode(trigger, OUTPUT);
  // Initialize motor driver pins
  pinMode(enA, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  pinMode(enB, OUTPUT);
  // Set initial motor speed
  analogWrite(enA, 200);
  analogWrite(enB, 200);
  // Initialize servo pin
  pinMode(servo, OUTPUT);
  // Sweep servo to initial positions
  sweepServo();
  // Read initial distance from ultrasonic sensor
  distance_F = Ultrasonic_read();
  delay(500);
}

void loop() {
  // Read distances from sensors
  distance_F = Ultrasonic_read();
  Serial.print("D F="); Serial.println(distance_F);
  // Line follower and obstacle avoiding logic
  if ((digitalRead(R_S) == 0) && (digitalRead(L_S) == 0)) {
    if (distance_F > Set) {
      forword();
    } else {
      Check_side();
    }
  } else if ((digitalRead(R_S) == 1) && (digitalRead(L_S) == 0)) {
    turnRight();
  } else if ((digitalRead(R_S) == 0) && (digitalRead(L_S) == 1)) {
    turnLeft();
  }
  delay(10);
}

// Function to pulse the servo to a given angle
void servoPulse(int pin, int angle) {
  int pwm = (angle * 11) + 500; // Convert angle to microseconds
  digitalWrite(pin, HIGH);
  delayMicroseconds(pwm);
  digitalWrite(pin, LOW);
  delay(50); // Refresh cycle of servo
}

// Function to read distance from ultrasonic sensor
long Ultrasonic_read() {
  digitalWrite(trigger, LOW);
  delayMicroseconds(2);
  digitalWrite(trigger, HIGH);
  delayMicroseconds(10);
  long time = pulseIn(echo, HIGH);
  return time / 29 / 2; // Convert time to distance
}

// Function to compare distances and decide direction
void compareDistance() {
  if (distance_L > distance_R) {
    turnLeft();
    delay(500);
    forword();
    delay(600);
    turnRight();
    delay(500);
    forword();
    delay(600);
    turnRight();
    delay(400);
  } else {
    turnRight();
    delay(500);
    forword();
    delay(600);
    turnLeft();
    delay(500);
    forword();
    delay(600);
    turnLeft();
    delay(400);
  }
}

// Function to check side distances and decide next move
void Check_side() {
  Stop();
  delay(100);
  sweepServo();
  delay(300);
  distance_R = Ultrasonic_read();
  Serial.print("D R="); Serial.println(distance_R);
  delay(100);
  sweepServo();
  delay(500);
  distance_L = Ultrasonic_read();
  Serial.print("D L="); Serial.println(distance_L);
  delay(100);
  sweepServo();
  delay(300);
  compareDistance();
}

// Function to move forward
void forword() {
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
}

// Function to move backward
void backword() {
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
}

// Function to turn right
void turnRight() {
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
}

// Function to turn left
void turnLeft() {
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
}

// Function to stop all motors
void Stop() {
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in