Cirkit Designer Logo
Cirkit Designer
Your all-in-one circuit design IDE
Home / 
Project Documentation

Arduino-Powered Autonomous Obstacle Avoidance Robot with Servo Control

Image of Arduino-Powered Autonomous Obstacle Avoidance Robot with Servo Control

Circuit Documentation

Summary

This circuit is designed to control a robotic system using various components including motors, sensors, and a microcontroller. The system utilizes an Arduino UNO as the main controller, which interfaces with a DC motor driver (L298N) to control the movement of motors and wheels. An ultrasonic sensor (HC-SR04) is used for distance measurement, allowing the robot to navigate its environment. The circuit is powered by a 12V battery and can also be charged using a solar panel through a solar charge controller.


Component List

1. Servomotor SG90

  • Description: A small servo motor used for precise control of angular position.
  • Pins: SIG, VCC, GND

2. Motor and Wheels

  • Description: A set of motors and wheels used for driving the robot.
  • Pins: vcc, GND

3. L298N DC Motor Driver

  • Description: A dual H-Bridge motor driver that allows control of the direction and speed of DC motors.
  • Pins: OUT1, OUT2, 12V, GND, 5V, OUT3, OUT4, ENA, IN1, IN2, IN3, IN4

4. Battery 12V

  • Description: A rechargeable battery providing power to the circuit.
  • Pins: +, -

5. Solar Panel

  • Description: A solar panel used to charge the battery.
  • Pins: +, -

6. Solar Charge Controller

  • Description: A device that manages the charging of the battery from the solar panel.
  • Pins: Solar +, Solar -, Battery +, Battery -

7. Arduino UNO

  • Description: A microcontroller board based on the ATmega328P, used for programming and controlling the circuit.
  • Pins: Various digital and analog pins including SDA, SCL, and power pins.

8. Arduino Sensor Shield v5.0

  • Description: An expansion board for the Arduino that provides additional connections for sensors and modules.
  • Pins: VCC, GND, various digital pins for sensor connections.

9. HC-SR04 Ultrasonic Sensor

  • Description: An ultrasonic distance sensor used for measuring distance to obstacles.
  • Pins: VCC, TRIG, ECHO, GND

10. DC Mini Metal Gear Motor

  • Description: A small DC motor with metal gears for increased torque.
  • Pins: IN1, IN2

Wiring Details

Servomotor SG90

  • SIG connected to Arduino Sensor Shield v5.0 pin 11-G
  • VCC connected to Arduino Sensor Shield v5.0 pin 11-V
  • GND connected to Arduino Sensor Shield v5.0 pin 11-S

Motor and Wheels (Instance 1)

  • vcc connected to L298N DC Motor Driver OUT1
  • GND connected to L298N DC Motor Driver OUT2

Motor and Wheels (Instance 2)

  • vcc connected to L298N DC Motor Driver OUT3
  • GND connected to L298N DC Motor Driver OUT4

L298N DC Motor Driver

  • 12V connected to Battery +
  • GND connected to Battery -
  • OUT1 connected to Motor and Wheels (Instance 1) vcc
  • OUT2 connected to Motor and Wheels (Instance 1) GND
  • OUT3 connected to Motor and Wheels (Instance 2) vcc
  • OUT4 connected to Motor and Wheels (Instance 2) GND
  • ENA connected to Arduino Sensor Shield v5.0 pin 5-G
  • IN1 connected to Arduino Sensor Shield v5.0 pin 4-G
  • IN2 connected to Arduino Sensor Shield v5.0 pin 3-G
  • IN3 connected to Arduino Sensor Shield v5.0 pin 2-G
  • IN4 connected to Arduino Sensor Shield v5.0 pin 1-G

Battery 12V

  • + connected to L298N DC Motor Driver 12V
  • - connected to L298N DC Motor Driver GND

Solar Panel

  • + connected to Solar Charge Controller Solar +
  • - connected to Solar Charge Controller Solar -

HC-SR04 Ultrasonic Sensor

  • VCC connected to Arduino Sensor Shield v5.0 pin 5-V
  • TRIG connected to Arduino Sensor Shield v5.0 pin URF01-A0
  • ECHO connected to Arduino Sensor Shield v5.0 pin URF01-A1
  • GND connected to Arduino Sensor Shield v5.0 pin GND-G

Documented Code

#include <AFMotor.h>  
#include <NewPing.h>
#include <Servo.h> 

#define TRIG_PIN A0 
#define ECHO_PIN A1 
#define MAX_DISTANCE 200 
#define MAX_SPEED 190 
#define MAX_SPEED_OFFSET 20

NewPing sonar(TRIG_PIN, ECHO_PIN, MAX_DISTANCE); 

AF_DCMotor motor1(1, MOTOR12_1KHZ); 
AF_DCMotor motor2(2, MOTOR12_1KHZ);
AF_DCMotor motor3(3, MOTOR34_1KHZ);
AF_DCMotor motor4(4, MOTOR34_1KHZ);
Servo myservo;   

boolean goesForward=false;
int distance = 100;
int speedSet = 0;

void setup() {

  myservo.attach(10);  
  myservo.write(115); 
  delay(2000);
  distance = readPing();
  delay(100);
  distance = readPing();
  delay(100);
  distance = readPing();
  delay(100);
  distance = readPing();
  delay(100);
}

void loop() {
 int distanceR = 0;
 int distanceL =  0;
 delay(40);

 if(distance<=15)
 {
  moveStop();
  delay(100);
  moveBackward();
  delay(300);
  moveStop();
  delay(200);
  distanceR = lookRight();
  delay(200);
  distanceL = lookLeft();
  delay(200);

  if(distanceR>=distanceL)
  {
    turnRight();
    moveStop();
  }else
  {
    turnLeft();
    moveStop();
  }
 }else
 {
  moveForward();
 }
 distance = readPing();
}

int lookRight()
{
    myservo.write(50); 
    delay(500);
    int distance = readPing();
    delay(100);
    myservo.write(115); 
    return distance;
}

int lookLeft()
{
    myservo.write(170); 
    delay(500);
    int distance = readPing();
    delay(100);
    myservo.write(115); 
    return distance;
    delay(100);
}

int readPing() { 
  delay(70);
  int cm = sonar.ping_cm();
  if(cm==0)
  {
    cm = 250;
  }
  return cm;
}

void moveStop() {
  motor1.run(RELEASE); 
  motor2.run(RELEASE);
  motor3.run(RELEASE);
  motor4.run(RELEASE);
} 

void moveForward() {

 if(!goesForward)
  {
    goesForward=true;
    motor1.run(FORWARD);      
    motor2.run(FORWARD);
    motor3.run(FORWARD); 
    motor4.run(FORWARD);     
   for (speedSet = 0; speedSet < MAX_SPEED; speedSet +=2) 
   {
    motor1.setSpeed(speedSet);
    motor2.setSpeed(speedSet);
    motor3.setSpeed(speedSet);
    motor4.setSpeed(speedSet);
    delay(5);
   }
  }
}

void moveBackward() {
    goesForward=false;
    motor1.run(BACKWARD);      
    motor2.run(BACKWARD);
    motor3.run(BACKWARD);
    motor4.run(BACKWARD);  
  for (speedSet = 0; speedSet < MAX_SPEED; speedSet +=2) 
  {
    motor1.setSpeed(speedSet);
    motor2.setSpeed(speedSet);
    motor3.setSpeed(speedSet);
    motor4.setSpeed(speedSet);
    delay(5);
  }
}  

void turnRight() {
  motor1.run(FORWARD);
  motor2.run(FORWARD);
  motor3.run(BACKWARD);
  motor4.run(BACKWARD);     
  delay(500);
  motor1.run(FORWARD);      
  motor2.run(FORWARD);
  motor3.run(FORWARD);
  motor4.run(FORWARD);      
} 

void turnLeft() {
  motor1.run(BACKWARD);     
  motor2.run(BACKWARD);  
  motor3.run(FORWARD);
  motor4.run(FORWARD);   
  delay(500);
  motor1.run(FORWARD);     
  motor2.run(FORWARD);
  motor3.run(FORWARD);