Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of HC-SR04_BUGGY by
Revision 1:80c2ef16a42f, committed 2016-07-18
- Comitter:
- RenBuggy
- Date:
- Mon Jul 18 10:00:29 2016 +0000
- Parent:
- 0:fbceffb594b6
- Commit message:
- First working revision, uses 2 sensors
Changed in this revision
diff -r fbceffb594b6 -r 80c2ef16a42f USBDevice.lib --- a/USBDevice.lib Thu Jul 14 12:58:48 2016 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -http://mbed.org/users/mbed_official/code/USBDevice/#01321bd6ff89
diff -r fbceffb594b6 -r 80c2ef16a42f main.cpp
--- a/main.cpp Thu Jul 14 12:58:48 2016 +0000
+++ b/main.cpp Mon Jul 18 10:00:29 2016 +0000
@@ -1,39 +1,64 @@
+/*
+*RenBuggy_Ultrasonic
+*
+*A Program that allows the RenBuggy to avoid obstacles using two HC-SR04
+*ultrasonic modules.
+*
+*Copyright (c) 2016 Elijah Orr
+
+*Permission is hereby granted, free of charge, to any person obtaining a copy
+*of this software and associated documentation files (the "Software"), to deal
+*in the Software without restriction, including without limitation the rights
+*to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+*copies of the Software, and to permit persons to whom the Software is
+*furnished to do so, subject to the following conditions:
+
+*The above copyright notice and this permission notice shall be included in
+*all copies or substantial portions of the Software.
+
+*THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+*IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+*FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+*AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+*LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+*OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+*THE SOFTWARE.
+*/
+
+//include files - mbed library and our ultrasonic library
#include "mbed.h"
#include "ultrasonic_buggy.h"
-//#include "USBSerial.h"
-//USBSerial serial;
-
-
+//The main function is where the program will begin to execute
int main(){
+ //create two floating point vairables to store distance readings in
float left_distance;
float right_distance;
+ //call the stop function to make sure buggy is stationary
stop();
+ //wait for some setup time
wait(5);
- //serial.printf("PROGRAM START\n\r");
+ //the code in this while loop will always execute and will repeat forever
while(1){
-
- //wait(1);
-
+ //take a distance reading from each of the sensors
left_distance = getDistance_l();
right_distance = getDistance_r();
- //if((left_distance > 0.3) && (right_distance > 0.3)){
- //serial.printf("left distance = %f right distance = %f\n\r", left_distance, right_distance);
- /* if(left_distance > right_distance){
- left(0.1);
- }
- else if(right_distance > left_distance){
- right(0.1);
- }
+ //if there is an object on the left, turn right
+ if(left_distance < 0.4){
+ right(0.1);
}
-
+ //else if there is an object on the right, turn left
+ else if(right_distance < 0.4){
+ left(0.1);
+ }
+ //else move forwards
else{
- right(3);
- }*/
-
+ forward(0.1);
+ }
+ //code loops back to start of while loop
}
}
diff -r fbceffb594b6 -r 80c2ef16a42f ultrasonic_buggy.cpp
--- a/ultrasonic_buggy.cpp Thu Jul 14 12:58:48 2016 +0000
+++ b/ultrasonic_buggy.cpp Mon Jul 18 10:00:29 2016 +0000
@@ -14,8 +14,8 @@
#include "ultrasonic_buggy.h"
// PwmOut is used to control the motors
-DigitalOut Lmotor(LEFT_MOTOR_PIN, 0);
-DigitalOut Rmotor(RIGHT_MOTOR_PIN, 0);
+PwmOut Lmotor(LEFT_MOTOR_PIN);
+PwmOut Rmotor(RIGHT_MOTOR_PIN);
// set up digital in and out pins for the ultrasonic, as well as a timer for use in the ultrasonic functions
DigitalOut trigger(TRIGGER_PIN);
@@ -24,10 +24,10 @@
Timer timer;
DigitalOut SR04_nReset(P0_7, 1);
-//Trim is an offset that you can adjust to help the buggy drive straight
-//Trim = -0.3 is a left trim
-//Trim = 0.3 is a right trim
-//float trim = -0.6;
+/* Trim is an offset that you can adjust to help the buggy drive straight
+Trim = -0.3 is a left trim
+Trim = 0.3 is a right trim */
+float trim = -0.3;
/* Functions (listed below) contain the code that runs the buggy.
These functions can be used in the main.cpp file */
@@ -42,8 +42,8 @@
extern void forward(float time) //moves forward for (time) seconds
{
- Lmotor = 1; //+ trim;
- Rmotor = 1; //- trim; //set the left and right motor to 1.0 (full speed) - the trim offset
+ Lmotor = 1.0 + trim;
+ Rmotor = 1.0 - trim; //set the left and right motor to 1.0 (full speed) - the trim offset
hold(time); //wait for (time) seconds while the motors are on
stop(); //stops the motors
}
@@ -51,8 +51,8 @@
extern void left(float time) //moves left for (time) seconds
{
- Rmotor = 1; //set the right motor to full speed
- Lmotor = 0; //set the left motor to off
+ Rmotor = 1.0; //set the right motor to full speed
+ Lmotor = 0.0; //set the left motor to off
hold(time); //waits for (time) seconds
stop(); //stops the motors
}
@@ -60,8 +60,8 @@
extern void right(float time) //moves right for (time) seconds
{
- Lmotor = 1; //set the left motor to full speed
- Rmotor = 0; //set the right motor to off
+ Lmotor = 1.0; //set the left motor to full speed
+ Rmotor = 0.0; //set the right motor to off
hold(time); //waits for (time) seconds
stop(); //stops the motors
}
@@ -77,9 +77,10 @@
*
*Gets a left distance reading from the ultrasonic sensor
*
-*Returns: float(distance in metres). Returns 0 if no object within 4m.
+*Returns: float(distance in metres). Returns 4.0 if no reflection is received.
*
*WARNING: SPAGHETTI
+*
*/
extern float getDistance_l(void)
{
@@ -87,13 +88,18 @@
float distance_m = 0;
trigger:
+ timer.stop();
+ timer.reset();
//send trigger signal to ultrasonic
trigger = 1; //set trigger pin high
wait_us(10); //wait 10 us
trigger = 0; //set trigger pin low
+ timer.start();
check_echo_high:
if(echo_left == 1){ //echo pin goes high
+ timer.stop();
+ timer.reset();
timer.start(); //start the timer
check_echo_low:
if(echo_left == 0){ //echo pin goes low
@@ -104,13 +110,13 @@
}
else{
if(timer.read_ms() > 30 ){ //if the timer reaches 30ms then echo is stuck high, so reset the SR04
+
resetSR04();
- if(echo_left == 0){
- goto trigger; //when echo goes low again, reattempt measurement
- }
- else{
- wait_ms(1); //otherwise wait for low state
- }
+
+ distance_m = 4.0;
+ goto returnvalue;
+
+
}
else{
goto check_echo_low; //go to inner loop so that RenBED keeps checking echo pin for low state
@@ -118,11 +124,20 @@
}
}
else{
+ if(timer.read_ms() > 20){
+ goto trigger; //resend trigger if module unresponsive
+ }
goto check_echo_high; //go to loop so that RenBED keeps checking echo pin for high state
+
}
echo_pulse_complete:
distance_m = (time * SPEED_OF_SOUND / 2); //convert the time reading to a distance. Divided by 2 as the sound waves must travel and return.
+ if(distance_m < 0.02){
+ goto trigger;
+ }
+
+ returnvalue:
return distance_m; //return the distance in metres
}
@@ -131,7 +146,10 @@
*
*Gets a right distance reading from the ultrasonic sensor
*
-*Returns: float(distance in metres). Returns 0 if no object within 4m.
+*Returns: float(distance in metres). Returns 4.0 if no reflection is received.
+*
+*WARNING: SPAGHETTI
+*
*/
float getDistance_r(void)
{
@@ -139,13 +157,18 @@
float distance_m = 0;
trigger:
+ timer.stop();
+ timer.reset();
//send trigger signal to ultrasonic
trigger = 1; //set trigger pin high
wait_us(10); //wait 10 us
trigger = 0; //set trigger pin low
+ timer.start(); //start the timer
check_echo_high:
if(echo_right == 1){ //echo pin goes high
+ timer.stop();
+ timer.reset();
timer.start(); //start the timer
check_echo_low:
if(echo_right == 0){ //echo pin goes low
@@ -156,13 +179,11 @@
}
else{
if(timer.read_ms() > 30 ){ //if the timer reaches 30ms then echo is stuck high, so reset the SR04
+
resetSR04();
- if(echo_right == 0){
- goto trigger; //when echo goes low again, reattempt measurement
- }
- else{
- wait_ms(1); //otherwise wait for low state
- }
+
+ distance_m = 4.0;
+ goto returnvalue;
}
else{
goto check_echo_low; //go to inner loop so that RenBED keeps checking echo pin for low state
@@ -170,21 +191,30 @@
}
}
else{
+ if(timer.read_ms() > 20){
+ goto trigger; //resend trigger if module unresponsive
+ }
goto check_echo_high; //go to loop so that RenBED keeps checking echo pin for high state
+
}
echo_pulse_complete:
distance_m = (time * SPEED_OF_SOUND / 2); //convert the time reading to a distance. Divided by 2 as the sound waves must travel and return.
+ if(distance_m < 0.02){
+ goto trigger;
+ }
+
+ returnvalue:
return distance_m; //return the distance in metres
}
void resetSR04(void)
{
- SR04_nReset = 0;
- forward(1);
+ SR04_nReset = 0; //turn off modules
+ wait_ms(10); //wait for a while
timer.stop();
timer.reset();
- SR04_nReset = 1;
-}
+ SR04_nReset = 1; //turn modules back on
+}
#endif // BUGGY_FUNCTIONS_C
\ No newline at end of file
diff -r fbceffb594b6 -r 80c2ef16a42f ultrasonic_buggy.h --- a/ultrasonic_buggy.h Thu Jul 14 12:58:48 2016 +0000 +++ b/ultrasonic_buggy.h Mon Jul 18 10:00:29 2016 +0000 @@ -24,18 +24,18 @@ #define LEFT_ECHO_PIN P1_20 #define RIGHT_ECHO_PIN P0_12 -#define SPEED_OF_SOUND 340 //speed of sound =~340m/s at standard conditions +#define SPEED_OF_SOUND 340 //speed of sound =~340m/s at standard conditions /* these are function prototypes that declare all the functions in the library.*/ -extern void forward(float); //Move the buggy forward for (float) seconds -extern void left(float); //Turn left for (float) seconds -extern void right(float); //Turn right for (float) seconds -extern void hold(float); //Hold the buggy in an idle state for (float) seconds -extern void stop(); //Stop all motors +extern void forward(float); //Move the buggy forward for (float) seconds +extern void left(float); //Turn left for (float) seconds +extern void right(float); //Turn right for (float) seconds +extern void hold(float); //Hold the buggy in an idle state for (float) seconds +extern void stop(); //Stop all motors -extern float getDistance_l(void); -extern float getDistance_r(void); -void resetSR04(void); +extern float getDistance_l(void); //get a distance reading in metres from the left sensor +extern float getDistance_r(void); //get a distance reading in metres from the right sensor +void resetSR04(void); //reset both ultrasonic modules #endif // BUGGY_FUNCTIONS_H \ No newline at end of file
