Driver for HC-SR04 connected to a Microbit
MicrobitUltrasound.h@18:c425443e177c, 2016-10-04 (annotated)
- Committer:
- isaeldiaz@developer.mbed.org
- Date:
- Tue Oct 04 21:21:19 2016 +0200
- Revision:
- 18:c425443e177c
- Parent:
- 17:a82fb8fc4ca3
small adjustments to library, the echo function does not attach to the InterruptIn class, not sure why
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
isaeldiaz@developer.mbed.org | 1:17a477201275 | 1 | /* |
isaeldiaz@developer.mbed.org | 1:17a477201275 | 2 | The MIT License (MIT) |
isaeldiaz@developer.mbed.org | 1:17a477201275 | 3 | |
isaeldiaz@developer.mbed.org | 1:17a477201275 | 4 | Copyright (c) 2016 British Broadcasting Corporation. |
isaeldiaz@developer.mbed.org | 1:17a477201275 | 5 | This software is provided by Lancaster University by arrangement with the BBC. |
isaeldiaz@developer.mbed.org | 1:17a477201275 | 6 | |
isaeldiaz@developer.mbed.org | 1:17a477201275 | 7 | Permission is hereby granted, free of charge, to any person obtaining a |
isaeldiaz@developer.mbed.org | 1:17a477201275 | 8 | copy of this software and associated documentation files (the "Software"), |
isaeldiaz@developer.mbed.org | 1:17a477201275 | 9 | to deal in the Software without restriction, including without limitation |
isaeldiaz@developer.mbed.org | 1:17a477201275 | 10 | the rights to use, copy, modify, merge, publish, distribute, sublicense, |
isaeldiaz@developer.mbed.org | 1:17a477201275 | 11 | and/or sell copies of the Software, and to permit persons to whom the |
isaeldiaz@developer.mbed.org | 1:17a477201275 | 12 | Software is furnished to do so, subject to the following conditions: |
isaeldiaz@developer.mbed.org | 1:17a477201275 | 13 | |
isaeldiaz@developer.mbed.org | 1:17a477201275 | 14 | The above copyright notice and this permission notice shall be included in |
isaeldiaz@developer.mbed.org | 1:17a477201275 | 15 | all copies or substantial portions of the Software. |
isaeldiaz@developer.mbed.org | 1:17a477201275 | 16 | |
isaeldiaz@developer.mbed.org | 1:17a477201275 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
isaeldiaz@developer.mbed.org | 1:17a477201275 | 18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
isaeldiaz@developer.mbed.org | 1:17a477201275 | 19 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
isaeldiaz@developer.mbed.org | 1:17a477201275 | 20 | THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
isaeldiaz@developer.mbed.org | 1:17a477201275 | 21 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
isaeldiaz@developer.mbed.org | 1:17a477201275 | 22 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
isaeldiaz@developer.mbed.org | 1:17a477201275 | 23 | DEALINGS IN THE SOFTWARE. |
isaeldiaz@developer.mbed.org | 1:17a477201275 | 24 | */ |
isaeldiaz@developer.mbed.org | 1:17a477201275 | 25 | |
isaeldiaz@developer.mbed.org | 1:17a477201275 | 26 | #ifndef MICROBIT_ULTRASOUND_H |
isaeldiaz@developer.mbed.org | 1:17a477201275 | 27 | #define MICROBIT_ULTRASOUND_H |
isaeldiaz@developer.mbed.org | 1:17a477201275 | 28 | |
isaeldiaz@developer.mbed.org | 2:826744569821 | 29 | #include "mbed.h" |
isaeldiaz@developer.mbed.org | 2:826744569821 | 30 | #include "MicroBitComponent.h" |
isaeldiaz@developer.mbed.org | 4:c67cff7b9733 | 31 | #include "TimedInterruptIn.h" |
isaeldiaz@developer.mbed.org | 4:c67cff7b9733 | 32 | // I need to include MicroBitPin.h exclusively to import all pin names. |
isaeldiaz@developer.mbed.org | 2:826744569821 | 33 | #include "MicroBitPin.h" |
isaeldiaz@developer.mbed.org | 2:826744569821 | 34 | |
isaeldiaz@developer.mbed.org | 2:826744569821 | 35 | /* |
isaeldiaz@developer.mbed.org | 2:826744569821 | 36 | * Message Bus ID, assuming this value is not taken |
isaeldiaz@developer.mbed.org | 2:826744569821 | 37 | */ |
isaeldiaz@developer.mbed.org | 2:826744569821 | 38 | #define MICROBIT_ID_ULTRASOUND 50 |
isaeldiaz@developer.mbed.org | 2:826744569821 | 39 | |
isaeldiaz@developer.mbed.org | 2:826744569821 | 40 | /* |
isaeldiaz@developer.mbed.org | 2:826744569821 | 41 | * Configuration constants |
isaeldiaz@developer.mbed.org | 2:826744569821 | 42 | */ |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 43 | #define MICROBIT_ULTRASOUND_TRIGGER_DURATION_DEFAULT_US 12 |
isaeldiaz@developer.mbed.org | 3:8a5d2e5f64fb | 44 | #define MICROBIT_ULTRASOUND_IDLE_DURATION_DEFAULT_US 2 |
isaeldiaz@developer.mbed.org | 17:a82fb8fc4ca3 | 45 | #define MICROBIT_ULTRASOUND_PERIOD_DEFAULT_MS 600 |
isaeldiaz@developer.mbed.org | 3:8a5d2e5f64fb | 46 | #define TRIGGER_ACTIVE_VALUE 1 |
isaeldiaz@developer.mbed.org | 4:c67cff7b9733 | 47 | #define MICROBIT_ULTRASOUND_PULLMODE_DEFAULT PullUp |
isaeldiaz@developer.mbed.org | 2:826744569821 | 48 | |
isaeldiaz@developer.mbed.org | 2:826744569821 | 49 | /* |
isaeldiaz@developer.mbed.org | 2:826744569821 | 50 | * Ultrasound events |
isaeldiaz@developer.mbed.org | 2:826744569821 | 51 | */ |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 52 | #define MICROBIT_ULTRASOUND_EVT_TRIGGER 1 |
isaeldiaz@developer.mbed.org | 4:c67cff7b9733 | 53 | #define MICROBIT_ULTRASOUND_EVT_ECHO_RISE 2 |
isaeldiaz@developer.mbed.org | 4:c67cff7b9733 | 54 | #define MICROBIT_ULTRASOUND_EVT_ECHO_FALL 3 |
isaeldiaz@developer.mbed.org | 4:c67cff7b9733 | 55 | #define MICROBIT_ULTRASOUND_EVT_ECHO_EDGE 4 |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 56 | #define MICROBIT_ULTRASOUND_EVT_ECHO_PULSE_HI 5 |
isaeldiaz@developer.mbed.org | 8:12e6c5d3dc5f | 57 | #define MICROBIT_ULTRASOUND_EVT_ECHO_PULSE_LO 6 |
isaeldiaz@developer.mbed.org | 17:a82fb8fc4ca3 | 58 | #define MICROBIT_ULTRASOUND_EVT_TEST 7 |
isaeldiaz@developer.mbed.org | 4:c67cff7b9733 | 59 | |
isaeldiaz@developer.mbed.org | 4:c67cff7b9733 | 60 | /* |
isaeldiaz@developer.mbed.org | 4:c67cff7b9733 | 61 | * Component's status flags |
isaeldiaz@developer.mbed.org | 4:c67cff7b9733 | 62 | */ |
isaeldiaz@developer.mbed.org | 8:12e6c5d3dc5f | 63 | #define ULTRASOUND_STATUS_ADDED_TO_IDLE 0x02 |
isaeldiaz@developer.mbed.org | 4:c67cff7b9733 | 64 | #define ULTRASOUND_STATUS_EVENTON_RISE 0x04 |
isaeldiaz@developer.mbed.org | 4:c67cff7b9733 | 65 | #define ULTRASOUND_STATUS_EVENTON_FALL 0x08 |
isaeldiaz@developer.mbed.org | 4:c67cff7b9733 | 66 | #define ULTRASOUND_STATUS_EVENTON_PULSE 0x10 |
isaeldiaz@developer.mbed.org | 8:12e6c5d3dc5f | 67 | #define ULTRASOUND_STATUS_EVENTON_TRIGGER 0x20 |
isaeldiaz@developer.mbed.org | 14:3a9232725ff8 | 68 | #define ULTRASOUND_STATUS_EVENTON_EDGE 0x40 |
isaeldiaz@developer.mbed.org | 1:17a477201275 | 69 | |
isaeldiaz@developer.mbed.org | 1:17a477201275 | 70 | |
isaeldiaz@developer.mbed.org | 2:826744569821 | 71 | /** |
isaeldiaz@developer.mbed.org | 2:826744569821 | 72 | * Class definition for MicroBit Ultrasonic distance sensor |
isaeldiaz@developer.mbed.org | 2:826744569821 | 73 | * |
isaeldiaz@developer.mbed.org | 2:826744569821 | 74 | * Infers and stores the distance reported by ultrasonic sensor attached |
isaeldiaz@developer.mbed.org | 15:36c4434352ca | 75 | * to the micro:bit. The library has been tested with sensor HC-SR04 |
isaeldiaz@developer.mbed.org | 2:826744569821 | 76 | * |
isaeldiaz@developer.mbed.org | 2:826744569821 | 77 | */ |
isaeldiaz@developer.mbed.org | 7:13ba98b16e74 | 78 | class MicrobitUltrasound : public MicroBitComponent |
isaeldiaz@developer.mbed.org | 1:17a477201275 | 79 | { |
isaeldiaz@developer.mbed.org | 8:12e6c5d3dc5f | 80 | unsigned long sampleTime; |
isaeldiaz@developer.mbed.org | 8:12e6c5d3dc5f | 81 | uint16_t triggerPeriod_ms; |
isaeldiaz@developer.mbed.org | 8:12e6c5d3dc5f | 82 | uint16_t triggerDuration_us; |
isaeldiaz@developer.mbed.org | 8:12e6c5d3dc5f | 83 | bool triggerActiveValue; |
isaeldiaz@developer.mbed.org | 8:12e6c5d3dc5f | 84 | |
isaeldiaz@developer.mbed.org | 8:12e6c5d3dc5f | 85 | //Pins |
isaeldiaz@developer.mbed.org | 4:c67cff7b9733 | 86 | DigitalOut trigger; |
isaeldiaz@developer.mbed.org | 4:c67cff7b9733 | 87 | TimedInterruptIn echo; |
isaeldiaz@developer.mbed.org | 1:17a477201275 | 88 | |
isaeldiaz@developer.mbed.org | 1:17a477201275 | 89 | public: |
isaeldiaz@developer.mbed.org | 1:17a477201275 | 90 | |
isaeldiaz@developer.mbed.org | 15:36c4434352ca | 91 | /** |
isaeldiaz@developer.mbed.org | 15:36c4434352ca | 92 | * Constructor. |
isaeldiaz@developer.mbed.org | 15:36c4434352ca | 93 | * Create new MicrobitUltrasound that reports distance to closest object |
isaeldiaz@developer.mbed.org | 15:36c4434352ca | 94 | * |
isaeldiaz@developer.mbed.org | 15:36c4434352ca | 95 | * @param triggerPinName Name of the MicroBitPin to be used as trigger. |
isaeldiaz@developer.mbed.org | 15:36c4434352ca | 96 | * |
isaeldiaz@developer.mbed.org | 15:36c4434352ca | 97 | * @param echoPinName Name of the MicroBitPin to be used as response from sensor. |
isaeldiaz@developer.mbed.org | 15:36c4434352ca | 98 | * |
isaeldiaz@developer.mbed.org | 15:36c4434352ca | 99 | * @code |
isaeldiaz@developer.mbed.org | 15:36c4434352ca | 100 | * MicrobitUltrasound uSoundSensor(MICROBIT_PIN_P1, 100, true, MICROBIT_PIN_P2, PullUp); |
isaeldiaz@developer.mbed.org | 15:36c4434352ca | 101 | * @endcode |
isaeldiaz@developer.mbed.org | 15:36c4434352ca | 102 | */ |
isaeldiaz@developer.mbed.org | 18:c425443e177c | 103 | MicrobitUltrasound(PinName triggerPinName, int _triggerPeriod_ms, bool _triggerActiveValue, |
isaeldiaz@developer.mbed.org | 16:491ac8d7685f | 104 | PinName echoPinName, PinMode echoPinMode, uint16_t id = MICROBIT_ID_ULTRASOUND); |
isaeldiaz@developer.mbed.org | 1:17a477201275 | 105 | |
isaeldiaz@developer.mbed.org | 2:826744569821 | 106 | /** |
isaeldiaz@developer.mbed.org | 2:826744569821 | 107 | * Constructor. |
isaeldiaz@developer.mbed.org | 7:13ba98b16e74 | 108 | * Create new MicrobitUltrasound that reports distance to closest object |
isaeldiaz@developer.mbed.org | 2:826744569821 | 109 | * |
isaeldiaz@developer.mbed.org | 15:36c4434352ca | 110 | * @param triggerPinName Name of the MicroBitPin to be used as trigger. |
isaeldiaz@developer.mbed.org | 2:826744569821 | 111 | * |
isaeldiaz@developer.mbed.org | 15:36c4434352ca | 112 | * @param echoPinName Name of the MicroBitPin to be used as response from sensor. |
isaeldiaz@developer.mbed.org | 2:826744569821 | 113 | * |
isaeldiaz@developer.mbed.org | 2:826744569821 | 114 | * @code |
isaeldiaz@developer.mbed.org | 15:36c4434352ca | 115 | * MicrobitUltrasound uSoundSensor(MICROBIT_PIN_P1, MICROBIT_PIN_P2); |
isaeldiaz@developer.mbed.org | 2:826744569821 | 116 | * @endcode |
isaeldiaz@developer.mbed.org | 2:826744569821 | 117 | */ |
isaeldiaz@developer.mbed.org | 7:13ba98b16e74 | 118 | MicrobitUltrasound(PinName triggerPinName, PinName echoPinName, uint16_t id = MICROBIT_ID_ULTRASOUND); |
isaeldiaz@developer.mbed.org | 2:826744569821 | 119 | |
isaeldiaz@developer.mbed.org | 2:826744569821 | 120 | /** |
isaeldiaz@developer.mbed.org | 9:d153bcba081c | 121 | * Destructor for MicrobitUltrasound, where we deregister this instance from the array of fiber components. |
isaeldiaz@developer.mbed.org | 9:d153bcba081c | 122 | */ |
isaeldiaz@developer.mbed.org | 9:d153bcba081c | 123 | ~MicrobitUltrasound(); |
isaeldiaz@developer.mbed.org | 9:d153bcba081c | 124 | |
isaeldiaz@developer.mbed.org | 9:d153bcba081c | 125 | /** |
isaeldiaz@developer.mbed.org | 18:c425443e177c | 126 | * Set Echo PinMode |
isaeldiaz@developer.mbed.org | 18:c425443e177c | 127 | */ |
isaeldiaz@developer.mbed.org | 18:c425443e177c | 128 | void setEchoPinMode(PinMode echoPinMode); |
isaeldiaz@developer.mbed.org | 18:c425443e177c | 129 | |
isaeldiaz@developer.mbed.org | 18:c425443e177c | 130 | /** |
isaeldiaz@developer.mbed.org | 2:826744569821 | 131 | * Set the sample rate at which the micro:bit triggers sensor (in ms). |
isaeldiaz@developer.mbed.org | 2:826744569821 | 132 | * |
isaeldiaz@developer.mbed.org | 2:826744569821 | 133 | * The default sample period is 1 second. |
isaeldiaz@developer.mbed.org | 2:826744569821 | 134 | * |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 135 | * @param period the requested time between triggers, in milliseconds. |
isaeldiaz@developer.mbed.org | 2:826744569821 | 136 | * |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 137 | * @note the micro:bit sends triggers in the background. |
isaeldiaz@developer.mbed.org | 2:826744569821 | 138 | */ |
isaeldiaz@developer.mbed.org | 2:826744569821 | 139 | void setPeriod(int period_ms); |
isaeldiaz@developer.mbed.org | 2:826744569821 | 140 | |
isaeldiaz@developer.mbed.org | 2:826744569821 | 141 | /** |
isaeldiaz@developer.mbed.org | 2:826744569821 | 142 | * Get the sample rate at which the micro:bit triggers sensor (in ms). |
isaeldiaz@developer.mbed.org | 2:826744569821 | 143 | * |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 144 | * @return period the requested time between triggers, in milliseconds. |
isaeldiaz@developer.mbed.org | 2:826744569821 | 145 | */ |
isaeldiaz@developer.mbed.org | 15:36c4434352ca | 146 | int getPeriod(); |
isaeldiaz@developer.mbed.org | 2:826744569821 | 147 | |
isaeldiaz@developer.mbed.org | 2:826744569821 | 148 | |
isaeldiaz@developer.mbed.org | 2:826744569821 | 149 | /** |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 150 | * Start periodic trigger to sensor. This call also will add the class |
isaeldiaz@developer.mbed.org | 2:826744569821 | 151 | * to fiber components for periodic callbacks. |
isaeldiaz@developer.mbed.org | 2:826744569821 | 152 | * |
isaeldiaz@developer.mbed.org | 2:826744569821 | 153 | * @return MICROBIT_OK on success. |
isaeldiaz@developer.mbed.org | 2:826744569821 | 154 | */ |
isaeldiaz@developer.mbed.org | 2:826744569821 | 155 | int start(void); |
isaeldiaz@developer.mbed.org | 2:826744569821 | 156 | |
isaeldiaz@developer.mbed.org | 2:826744569821 | 157 | /** |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 158 | * Stop periodic trigger to sensor. |
isaeldiaz@developer.mbed.org | 2:826744569821 | 159 | * |
isaeldiaz@developer.mbed.org | 2:826744569821 | 160 | * @return MICROBIT_OK on success. |
isaeldiaz@developer.mbed.org | 2:826744569821 | 161 | */ |
isaeldiaz@developer.mbed.org | 2:826744569821 | 162 | int stop(void); |
isaeldiaz@developer.mbed.org | 2:826744569821 | 163 | |
isaeldiaz@developer.mbed.org | 2:826744569821 | 164 | /** |
isaeldiaz@developer.mbed.org | 15:36c4434352ca | 165 | * Enables a particular event for the MicrobitUltrasound |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 166 | * |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 167 | * @return 1 if we're due to take a new trigger, 0 otherwise. |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 168 | */ |
isaeldiaz@developer.mbed.org | 8:12e6c5d3dc5f | 169 | int eventOn(int eventType); |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 170 | |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 171 | /** |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 172 | * Send trigger to start measurement in sensor |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 173 | * |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 174 | */ |
isaeldiaz@developer.mbed.org | 14:3a9232725ff8 | 175 | void fireTrigger(void); |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 176 | |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 177 | /** |
isaeldiaz@developer.mbed.org | 2:826744569821 | 178 | * Periodic callback from MicroBit idle thread. |
isaeldiaz@developer.mbed.org | 2:826744569821 | 179 | */ |
isaeldiaz@developer.mbed.org | 2:826744569821 | 180 | virtual void idleTick(); |
isaeldiaz@developer.mbed.org | 2:826744569821 | 181 | |
isaeldiaz@developer.mbed.org | 2:826744569821 | 182 | private: |
isaeldiaz@developer.mbed.org | 2:826744569821 | 183 | |
isaeldiaz@developer.mbed.org | 2:826744569821 | 184 | /** |
isaeldiaz@developer.mbed.org | 2:826744569821 | 185 | * Determines if we're due to take another reading |
isaeldiaz@developer.mbed.org | 2:826744569821 | 186 | * |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 187 | * @return 1 if we're due to take a trigger, 0 otherwise. |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 188 | */ |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 189 | int isTriggerNeeded(); |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 190 | |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 191 | /** |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 192 | * Interrupt handler for when an rise interrupt is triggered. |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 193 | */ |
isaeldiaz@developer.mbed.org | 8:12e6c5d3dc5f | 194 | void onEchoRise(); |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 195 | |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 196 | /** |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 197 | * Interrupt handler for when an fall interrupt is triggered. |
isaeldiaz@developer.mbed.org | 2:826744569821 | 198 | */ |
isaeldiaz@developer.mbed.org | 8:12e6c5d3dc5f | 199 | void onEchoFall(); |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 200 | |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 201 | /** |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 202 | * This member function manages the calculation of the timestamp of a pulse detected |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 203 | * on the echo pin. |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 204 | * |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 205 | * @param eventValue the event value to distribute onto the message bus. |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 206 | */ |
isaeldiaz@developer.mbed.org | 8:12e6c5d3dc5f | 207 | void pulseWidthEvent(int eventValue); |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 208 | |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 209 | |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 210 | /** |
isaeldiaz@developer.mbed.org | 15:36c4434352ca | 211 | * Update Sensor measurement |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 212 | * |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 213 | * @return MICROBIT_OK on success. |
isaeldiaz@developer.mbed.org | 6:f3780669258d | 214 | */ |
isaeldiaz | 10:9008f714df44 | 215 | int updateSample(void); |
isaeldiaz@developer.mbed.org | 2:826744569821 | 216 | }; |
isaeldiaz@developer.mbed.org | 2:826744569821 | 217 | |
isaeldiaz@developer.mbed.org | 2:826744569821 | 218 | #endif |