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

Arduino UNO Obstacle-Avoiding Robot with Ultrasonic Sensor and Servo

View and Edit Project In Cirkit DesignerImage of Arduino UNO Obstacle-Avoiding Robot with Ultrasonic Sensor and Servo

Circuit Documentation

Summary

This document describes an obstacle-avoiding robot circuit. The robot uses an Arduino UNO microcontroller to control two motors via an L298N motor driver and detect obstacles using an HC-SR04 ultrasonic sensor. A Tower Pro SG90 servo is used to scan for obstacles at different angles. The circuit is powered by a 7.4V battery.

Component List

  1. Arduino UNO

    • Description: Microcontroller board based on the ATmega328P.
    • Pins: UNUSED, IOREF, Reset, 3.3V, 5V, GND, Vin, A0, A1, A2, A3, A4, A5, SCL, SDA, AREF, D13, D12, D11, D10, D9, D8, D7, D6, D5, D4, D3, D2, D1, D0
  2. Motor with reducer (2 units)

    • Description: DC motor with a gear reducer.
    • Pins: 3 - 6 VCC, GND
  3. L298N DC motor driver

    • Description: Dual H-Bridge motor driver.
    • Pins: OUT1, OUT2, 12V, GND, 5V, OUT3, OUT4, 5V-ENA-JMP-I, 5V-ENA-JMP-O, +5V-J1, +5V-J2, ENA, IN1, IN2, IN3, IN4, ENB
  4. Tower Pro SG90 servo

    • Description: Micro servo motor.
    • Pins: Signal, +5V, GND
  5. HC-SR04 Ultrasonic Distance Sensor (Wokwi Compatible)

    • Description: Ultrasonic sensor for distance measurement.
    • Pins: VCC, TRIG, ECHO, GND
  6. 7.4V Battery

    • Description: Power source for the circuit.
    • Pins: +, -

Wiring Details

Arduino UNO

L298N DC Motor Driver

Code Documentation

/*
 * This Arduino sketch controls an obstacle-avoiding robot with a servo.
 * The robot uses an HC-SR04 ultrasonic sensor to detect obstacles and
 * an L298N motor driver to control two motors. A servo is used to scan
 * for obstacles at 25, 90, and 150 degrees.
 */

// Pin definitions
const int trigPin = 12;
const int echoPin = 13;
const int enA = 3;
const int in1 = 8;
const int in2 = 9;
const int enB = 6;
const int in3 = 10;
const int in4 = 11;
const int servoPin = 4;

#include <Servo.h>
Servo myServo;

void setup() {
  // Initialize motor control pins
  pinMode(enA, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  // Initialize ultrasonic sensor pins
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  // Initialize servo
  myServo.attach(servoPin);
  // Start with motors off
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
}

long readUltrasonicDistance() {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  return pulseIn(echoPin, HIGH) * 0.034 / 2;
}

void moveForward() {
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  analogWrite(enA, 255);
  analogWrite(enB, 255);
}

void moveBackward() {
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  analogWrite(enA, 255);
  analogWrite(enB, 255);
}

void stopMoving() {
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
}

void loop() {
  long distance = readUltrasonicDistance();
  if (distance < 20) {
    stopMoving();
    delay(500);
    myServo.write(25);
    delay(500);
    long distanceRight = readUltrasonicDistance();
    myServo.write(90);
    delay(500);
    long distanceCenter = readUltrasonicDistance();
    myServo.write(150);
    delay(500);
    long distanceLeft = readUltrasonicDistance();
    if (distanceRight > distanceLeft && distanceRight > distanceCenter) {
      moveForward();
    } else if (distanceLeft > distanceRight && distanceLeft > distanceCenter) {
      moveBackward();
    } else {
      stopMoving();
    }
  } else {
    moveForward();
  }
  delay(100);
}

This code initializes the pins for the motors, ultrasonic sensor, and servo. It reads the distance from the ultrasonic sensor and controls the motors and servo to avoid obstacles. The robot moves forward if no obstacles are detected, and stops and scans for a clear path if an obstacle is detected.