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 provides a detailed overview of an obstacle-avoiding robot circuit. The robot uses an Arduino UNO microcontroller to control two motors via an L298N motor driver, a servo motor for scanning, and an HC-SR04 ultrasonic sensor for obstacle detection. The robot 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

Motor with reducer (1st unit)

Motor with reducer (2nd unit)

L298N DC motor driver

Documented Code

Arduino UNO Code

/*
 * 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 20, 90, and 155 degrees. If an obstacle is detected
 * at 20 degrees, the robot backs up for 3 seconds and turns left. If an
 * obstacle is detected at 155 degrees, the robot backs up for 3 seconds
 * and turns right.
 */

// 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, 200);
  analogWrite(enB, 200);
}

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

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

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

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

void loop() {
  moveForward();
  long distance = readUltrasonicDistance();
  if (distance < 10) {
    stopMoving();
    delay(1000);
    myServo.write(20);
    delay(1000);
    long distanceLeft = readUltrasonicDistance();
    myServo.write(155);
    delay(1000);
    long distanceCenter = readUltrasonicDistance();
    myServo.write(90);
    delay(1000);
    rvs();
    delay(500);
    stopMoving();
    delay(1000);
    turnLeft();
    delay(200);
    stopMoving();
    delay(1000);
  }
}

L298N DC Motor Driver Code

void setup() {
  // put your setup code here, to run once:
}

void loop() {
  // put your main code here, to run repeatedly:
}

This concludes the documentation for the obstacle-avoiding robot circuit.