mbed device driver for HC-SR04 ultrasonic range finder

Dependents:   TJPS UltraTest NavigationTest NavigationTest_ ... more

Fork of HCSR04 by Robert Abad

Committer:
srsmitherman
Date:
Mon Dec 02 23:14:26 2013 +0000
Revision:
1:68ad9acbec81
Parent:
0:5461d44a187c
Child:
2:3ebde19131af
Added a detach for the unused Ticker after trigger is set low.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rabad1 0:5461d44a187c 1 /* File: HCSR04.h
rabad1 0:5461d44a187c 2 * Author: Robert Abad Copyright (c) 2013
rabad1 0:5461d44a187c 3 *
rabad1 0:5461d44a187c 4 * Desc: driver for HCSR04 Ultrasonic Range Finder. See header file,
rabad1 0:5461d44a187c 5 * HCSR04.h, for more details.
rabad1 0:5461d44a187c 6 */
rabad1 0:5461d44a187c 7
rabad1 0:5461d44a187c 8 #include "mbed.h"
rabad1 0:5461d44a187c 9 #include "HCSR04.h"
rabad1 0:5461d44a187c 10
rabad1 0:5461d44a187c 11 #define SPEED_OF_SOUND (343.2f) // meters/sec
rabad1 0:5461d44a187c 12
rabad1 0:5461d44a187c 13 // HCSR04 TRIGGER pin
rabad1 0:5461d44a187c 14 #define SIGNAL_HIGH (1)
rabad1 0:5461d44a187c 15 #define SIGNAL_LOW (0)
rabad1 0:5461d44a187c 16
rabad1 0:5461d44a187c 17 #define TRIGGER_TIME (10) // microseconds
rabad1 0:5461d44a187c 18
rabad1 0:5461d44a187c 19
rabad1 0:5461d44a187c 20 // Name: HCSR04
rabad1 0:5461d44a187c 21 // Desc: HCSR04 constructor
rabad1 0:5461d44a187c 22 // Inputs: PinName - pin used for trigger signal
rabad1 0:5461d44a187c 23 // PinName - pin used for echo signal
rabad1 0:5461d44a187c 24 // Outputs: none
rabad1 0:5461d44a187c 25 //
rabad1 0:5461d44a187c 26 HCSR04::HCSR04( PinName pinTrigger, PinName pinEcho ) :
rabad1 0:5461d44a187c 27 trigger(pinTrigger),
rabad1 0:5461d44a187c 28 echo(pinEcho),
rabad1 0:5461d44a187c 29 measTimeStart_us(0),
rabad1 0:5461d44a187c 30 measTimeStop_us(0)
rabad1 0:5461d44a187c 31 {
rabad1 0:5461d44a187c 32 echo.rise( this, &HCSR04::ISR_echoRising );
rabad1 0:5461d44a187c 33 echo.fall( this, &HCSR04::ISR_echoFalling );
rabad1 0:5461d44a187c 34 echoTimer.start();
rabad1 0:5461d44a187c 35 }
rabad1 0:5461d44a187c 36
rabad1 0:5461d44a187c 37 // Name: startMeas
rabad1 0:5461d44a187c 38 // Desc: initiates range measurement driving the trigger signal HIGH then sets
rabad1 0:5461d44a187c 39 // a timer to keep trigger HIGH for the duration of TRIGGER_TIME
rabad1 0:5461d44a187c 40 // Inputs: none
rabad1 0:5461d44a187c 41 // Outputs: none
rabad1 0:5461d44a187c 42 //
rabad1 0:5461d44a187c 43 void HCSR04::startMeas(void)
rabad1 0:5461d44a187c 44 {
rabad1 0:5461d44a187c 45 trigger = SIGNAL_HIGH;
rabad1 0:5461d44a187c 46 echoTimer.reset();
rabad1 0:5461d44a187c 47 triggerTicker.attach_us(this, &HCSR04::triggerTicker_cb, TRIGGER_TIME);
rabad1 0:5461d44a187c 48 }
rabad1 0:5461d44a187c 49
rabad1 0:5461d44a187c 50 // Name: getMeas
rabad1 0:5461d44a187c 51 // Desc: returns range measurement in meters
rabad1 0:5461d44a187c 52 // Inputs: float & - reference to range measurement
rabad1 0:5461d44a187c 53 // Outputs: etHCSR04 - RANGE_MEAS_VALID or RANGE_MEAS_INVALID
rabad1 0:5461d44a187c 54 //
rabad1 0:5461d44a187c 55 etHCSR04_RANGE_STATUS HCSR04::getMeas(float &rRangeMeters)
rabad1 0:5461d44a187c 56 {
rabad1 0:5461d44a187c 57 unsigned long dTime_us;
rabad1 0:5461d44a187c 58 if ( !measTimeStart_us || !measTimeStop_us )
rabad1 0:5461d44a187c 59 {
rabad1 0:5461d44a187c 60 return RANGE_MEAS_INVALID;
rabad1 0:5461d44a187c 61 }
rabad1 0:5461d44a187c 62
rabad1 0:5461d44a187c 63 dTime_us = measTimeStop_us - measTimeStart_us;
rabad1 0:5461d44a187c 64 rRangeMeters = (float)dTime_us / 1000000. * SPEED_OF_SOUND / 2;
rabad1 0:5461d44a187c 65 measTimeStart_us = 0;
rabad1 0:5461d44a187c 66 measTimeStop_us = 0;
rabad1 0:5461d44a187c 67 return ( RANGE_MEAS_VALID );
rabad1 0:5461d44a187c 68 }
rabad1 0:5461d44a187c 69
rabad1 0:5461d44a187c 70 // Name: triggerTicker_cb
rabad1 0:5461d44a187c 71 // Desc: Timer ticker callback function used to drive trigger signal LOW
rabad1 0:5461d44a187c 72 // Inputs: none
rabad1 0:5461d44a187c 73 // Outputs: none
rabad1 0:5461d44a187c 74 //
rabad1 0:5461d44a187c 75 void HCSR04::triggerTicker_cb(void)
rabad1 0:5461d44a187c 76 {
rabad1 0:5461d44a187c 77 trigger = SIGNAL_LOW;
srsmitherman 1:68ad9acbec81 78 triggerTicker.detach();
srsmitherman 1:68ad9acbec81 79
rabad1 0:5461d44a187c 80 }
rabad1 0:5461d44a187c 81
rabad1 0:5461d44a187c 82
rabad1 0:5461d44a187c 83 // Name: ISR_echoRising
rabad1 0:5461d44a187c 84 // Desc: ISR for rising edge of HCSR04 ECHO signal
rabad1 0:5461d44a187c 85 // Inputs: none
rabad1 0:5461d44a187c 86 // Outputs: none
rabad1 0:5461d44a187c 87 //
rabad1 0:5461d44a187c 88 void HCSR04::ISR_echoRising(void)
rabad1 0:5461d44a187c 89 {
rabad1 0:5461d44a187c 90 measTimeStart_us = echoTimer.read_us();
rabad1 0:5461d44a187c 91 }
rabad1 0:5461d44a187c 92
rabad1 0:5461d44a187c 93 // Name: ISR_echoFalling
rabad1 0:5461d44a187c 94 // Desc: ISR for falling edge of HCSR04 ECHO signal
rabad1 0:5461d44a187c 95 // Inputs: none
rabad1 0:5461d44a187c 96 // Outputs: none
rabad1 0:5461d44a187c 97 //
rabad1 0:5461d44a187c 98 void HCSR04::ISR_echoFalling(void)
rabad1 0:5461d44a187c 99 {
rabad1 0:5461d44a187c 100 measTimeStop_us = echoTimer.read_us();
rabad1 0:5461d44a187c 101 }
rabad1 0:5461d44a187c 102