Arduino UNO-Based Autonomous Obstacle-Avoiding Robot with Ultrasonic Sensor and Motor Control
View and Edit Project In Cirkit Designer
Circuit Documentation
Summary
This circuit is designed to control a robotic vehicle using an Arduino UNO microcontroller. The vehicle is equipped with two DC motors, a micro servo motor, and an HC-SR04 ultrasonic sensor for obstacle detection. The L298N motor driver is used to control the DC motors. The Arduino UNO reads data from the ultrasonic sensor and controls the motors and servo based on the sensor readings.
Component List
Arduino UNO
- Description: A 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 amarillo motorreductor hobby
- Description: A small DC motor with a gearbox.
- Pins: vcc, GND
HC-SR04 Ultrasonic Sensor
- Description: An ultrasonic distance sensor.
- Pins: VCC, TRIG, ECHO, GND
L298N DC motor driver
- Description: A 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
Micro servo 9G
- Description: A small servo motor.
- Pins: GND, +5V, PWM
7.4v Battery
- Description: A 7.4V battery pack.
- Pins: +, -
Wiring Details
Arduino UNO
GND connected to:
- HC-SR04 Ultrasonic Sensor (GND)
- L298N DC motor driver (GND)
- 7.4v Battery (-)
- Micro servo 9G (GND)
5V connected to:
- L298N DC motor driver (12V)
- 7.4v Battery (+)
- Micro servo 9G (+5V)
3.3V connected to:
- L298N DC motor driver (5V)
D5 connected to:
- L298N DC motor driver (IN4)
D4 connected to:
- L298N DC motor driver (IN3)
D3 connected to:
- L298N DC motor driver (IN2)
D2 connected to:
- L298N DC motor driver (IN1)
Vin connected to:
- HC-SR04 Ultrasonic Sensor (VCC)
A0 connected to:
- HC-SR04 Ultrasonic Sensor (TRIG)
A1 connected to:
- HC-SR04 Ultrasonic Sensor (ECHO)
D6 connected to:
- Micro servo 9G (PWM)
Motor amarillo motorreductor hobby
GND connected to:
- L298N DC motor driver (OUT1)
vcc connected to:
- L298N DC motor driver (OUT2)
GND connected to:
- L298N DC motor driver (OUT4)
vcc connected to:
- L298N DC motor driver (OUT3)
L298N DC motor driver
GND connected to:
- Arduino UNO (GND)
- 7.4v Battery (-)
12V connected to:
- Arduino UNO (5V)
5V connected to:
- Arduino UNO (3.3V)
IN4 connected to:
- Arduino UNO (D5)
IN3 connected to:
- Arduino UNO (D4)
IN2 connected to:
- Arduino UNO (D3)
IN1 connected to:
- Arduino UNO (D2)
OUT1 connected to:
- Motor amarillo motorreductor hobby (GND)
OUT2 connected to:
- Motor amarillo motorreductor hobby (vcc)
OUT3 connected to:
- Motor amarillo motorreductor hobby (vcc)
OUT4 connected to:
- Motor amarillo motorreductor hobby (GND)
ENA connected to:
- +5V-J1
ENB connected to:
- +5V-J2
HC-SR04 Ultrasonic Sensor
GND connected to:
- Arduino UNO (GND)
VCC connected to:
- Arduino UNO (Vin)
TRIG connected to:
- Arduino UNO (A0)
ECHO connected to:
- Arduino UNO (A1)
Micro servo 9G
GND connected to:
- Arduino UNO (GND)
+5V connected to:
- Arduino UNO (5V)
PWM connected to:
- Arduino UNO (D6)
7.4v Battery
- connected to:
- Arduino UNO (GND)
- L298N DC motor driver (GND)
+ connected to:
- Arduino UNO (5V)
- L298N DC motor driver (12V)
Code Documentation
#include <Servo.h> // Servo motor library. This is standard library
#include <NewPing.h> // Ultrasonic sensor function library. You must install this library
// our L298N control pins
const int LeftMotorForward = 2;
const int LeftMotorBackward = 3;
const int RightMotorForward = 4;
const int RightMotorBackward = 5;
// sensor pins
#define trig_pin A0 // analog input 1
#define echo_pin A1 // analog input 2
#define maximum_distance 200
boolean goesForward = false;
int distance = 100;
NewPing sonar(trig_pin, echo_pin, maximum_distance); // sensor function
Servo servo_motor; // our servo name
void setup() {
pinMode(RightMotorForward, OUTPUT);
pinMode(LeftMotorForward, OUTPUT);
pinMode(LeftMotorBackward, OUTPUT);
pinMode(RightMotorBackward, OUTPUT);
servo_motor.attach(6); // our servo pin
servo_motor.write(90);
delay(2000);
distance = readPing();
delay(100);
distance = readPing();
delay(100);
distance = readPing();
delay(100);
distance = readPing();
delay(100);
}
void loop() {
int distanceRight = 0;
int distanceLeft = 0;
delay(50);
if (distance <= 10) {
moveStop();
delay(300);
moveBackward();
delay(400);
moveStop();
delay(300);
distanceRight = lookRight();
delay(300);
distanceLeft = lookLeft();
delay(300);
if (distance >= distanceLeft) {
turnRight();
moveStop();
} else {
turnLeft();
moveStop();
}
} else {
moveForward();
}
distance = readPing();
}
int lookRight() {
servo_motor.write(10);
delay(500);
int distance = readPing();
delay(100);
servo_motor.write(90);
return distance;
}
int lookLeft() {
servo_motor.write(170);
delay(500);
int distance = readPing();
delay(100);
servo_motor.write(90);
return distance;
delay(100);
}
int readPing() {
delay(70);
int cm = sonar.ping_cm();
if (cm == 0) {
cm = 250;
}
return cm;
}
void moveStop() {
digitalWrite(RightMotorForward, LOW);
digitalWrite(LeftMotorForward, LOW);
digitalWrite(RightMotorBackward, LOW);
digitalWrite(LeftMotorBackward, LOW);
}
void moveForward() {
if (!goesForward) {
goesForward = true;
digitalWrite(LeftMotorForward, HIGH);
digitalWrite(RightMotorForward, HIGH);
digitalWrite(LeftMotorBackward, LOW);
digitalWrite(RightMotorBackward, LOW);
}
}
void moveBackward() {
goesForward = false;
digitalWrite(LeftMotorBackward, HIGH);
digitalWrite(RightMotorBackward, HIGH);
digitalWrite(LeftMotorForward, LOW);
digitalWrite(RightMotorForward, LOW);
}
void turnRight() {
digitalWrite(LeftMotorForward, HIGH);
digitalWrite(RightMotorBackward, HIGH);
digitalWrite(LeftMotorBackward, LOW);
digitalWrite(RightMotorForward, LOW);
delay(500);
digitalWrite(LeftMotorForward, HIGH);
digitalWrite(RightMotorForward, HIGH);