Synchronous and asynchronous library for ultrasonic distance measurement for the device HC-SR04 with error handling functionality (out of range detection, HW error detection). Main features: "echo" puls duration measurement, distance measurement from "echo" pulse duration, detection of "echo" signal malfunction, timeout detection, detection of measured values outside reliable limits (min, max)

Dependents:   TEST_Dist_lib

Distance_HC_SR04.h

Committer:
dzoni
Date:
2015-12-22
Revision:
6:5beda7c318d5
Parent:
5:2f6992aad3a0
Child:
12:5bf5a7e62c5d

File content as of revision 6:5beda7c318d5:

#ifndef MBED_DISTANCE_HC_SR04_H
#define MBED_DISTANCE_HC_SR04_H
 
#include "mbed.h"
 
#define TIMEOUT_DELAY_US    (25000)                     // Timeout in microseconds
#define CALC_COEFF          (340.0f/(2.0f*1000.0f))     // Coefficient for distance calculation (distance = coeff * microseconds)
#define TICKS_RANGE_MAX     (15000)                     // Maximum reliable measurement - echo pulse width in microseconds
#define TICKS_RANGE_MIN     (150)                       // Minimum reliable measurement - echo pulse width in microseconds
#define TRIG_PULSE_US       (50)                        // Width of trigger pulse in microseconds

/** Definition of measurement FSM states.
 *
 *  IDLE:       No activity. Ready to start measurement with trigger(). This is state after reset().
 *  STARTED:    Measurement started and in progress. This is state after trigger().
 *  COMPLETED:  Measurement succesfuly completed by falling edge of echo signal. Measured values in range.
 *  TIMEOUT:    It was not possible to complete echo pulse width measurement in given time. Measurement cancelled.
 *  OUT_OF_RANGE_MIN: Measurement completed. Measured distance under reliable range.
 *  OUT_OF_RANGE_MAX: Measurement completed. Measured distance over reliable range.
 *  ERROR_SIG:        Faulty value of echo signal just after trigger pulse (echo != 0). Possible HW fault.
 */
typedef enum { IDLE, STARTED, COMPLETED, TIMEOUT, OUT_OF_RANGE_MIN, OUT_OF_RANGE_MAX, ERROR_SIG } Distance_HC_SR04_state;

/** Distance_HC_SR04 class.
 *
 *  Library for interfacing ultrasonic distance measurement device HC-SR04.
 *  Works in 2 basic modes:
 *    - blocking (via measureTicks() or measureDistance())
 *    - non-blocking asynchronous (via reset() + trigger() + getState() + getTicks() or getDistance())
 *
 *  Functionality includes detection of error in echo signal, detection of timeout and limits of reliable measurement.
 *
 */
class Distance_HC_SR04 {

public:
    Distance_HC_SR04(PinName trig, PinName echo, uint32_t tout_us = TIMEOUT_DELAY_US, float coeff = CALC_COEFF,
            uint32_t tmin_us = TICKS_RANGE_MIN, uint32_t tmax_us = TICKS_RANGE_MAX);
    void trigger(void);
    Distance_HC_SR04_state getState(void);
    void reset(void);
    uint32_t getTicks(void);
    float getDistance(void);
    float getCoeff(void);
    void setCoeff(float coeff);
    float measureDistance(void);
    uint32_t measureTicks(void);

private:
    void _tout(void);
    void _rising(void);
    void _falling(void);

    DigitalOut  _trig;
    InterruptIn _echo;
    uint32_t    _tout_us;
    float       _coeff;
    uint32_t    _tmin_us;
    uint32_t    _tmax_us;

    Timer       _timer;
    Timeout     _timeout;

    volatile Distance_HC_SR04_state _state;
    uint32_t                        _ticks_us;
};
 
#endif