Driver for HC-SR04 connected to a Microbit

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?

UserRevisionLine numberNew 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