changed range conditions
Fork of HCSR04 by
HCSR04.cpp@0:5461d44a187c, 2013-11-24 (annotated)
- Committer:
- rabad1
- Date:
- Sun Nov 24 21:45:46 2013 +0000
- Revision:
- 0:5461d44a187c
- Child:
- 1:68ad9acbec81
initial release
Who changed what in which revision?
User | Revision | Line number | New 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; |
rabad1 | 0:5461d44a187c | 78 | } |
rabad1 | 0:5461d44a187c | 79 | |
rabad1 | 0:5461d44a187c | 80 | |
rabad1 | 0:5461d44a187c | 81 | // Name: ISR_echoRising |
rabad1 | 0:5461d44a187c | 82 | // Desc: ISR for rising edge of HCSR04 ECHO signal |
rabad1 | 0:5461d44a187c | 83 | // Inputs: none |
rabad1 | 0:5461d44a187c | 84 | // Outputs: none |
rabad1 | 0:5461d44a187c | 85 | // |
rabad1 | 0:5461d44a187c | 86 | void HCSR04::ISR_echoRising(void) |
rabad1 | 0:5461d44a187c | 87 | { |
rabad1 | 0:5461d44a187c | 88 | measTimeStart_us = echoTimer.read_us(); |
rabad1 | 0:5461d44a187c | 89 | } |
rabad1 | 0:5461d44a187c | 90 | |
rabad1 | 0:5461d44a187c | 91 | // Name: ISR_echoFalling |
rabad1 | 0:5461d44a187c | 92 | // Desc: ISR for falling edge of HCSR04 ECHO signal |
rabad1 | 0:5461d44a187c | 93 | // Inputs: none |
rabad1 | 0:5461d44a187c | 94 | // Outputs: none |
rabad1 | 0:5461d44a187c | 95 | // |
rabad1 | 0:5461d44a187c | 96 | void HCSR04::ISR_echoFalling(void) |
rabad1 | 0:5461d44a187c | 97 | { |
rabad1 | 0:5461d44a187c | 98 | measTimeStop_us = echoTimer.read_us(); |
rabad1 | 0:5461d44a187c | 99 | } |
rabad1 | 0:5461d44a187c | 100 |