OBSTACLE AVOIDING ROBOT USING ULTRASONIC SENSOR

Dependencies:   HCSR04 Motordriver Servo TextLCD mbed

Files at this revision

API Documentation at this revision

Comitter:
kit3
Date:
Sat May 18 04:39:55 2013 +0000
Commit message:
OBSTACLE AVOIDING ROBOT USING ULTRASONIC SENSOR

Changed in this revision

HCSR04.lib Show annotated file Show diff for this revision Revisions of this file
Motordriver.lib Show annotated file Show diff for this revision Revisions of this file
Servo.lib Show annotated file Show diff for this revision Revisions of this file
TextLCD.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r a87600bebf7b HCSR04.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HCSR04.lib	Sat May 18 04:39:55 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/prabhuvd/code/HCSR04/#71da0dbf4400
diff -r 000000000000 -r a87600bebf7b Motordriver.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Motordriver.lib	Sat May 18 04:39:55 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/littlexc/code/Motordriver/#3110b9209d3c
diff -r 000000000000 -r a87600bebf7b Servo.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Servo.lib	Sat May 18 04:39:55 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/simon/code/Servo/#36b69a7ced07
diff -r 000000000000 -r a87600bebf7b TextLCD.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TextLCD.lib	Sat May 18 04:39:55 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/simon/code/TextLCD/#44f34c09bd37
diff -r 000000000000 -r a87600bebf7b main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sat May 18 04:39:55 2013 +0000
@@ -0,0 +1,229 @@
+/* Megha Sharma, Rishabh Sehgal, Ragheshwar Singh Ranawat ,E.C.E.D NIT Hamirpur
+   
+   OBSTACLE AVOIDING ROBOT USING ULTRASONIC SENSOR HCSR04
+   
+In this project LPC 1768 embed board along with NGX Expresso baseboard are successfuly used to make an obstacle avoiding/ 
+self navigating robot which makes use of Ultrasonic Sensor HCSR04 for obstacle detection and Ranging. The maximum range of 
+Ultrasonic sensor is about 3-4 meters. A program called "ping" sends a serial trigger pulse of 10 nS to the Trigger pin of
+HCSR04 and on receiving the trigger HCSR04 beams out an 8 cycle Sonic burst. Then Echo pulse is received by the Ultrasonic sensor 
+upto 25ms. On receiving the Echo pulse distance is calculated. The HCSR04 is mounted Axially on a servo motor. Initially the HCSR04
+is kept in a straight direction. Motors make bot move in forward direction and continuosly calculating the distance of the 
+nearest obstacle in the forward direction. After seeing a distance at less than a "Constraint Value" (i.e. 10 cm here), 
+the robot goes in a scan mode. It first moves the Servo Motor to the Right, waits for 2 seconds and stores the value of 
+Distance in right direction in "rightscanval" variable.Then it comes back to centre position. Now it moves towards the 
+Left direction, waits for 2 seconds and stores the value of Distance in "leftscanval" variable. Then it comes back to the 
+centre position. Now it does the comparison of the two variables to determine in which direction it should move. It 
+successfully turns towards the direction with the farthest distance of obstacle. 
+
+Again the Servo motor is in forward direction keeping the sensor straight and the Robot also moves towards Forward direction all
+the while calculating the distance of obstacle in forward direction. The loop continues.....
+
+*/
+#include "mbed.h"
+#include "hcsr04.h"
+#include "motordriver.h"
+#include "TextLCD.h"
+#include "Servo.h"
+int ping ();
+void scan();
+void right (void);  
+void stop (void );
+void straight (void);
+void left (void);
+Motor A(p22, p6, p5, 1); // pwm, fwd, rev, can brake 
+Motor B(p21, p7, p8, 1);
+HCSR04  usensor(p13,p14);
+TextLCD lcd(p24, p26, p27, p28, p29, p30); // rs, e, d4-d7
+PwmOut servo(p23); // Servo pin 21
+
+
+unsigned int dist;
+DigitalOut myled(LED1);
+DigitalOut myled1(LED2);
+DigitalOut myled2(LED3);
+int count = 0;
+
+int main ()
+    {
+    
+         while (1)                // continuos loop to perform the scanning function of HCSR04 .. 
+                                  //a trigger pulse of Ultrasonic waves having duration 10 nS is sent through the echo pin
+            {
+
+                servo.period(0.020); 
+                int distance = ping();   // ping function
+                straight();        // use the ping() function to see if anything is ahead.
+   
+                        
+                  if (distance < 10) // the condition for stopping the Obstacle Avoider... 
+                                    // ...whenever the defined proximity to obstacle is reached.
+                    {   
+                        stop();
+                        scan();
+                        
+                        
+                        /*switch (a) // switch case for initial testing of the Obstacle detection by sensor and 
+                                     // Corresponding L.E.D. of the best direction will glow. 
+    
+                             {
+                               case 'r':
+                                 myled=1;
+                                 break;
+                               case 'l':
+                                 myled1=1;
+                                 break;
+                               case 'f':
+                                myled2=1; 
+                                  break;
+                                  }*/
+    
+                     }
+            }      
+    }
+                      
+               // A functon to perform the continuos pinging function of HCSR04 .. 
+               //a trigger pulse of Ultrasonic waves having duration 10 nS is sent through the echo pin  
+                         
+        int ping()                  // ultrasonic sensor is started and data collected is displayed on the LCD
+                                    // ping function returns an int value of distance scanned
+                    {
+                        usensor.start();
+                        wait_ms(200); 
+                        dist=usensor.get_dist_cm();
+                        lcd.cls();
+                        lcd.locate(0,0);
+                        if (dist <50)
+                        lcd.printf("cm:%ld",dist );
+                        else
+                        lcd.printf("no object");
+                        return (dist);
+                         
+                     }
+        
+        
+         void scan () 
+            {
+                         
+                int leftscanval, rightscanval;       // variables for storing distance scan values...
+                                                     //... of nearest obstacle in the left and right direction
+                                                     
+                                                     
+          // Scanning RIGHT side; turning the servo attached to HCSR04 right to check for obstacle distance
+                        
+                        // 0.0016 corresponds to the neutral position of servo motor 
+                        // 0.0027 corresponds to the rightmost position of the servo motor 
+                        // 0.0009 corresponds to the leftmost position of the servomotor
+                    
+                    for(float offset=0.0016; offset<=0.0027; offset+=0.0001)      // turning RIGHT
+                        
+                        {
+                            servo.pulsewidth(offset); // servo position determined by a pulsewidth between 1-2ms
+                            wait(0.10);
+                        }
+                            wait (2);                 // stopping at RIGHTMOST position for 2 seconds
+                            rightscanval = ping();    // putting the distance of right direction's obstacle in ''rightscanval variable'' 
+                    
+                    
+                    
+                    for(float offset=0.0027; offset>=0.0016; offset+=-0.0001)     // turning back to the CENTER position
+                        
+                        {
+                            servo.pulsewidth(offset); // servo position determined by a pulsewidth between 1-2ms
+                            wait(0.10);
+                        }
+                            wait(2);                  // stopping at CENTERMOST position for 2 seconds
+            
+            
+          // Scanning LEFT side; turning the servo attached to HCSR04 right to check for obstacle distance
+          
+          
+                    for(float offset=0.0016; offset>=0.0009; offset-=0.0001)    // Turning towards LEFT
+                        
+                        {
+                            servo.pulsewidth(offset); // servo position determined by a pulsewidth between 1-2ms
+                            wait(0.10);
+                        }
+                            wait(2);                   // stopping at LEFTMOST position for 2 seconds                       
+                            leftscanval = ping();      // putting the distance of right direction's obstacle in ''leftscanval variable''
+                  
+                    
+                    for(float offset=0.0009; offset<=0.0016; offset+=0.0001) 
+                    
+                        {
+                            servo.pulsewidth(offset); // servo position determined by a pulsewidth between 1-2ms
+                            wait(0.10);
+                        }
+                  /*center scan servo (for changing the default position of Servo to the Centre Position ) This method didnt work 
+                    though. There is a library of Servo 
+                    */
+                  //servo.pulsewidth(0.00017);
+                 
+             
+ /* Comparisons to choose the most appropiate direction for the turning of Robot. Based on the distances stored in variables "leftscanvalue" and "rightscanvalue"  */
+             
+             if (leftscanval>rightscanval )
+                  
+                    {
+                        left();
+                    }
+                    
+             else if (rightscanval>leftscanval )
+                    
+                    {
+                       right();
+                    }
+                    
+             else
+                    {
+                        left();
+                    }
+                    
+                  //return choice;
+                         }
+                         
+         void stop ()           // function for stopping the DC motors
+             
+             {
+                A.speed(0); 
+                B.speed(0);
+             }
+         
+         
+         void left()            // function for moving the RIGHT motor in FORWARD direction and LEFT motor in REVERSE direction so... 
+                                // ..that the robot turns to the LEFT
+            
+            {
+                for (float s= -1.0; s < 0.0 ; s += 0.01) 
+                    {
+                        A.speed(-1); 
+                        B.speed(-1); 
+                        wait(0.02);
+                    }                
+            }
+            
+            
+        void right ()           // function for moving the RIGHT motor in REVERSE direction and LEFT motor in FORWARD direction so... 
+                                // ..that the robot turns to the LEFT
+            
+            {
+                for (float s= -1.0; s < 0.0 ; s += 0.01) 
+                    {
+                        A.speed(1); 
+                        B.speed(1); 
+                        wait(0.02);
+                    }                
+            }
+
+
+        void straight ()        // function for moving the RIGHT motor in FORWARD direction and LEFT motor in REVERSE direction so... 
+                                // ..that the robot turns to the LEFT
+
+            {            
+                //for (float s= -1.0; s < -0.7 ; s += 0.01) 
+                {
+                    A.speed(-1); 
+                    B.speed(1); 
+                    wait(0.02);
+                }
+                
+            }
\ No newline at end of file
diff -r 000000000000 -r a87600bebf7b mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Sat May 18 04:39:55 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/7e6c9f46b3bd
\ No newline at end of file