Obstacle Avoiding Robot car using Arduino

Obstacle Avoiding Robot car using Arduino
An obstacle avoiding robot is an intelligent device that senses any object infront of it and avoids it by turning in a different direction. In this tutorial we are using Arduino to control an ultrasonic sensor , four DC motors and a servo motor.
For this setup we are going to use the Adafruit motor shield. This shield helps in reducing the voltage load on the Arduino board from the motors. It also reduces the amount of wiring needed.
Other important references

Schematic of Obstacle avoiding Robot

For the obstacle avoiding robot we are making, we use a 4WD robot car chassis whose wheels are controlled by the motor shield. A servo motor mounted with an ultrasonic sensor is also included where the servo motor is for rotating the ultrasonic sensor from one end to another  in order to sense any obstacle in range.
obstacle avoiding robot schematic_diagram
You can buy the main parts for this project from these recommended links.
YIKESHU 4WD 2 Layer Smart Robot Car Chassis Kit with Speed Encoder Battery Box for Kids Teens DIY
HiLetgo L293D DC Motor Drive Shield Stepper Motor Drive Shield Expansion Board for Arduino Duemilanove Raspberry Pi
2pcs Ultrasonic Module HC-SR04 Distance Sensor with 2pcs Mounting Bracket for Arduino Uno R3 Mega 2560 Nano Raspberry Pi 3 Smart Robotics Projects
4Pcs SG90 9g Micro Servos for RC Robot Helicopter Airplane Controls Car Boat
Product
4-Wheel Smart Car Robot Chassis
L293D Motor Driver Shield
HC-SR04 Ultrasonic Sensor
SG90 Servo Motors
Price
$16.99
$6.19
$8.99
$8.99
YIKESHU 4WD 2 Layer Smart Robot Car Chassis Kit with Speed Encoder Battery Box for Kids Teens DIY
Product
4-Wheel Smart Car Robot Chassis
Price
$16.99
Buy Now
HiLetgo L293D DC Motor Drive Shield Stepper Motor Drive Shield Expansion Board for Arduino Duemilanove Raspberry Pi
Product
L293D Motor Driver Shield
Price
$6.19
Buy Now
2pcs Ultrasonic Module HC-SR04 Distance Sensor with 2pcs Mounting Bracket for Arduino Uno R3 Mega 2560 Nano Raspberry Pi 3 Smart Robotics Projects
Product
HC-SR04 Ultrasonic Sensor
Price
$8.99
Buy Now
4Pcs SG90 9g Micro Servos for RC Robot Helicopter Airplane Controls Car Boat
Product
SG90 Servo Motors
Price
$8.99
Buy Now

Last update on 2021-04-14 / Affiliate links / Images from Amazon Product Advertising API

CODE

Before writing any code make sure you have the AFMotor.h library included in your Arduino IDE. This library is for controlling the Adafruit motor shield used in this setup. This library can be downloaded from here. Make sure you read through the instructions for installing this library before you download this library.
Other important libraries for this project are the NewPing.h and Servo.h libraries for controlling the ultrasonic sensor and servo motor respectively.
#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 // sets speed of DC  motors
#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) // slowly bring the speed up to avoid loading down the batteries too quickly
   {
    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) // slowly bring the speed up to avoid loading down the batteries too quickly
  {
    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);
  motor4.run(FORWARD);
}  

When this code is uploaded, the robot car will move forward and when any object is detected atleast 15cm infront, the robot automatically turns left or right and move forward in a direction without any obstacles.

Leave a Reply

Your email address will not be published. Required fields are marked *

Back to top