Arduino UNO Obstacle-Avoiding Robot with Ultrasonic Sensor and Servo
View and Edit Project In Cirkit Designer
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
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
Motor with reducer (2 units)
- Description: DC motor with a gear reducer.
- Pins: 3 - 6 VCC, GND
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
Tower Pro SG90 servo
- Description: Micro servo motor.
- Pins: Signal, +5V, GND
HC-SR04 Ultrasonic Distance Sensor (Wokwi Compatible)
- Description: Ultrasonic sensor for distance measurement.
- Pins: VCC, TRIG, ECHO, GND
7.4V Battery
- Description: Power source for the circuit.
- Pins: +, -
Wiring Details
Arduino UNO
GND connected to:
- HC-SR04 Ultrasonic Distance Sensor (GND)
- Tower Pro SG90 servo (GND)
- L298N DC motor driver (GND)
- 7.4V Battery (-)
5V connected to:
- HC-SR04 Ultrasonic Distance Sensor (VCC)
- Tower Pro SG90 servo (+5V)
Vin connected to:
- L298N DC motor driver (12V)
- 7.4V Battery (+)
D13 connected to:
- HC-SR04 Ultrasonic Distance Sensor (ECHO)
D12 connected to:
- HC-SR04 Ultrasonic Distance Sensor (TRIG)
D11 connected to:
- L298N DC motor driver (IN4)
D10 connected to:
- L298N DC motor driver (IN3)
D9 connected to:
- L298N DC motor driver (IN2)
D8 connected to:
- L298N DC motor driver (IN1)
D6 connected to:
- L298N DC motor driver (ENB)
D4 connected to:
- Tower Pro SG90 servo (Signal)
D3 connected to:
- L298N DC motor driver (ENA)
L298N DC Motor Driver
OUT1 connected to:
- Motor with reducer (3 - 6 VCC)
OUT2 connected to:
- Motor with reducer (GND)
OUT3 connected to:
- Motor with reducer (3 - 6 VCC)
OUT4 connected to:
- Motor with reducer (GND)
5V-ENA-JMP-I connected to:
- 5V-ENA-JMP-O
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.