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.

    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.