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
ultrasonic_buggy.cpp
- Committer:
- RenBuggy
- Date:
- 2016-07-14
- Revision:
- 0:fbceffb594b6
- Child:
- 1:80c2ef16a42f
File content as of revision 0:fbceffb594b6:
/*********************************************************
*buggy_functions.cpp *
*Author: Elijah Orr & Dan Argust *
* *
*A library of functions that can be used to control the *
*RenBuggy. *
*********************************************************/
#ifndef BUGGY_FUNCTIONS_C
#define BUGGY_FUNCTIONS_C
/* necessary includes */
#include "mbed.h"
#include "ultrasonic_buggy.h"
// PwmOut is used to control the motors
DigitalOut Lmotor(LEFT_MOTOR_PIN, 0);
DigitalOut Rmotor(RIGHT_MOTOR_PIN, 0);
// 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);
DigitalIn echo_left(LEFT_ECHO_PIN, PullNone);
DigitalIn echo_right(RIGHT_ECHO_PIN, PullNone);
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;
/* Functions (listed below) contain the code that runs the buggy.
These functions can be used in the main.cpp file */
extern void hold(float time) //waits for (time) seconds
{
for (float i = time;i>0;i-=0.01){ //For every hundreth of a second, display the time remaining
wait(0.01);
}
}
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
hold(time); //wait for (time) seconds while the motors are on
stop(); //stops the motors
}
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
hold(time); //waits for (time) seconds
stop(); //stops the motors
}
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
hold(time); //waits for (time) seconds
stop(); //stops the motors
}
extern void stop() //stops the motors
{
Lmotor = Rmotor = 0; //set the speed of each motor to 0
}
/*
*Function: getDistance_l
*
*Gets a left distance reading from the ultrasonic sensor
*
*Returns: float(distance in metres). Returns 0 if no object within 4m.
*
*WARNING: SPAGHETTI
*/
extern float getDistance_l(void)
{
float time = 0;
float distance_m = 0;
trigger:
//send trigger signal to ultrasonic
trigger = 1; //set trigger pin high
wait_us(10); //wait 10 us
trigger = 0; //set trigger pin low
check_echo_high:
if(echo_left == 1){ //echo pin goes high
timer.start(); //start the timer
check_echo_low:
if(echo_left == 0){ //echo pin goes low
timer.stop(); //stop the timer
time = timer.read(); //read the timer value
timer.reset(); //reset the timer
goto echo_pulse_complete; //go to label echo_pulse_complete
}
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
}
}
else{
goto check_echo_low; //go to inner loop so that RenBED keeps checking echo pin for low state
}
}
}
else{
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.
return distance_m; //return the distance in metres
}
/*
*Function: getDistance_r
*
*Gets a right distance reading from the ultrasonic sensor
*
*Returns: float(distance in metres). Returns 0 if no object within 4m.
*/
float getDistance_r(void)
{
float time = 0;
float distance_m = 0;
trigger:
//send trigger signal to ultrasonic
trigger = 1; //set trigger pin high
wait_us(10); //wait 10 us
trigger = 0; //set trigger pin low
check_echo_high:
if(echo_right == 1){ //echo pin goes high
timer.start(); //start the timer
check_echo_low:
if(echo_right == 0){ //echo pin goes low
timer.stop(); //stop the timer
time = timer.read(); //read the timer value
timer.reset(); //reset the timer
goto echo_pulse_complete; //go to label echo_pulse_complete
}
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
}
}
else{
goto check_echo_low; //go to inner loop so that RenBED keeps checking echo pin for low state
}
}
}
else{
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.
return distance_m; //return the distance in metres
}
void resetSR04(void)
{
SR04_nReset = 0;
forward(1);
timer.stop();
timer.reset();
SR04_nReset = 1;
}
#endif // BUGGY_FUNCTIONS_C
