Obstacle Avoiding Robot car using Arduino

obstacle avoiding robot using Arduino

An obstacle avoiding robot is an intelligent device that senses any object in front 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.

Before attempting this project you should have prior knowledge of how to use DC motors, servo motors and the L293D motor driver shield with Arduino. You can make reference from my other tutorials below;

  • How to control a servo motor with Arduino
  • Ultrasonic sensor with Arduino
  • L293D Motor Driver shield for Arduino
  • Schematic of Obstacle avoiding Robot using Arduino.

    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
    $9.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
    $9.99
    Buy Now

    Last update on 2021-10-08 / Affiliate links / Images from Amazon Product Advertising API

    Code for Obstacle avoiding robot using Arduino.

    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.

    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.

    You may also like...