Development and testing of ultrasonic distance measurement library for device HC-SR04.

Dependencies:   TextLCD_improved mbed Distance_HC_SR04

Committer:
dzoni
Date:
Sun Dec 20 21:24:45 2015 +0000
Branch:
CLASS_IMPLEMENTATION
Revision:
2:aba8d0d53190
Parent:
0:6fd0fbcfc7e1
Child:
3:cb5931861f4e
Class Partly implemented. In progress.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dzoni 0:6fd0fbcfc7e1 1 /*
dzoni 0:6fd0fbcfc7e1 2 * TSK_MAIN.CPP
dzoni 0:6fd0fbcfc7e1 3 */
dzoni 0:6fd0fbcfc7e1 4 #include "mbed.h"
dzoni 0:6fd0fbcfc7e1 5
dzoni 0:6fd0fbcfc7e1 6 #include "TextLCD.h"
dzoni 0:6fd0fbcfc7e1 7
dzoni 0:6fd0fbcfc7e1 8 #define TIMEOUT_DELAY_US (25000)
dzoni 0:6fd0fbcfc7e1 9 #define CALC_COEFF (1000.0f*340.0f/2)
dzoni 0:6fd0fbcfc7e1 10 #define TICKS_RANGE_MAX (15000)
dzoni 0:6fd0fbcfc7e1 11 #define TICKS_RANGE_MIN (150)
dzoni 2:aba8d0d53190 12 #define TRIG_PULSE_US (500)
dzoni 2:aba8d0d53190 13
dzoni 2:aba8d0d53190 14
dzoni 2:aba8d0d53190 15 typedef enum { IDLE, STARTED, COMPLETED, TIMEOUT, OUT_OF_RANGE_MIN, OUT_OF_RANGE_MAX, ERROR_SIG } Distance_HC_SR04_state;
dzoni 2:aba8d0d53190 16
dzoni 0:6fd0fbcfc7e1 17
dzoni 0:6fd0fbcfc7e1 18 TextLCD lcd(PA_8, PA_7, PA_9, PA_1, PB_5, PA_10, TextLCD::LCD16x2);
dzoni 0:6fd0fbcfc7e1 19
dzoni 0:6fd0fbcfc7e1 20 static DigitalOut trigDist(PB_9);
dzoni 0:6fd0fbcfc7e1 21 static DigitalIn echoDist(PA_6);
dzoni 0:6fd0fbcfc7e1 22
dzoni 0:6fd0fbcfc7e1 23 static uint32_t timer_ticks;
dzoni 0:6fd0fbcfc7e1 24 static float time_float;
dzoni 0:6fd0fbcfc7e1 25 static uint32_t timer_ticks_min;
dzoni 0:6fd0fbcfc7e1 26
dzoni 0:6fd0fbcfc7e1 27 static Timer timer;
dzoni 0:6fd0fbcfc7e1 28
dzoni 0:6fd0fbcfc7e1 29 static Timeout timeout;
dzoni 0:6fd0fbcfc7e1 30
dzoni 2:aba8d0d53190 31 static volatile Distance_HC_SR04_state state;
dzoni 0:6fd0fbcfc7e1 32
dzoni 0:6fd0fbcfc7e1 33 void tout(void) {
dzoni 0:6fd0fbcfc7e1 34 if (state == STARTED)
dzoni 0:6fd0fbcfc7e1 35 state = TIMEOUT;
dzoni 0:6fd0fbcfc7e1 36 }
dzoni 0:6fd0fbcfc7e1 37
dzoni 2:aba8d0d53190 38
dzoni 2:aba8d0d53190 39 class Distance_HC_SR04 {
dzoni 2:aba8d0d53190 40 public:
dzoni 2:aba8d0d53190 41 Distance_HC_SR04(PinName trig, PinName echo, uint32_t tout_us = TIMEOUT_DELAY_US, float coeff = CALC_COEFF) : _trig(trig), _echo(echo), _tout_us(tout_us), _coeff(coeff) {
dzoni 2:aba8d0d53190 42 _trig = 0;
dzoni 2:aba8d0d53190 43 _state = IDLE;
dzoni 2:aba8d0d53190 44 }
dzoni 2:aba8d0d53190 45
dzoni 2:aba8d0d53190 46 void trigger(void) {
dzoni 2:aba8d0d53190 47 if (_state == IDLE && _echo == 0) {
dzoni 2:aba8d0d53190 48 _timeout.detach();
dzoni 2:aba8d0d53190 49 _timer.stop();
dzoni 2:aba8d0d53190 50 _timer.reset();
dzoni 2:aba8d0d53190 51
dzoni 2:aba8d0d53190 52 _trig = 1;
dzoni 2:aba8d0d53190 53 wait_us(TRIG_PULSE_US);
dzoni 2:aba8d0d53190 54 _trig = 0;
dzoni 2:aba8d0d53190 55
dzoni 2:aba8d0d53190 56 if (_echo == 0) {
dzoni 2:aba8d0d53190 57 _state = STARTED;
dzoni 2:aba8d0d53190 58 timeout.attach_us(this, &Distance_HC_SR04::_tout, TIMEOUT_DELAY_US);
dzoni 2:aba8d0d53190 59
dzoni 2:aba8d0d53190 60 _echo.rise(this, &Distance_HC_SR04::_rising);
dzoni 2:aba8d0d53190 61 _echo.fall(this, &Distance_HC_SR04::_falling);
dzoni 2:aba8d0d53190 62
dzoni 2:aba8d0d53190 63 return;
dzoni 2:aba8d0d53190 64 }
dzoni 2:aba8d0d53190 65 }
dzoni 2:aba8d0d53190 66
dzoni 2:aba8d0d53190 67 if (_state == IDLE) {
dzoni 2:aba8d0d53190 68 _state = ERROR_SIG;
dzoni 2:aba8d0d53190 69 _ticks_us = 0;
dzoni 2:aba8d0d53190 70 }
dzoni 2:aba8d0d53190 71
dzoni 2:aba8d0d53190 72 return;
dzoni 2:aba8d0d53190 73 }
dzoni 2:aba8d0d53190 74
dzoni 2:aba8d0d53190 75 Distance_HC_SR04_state getState(void) {
dzoni 2:aba8d0d53190 76 return _state;
dzoni 2:aba8d0d53190 77 }
dzoni 2:aba8d0d53190 78
dzoni 2:aba8d0d53190 79 void reset(void) {
dzoni 2:aba8d0d53190 80 _state = IDLE;
dzoni 2:aba8d0d53190 81 _echo.rise(NULL);
dzoni 2:aba8d0d53190 82 _echo.fall(NULL);
dzoni 2:aba8d0d53190 83 _timeout.detach();
dzoni 2:aba8d0d53190 84 _timer.stop();
dzoni 2:aba8d0d53190 85 _timer.reset();
dzoni 2:aba8d0d53190 86 }
dzoni 2:aba8d0d53190 87
dzoni 2:aba8d0d53190 88 uint32_t getTicks(void) {
dzoni 2:aba8d0d53190 89 return _ticks_us;
dzoni 2:aba8d0d53190 90 }
dzoni 2:aba8d0d53190 91
dzoni 2:aba8d0d53190 92 float getDistance(void) {
dzoni 2:aba8d0d53190 93 return _ticks_us/_coeff;
dzoni 2:aba8d0d53190 94 }
dzoni 2:aba8d0d53190 95
dzoni 2:aba8d0d53190 96 float getCoeff(void) {
dzoni 2:aba8d0d53190 97 return _coeff;
dzoni 2:aba8d0d53190 98 }
dzoni 2:aba8d0d53190 99
dzoni 2:aba8d0d53190 100 void setCoeff(float coeff) {
dzoni 2:aba8d0d53190 101 _coeff = coeff;
dzoni 2:aba8d0d53190 102 }
dzoni 2:aba8d0d53190 103
dzoni 2:aba8d0d53190 104 float measureDistance(void) {
dzoni 2:aba8d0d53190 105 return measureTicks()/_coeff;
dzoni 2:aba8d0d53190 106 }
dzoni 2:aba8d0d53190 107
dzoni 2:aba8d0d53190 108 uint32_t measureTicks(void) {
dzoni 2:aba8d0d53190 109 reset();
dzoni 2:aba8d0d53190 110 trigger();
dzoni 2:aba8d0d53190 111
dzoni 2:aba8d0d53190 112 while (_state == STARTED)
dzoni 2:aba8d0d53190 113 ;
dzoni 2:aba8d0d53190 114
dzoni 2:aba8d0d53190 115 switch (_state) {
dzoni 2:aba8d0d53190 116 case COMPLETED:
dzoni 2:aba8d0d53190 117 break;
dzoni 2:aba8d0d53190 118 default:
dzoni 2:aba8d0d53190 119 break;
dzoni 2:aba8d0d53190 120 }
dzoni 2:aba8d0d53190 121
dzoni 2:aba8d0d53190 122 return _ticks_us;
dzoni 2:aba8d0d53190 123 }
dzoni 2:aba8d0d53190 124
dzoni 2:aba8d0d53190 125
dzoni 2:aba8d0d53190 126
dzoni 2:aba8d0d53190 127 void _tout(void) {
dzoni 2:aba8d0d53190 128 if (_state == STARTED)
dzoni 2:aba8d0d53190 129 _state = TIMEOUT;
dzoni 2:aba8d0d53190 130 }
dzoni 2:aba8d0d53190 131
dzoni 2:aba8d0d53190 132 void _rising(void) {
dzoni 2:aba8d0d53190 133 if (_state == STARTED) {
dzoni 2:aba8d0d53190 134 _timer.start();
dzoni 2:aba8d0d53190 135 }
dzoni 2:aba8d0d53190 136 }
dzoni 2:aba8d0d53190 137
dzoni 2:aba8d0d53190 138 void _falling(void) {
dzoni 2:aba8d0d53190 139 if (_state == STARTED) {
dzoni 2:aba8d0d53190 140 _timer.stop();
dzoni 2:aba8d0d53190 141 _ticks_us = _timer.read_us();
dzoni 2:aba8d0d53190 142 state = COMPLETED;
dzoni 2:aba8d0d53190 143 }
dzoni 2:aba8d0d53190 144 }
dzoni 2:aba8d0d53190 145
dzoni 2:aba8d0d53190 146 private:
dzoni 2:aba8d0d53190 147 DigitalOut _trig;
dzoni 2:aba8d0d53190 148 InterruptIn _echo;
dzoni 2:aba8d0d53190 149 uint32_t _ticks_us;
dzoni 2:aba8d0d53190 150 uint32_t _tout_us;
dzoni 2:aba8d0d53190 151 float _coeff;
dzoni 2:aba8d0d53190 152
dzoni 2:aba8d0d53190 153 Timer _timer;
dzoni 2:aba8d0d53190 154 Timeout _timeout;
dzoni 2:aba8d0d53190 155
dzoni 2:aba8d0d53190 156 volatile Distance_HC_SR04_state _state;
dzoni 2:aba8d0d53190 157 };
dzoni 2:aba8d0d53190 158
dzoni 2:aba8d0d53190 159
dzoni 2:aba8d0d53190 160
dzoni 0:6fd0fbcfc7e1 161 int main() {
dzoni 0:6fd0fbcfc7e1 162
dzoni 0:6fd0fbcfc7e1 163 trigDist = 0;
dzoni 0:6fd0fbcfc7e1 164 state = IDLE;
dzoni 0:6fd0fbcfc7e1 165 timer_ticks_min = 999999;
dzoni 0:6fd0fbcfc7e1 166
dzoni 0:6fd0fbcfc7e1 167 wait_ms(250);
dzoni 0:6fd0fbcfc7e1 168 lcd.cls();
dzoni 0:6fd0fbcfc7e1 169
dzoni 0:6fd0fbcfc7e1 170 lcd.cls();
dzoni 0:6fd0fbcfc7e1 171 lcd.printf("Row 1");
dzoni 0:6fd0fbcfc7e1 172 lcd.locate(0, 1);
dzoni 0:6fd0fbcfc7e1 173 lcd.printf("Row 2");
dzoni 0:6fd0fbcfc7e1 174
dzoni 0:6fd0fbcfc7e1 175 while (true) {
dzoni 0:6fd0fbcfc7e1 176 // Priprava
dzoni 0:6fd0fbcfc7e1 177 state = STARTED;
dzoni 0:6fd0fbcfc7e1 178 timeout.attach_us(&tout, TIMEOUT_DELAY_US);
dzoni 0:6fd0fbcfc7e1 179
dzoni 0:6fd0fbcfc7e1 180 // Dej puls na trig
dzoni 0:6fd0fbcfc7e1 181 trigDist = 1;
dzoni 0:6fd0fbcfc7e1 182 wait_us(500);
dzoni 0:6fd0fbcfc7e1 183 trigDist = 0;
dzoni 0:6fd0fbcfc7e1 184
dzoni 0:6fd0fbcfc7e1 185 // Zkontroluj signal
dzoni 0:6fd0fbcfc7e1 186 if (echoDist != 0) {
dzoni 0:6fd0fbcfc7e1 187 state = ERROR_SIG;
dzoni 0:6fd0fbcfc7e1 188 timer_ticks = 0;
dzoni 0:6fd0fbcfc7e1 189 lcd.cls();
dzoni 0:6fd0fbcfc7e1 190 lcd.printf("Dist.: ---", timer_ticks);
dzoni 0:6fd0fbcfc7e1 191 lcd.locate(0, 1);
dzoni 0:6fd0fbcfc7e1 192 lcd.printf("ERROR_SIG");
dzoni 0:6fd0fbcfc7e1 193 } else {
dzoni 0:6fd0fbcfc7e1 194 // Vynuluj timer
dzoni 0:6fd0fbcfc7e1 195 timer.stop();
dzoni 0:6fd0fbcfc7e1 196 timer.reset();
dzoni 0:6fd0fbcfc7e1 197
dzoni 0:6fd0fbcfc7e1 198 // Cekej na hrany na Echo
dzoni 0:6fd0fbcfc7e1 199 while (echoDist == 0 && state == STARTED)
dzoni 0:6fd0fbcfc7e1 200 ;
dzoni 0:6fd0fbcfc7e1 201
dzoni 0:6fd0fbcfc7e1 202 timer.start();
dzoni 0:6fd0fbcfc7e1 203
dzoni 0:6fd0fbcfc7e1 204 while (echoDist == 1 && state == STARTED)
dzoni 0:6fd0fbcfc7e1 205 ;
dzoni 0:6fd0fbcfc7e1 206
dzoni 0:6fd0fbcfc7e1 207 if (state == STARTED) {
dzoni 0:6fd0fbcfc7e1 208 state = COMPLETED;
dzoni 0:6fd0fbcfc7e1 209 timer.stop();
dzoni 0:6fd0fbcfc7e1 210
dzoni 0:6fd0fbcfc7e1 211 timer_ticks = timer.read_us();
dzoni 0:6fd0fbcfc7e1 212 time_float = timer.read()*CALC_COEFF;
dzoni 0:6fd0fbcfc7e1 213
dzoni 0:6fd0fbcfc7e1 214 timer_ticks_min = (timer_ticks_min < timer_ticks) ? timer_ticks_min : timer_ticks;
dzoni 0:6fd0fbcfc7e1 215
dzoni 0:6fd0fbcfc7e1 216 if (timer_ticks < TICKS_RANGE_MIN) {
dzoni 0:6fd0fbcfc7e1 217 timer_ticks = 0;
dzoni 0:6fd0fbcfc7e1 218 time_float = 0.0f;
dzoni 0:6fd0fbcfc7e1 219
dzoni 0:6fd0fbcfc7e1 220 state = OUT_OF_RANGE_MIN;
dzoni 0:6fd0fbcfc7e1 221
dzoni 0:6fd0fbcfc7e1 222 lcd.cls();
dzoni 0:6fd0fbcfc7e1 223 lcd.printf("Dist.: ---");
dzoni 0:6fd0fbcfc7e1 224 lcd.locate(0, 1);
dzoni 0:6fd0fbcfc7e1 225 lcd.printf("OUT_OF_RANGE_MIN");
dzoni 0:6fd0fbcfc7e1 226 } else if (timer_ticks > TICKS_RANGE_MAX) {
dzoni 0:6fd0fbcfc7e1 227 timer_ticks = 0;
dzoni 0:6fd0fbcfc7e1 228 time_float = 0.0f;
dzoni 0:6fd0fbcfc7e1 229
dzoni 0:6fd0fbcfc7e1 230 state = OUT_OF_RANGE_MAX;
dzoni 0:6fd0fbcfc7e1 231
dzoni 0:6fd0fbcfc7e1 232 lcd.cls();
dzoni 0:6fd0fbcfc7e1 233 lcd.printf("Dist.: ---");
dzoni 0:6fd0fbcfc7e1 234 lcd.locate(0, 1);
dzoni 0:6fd0fbcfc7e1 235 lcd.printf("OUT_OF_RANGE_MAX");
dzoni 0:6fd0fbcfc7e1 236 } else {
dzoni 0:6fd0fbcfc7e1 237 lcd.cls();
dzoni 0:6fd0fbcfc7e1 238 lcd.printf("Dist.: %u %u", timer_ticks, timer_ticks_min);
dzoni 0:6fd0fbcfc7e1 239 lcd.locate(0, 1);
dzoni 0:6fd0fbcfc7e1 240 lcd.printf("Dist.: %.3f", time_float);
dzoni 0:6fd0fbcfc7e1 241 }
dzoni 0:6fd0fbcfc7e1 242 } else {
dzoni 0:6fd0fbcfc7e1 243 timer.stop();
dzoni 0:6fd0fbcfc7e1 244 timer_ticks = 0;
dzoni 0:6fd0fbcfc7e1 245 time_float = 0.0f;
dzoni 0:6fd0fbcfc7e1 246
dzoni 0:6fd0fbcfc7e1 247 lcd.cls();
dzoni 0:6fd0fbcfc7e1 248 lcd.printf("Dist.: ---", timer_ticks);
dzoni 0:6fd0fbcfc7e1 249 lcd.locate(0, 1);
dzoni 0:6fd0fbcfc7e1 250 lcd.printf("TIMEOUT");
dzoni 0:6fd0fbcfc7e1 251 }
dzoni 0:6fd0fbcfc7e1 252 }
dzoni 0:6fd0fbcfc7e1 253 timeout.detach();
dzoni 0:6fd0fbcfc7e1 254
dzoni 0:6fd0fbcfc7e1 255 wait_ms(100);
dzoni 0:6fd0fbcfc7e1 256
dzoni 0:6fd0fbcfc7e1 257 state = IDLE;
dzoni 0:6fd0fbcfc7e1 258 }
dzoni 0:6fd0fbcfc7e1 259 }
dzoni 0:6fd0fbcfc7e1 260
dzoni 0:6fd0fbcfc7e1 261
dzoni 0:6fd0fbcfc7e1 262 /*
dzoni 0:6fd0fbcfc7e1 263 // A class for flip()-ing a DigitalOut
dzoni 0:6fd0fbcfc7e1 264 class Flipper {
dzoni 0:6fd0fbcfc7e1 265 public:
dzoni 0:6fd0fbcfc7e1 266 Flipper(PinName pin) : _pin(pin) {
dzoni 0:6fd0fbcfc7e1 267 _pin = 0;
dzoni 0:6fd0fbcfc7e1 268 }
dzoni 0:6fd0fbcfc7e1 269 void flip() {
dzoni 0:6fd0fbcfc7e1 270 _pin = !_pin;
dzoni 0:6fd0fbcfc7e1 271 }
dzoni 0:6fd0fbcfc7e1 272 private:
dzoni 0:6fd0fbcfc7e1 273 DigitalOut _pin;
dzoni 0:6fd0fbcfc7e1 274 };
dzoni 0:6fd0fbcfc7e1 275
dzoni 0:6fd0fbcfc7e1 276 DigitalOut led1(LED1);
dzoni 0:6fd0fbcfc7e1 277 Flipper f(LED2);
dzoni 0:6fd0fbcfc7e1 278 Timeout t;
dzoni 0:6fd0fbcfc7e1 279
dzoni 0:6fd0fbcfc7e1 280 int main() {
dzoni 0:6fd0fbcfc7e1 281 t.attach(&f, &Flipper::flip, 2.0); // the address of the object, member function, and interval
dzoni 0:6fd0fbcfc7e1 282
dzoni 0:6fd0fbcfc7e1 283 // spin in a main loop. flipper will interrupt it to call flip
dzoni 0:6fd0fbcfc7e1 284 while(1) {
dzoni 0:6fd0fbcfc7e1 285 led1 = !led1;
dzoni 0:6fd0fbcfc7e1 286 wait(0.2);
dzoni 0:6fd0fbcfc7e1 287 }
dzoni 0:6fd0fbcfc7e1 288 }
dzoni 0:6fd0fbcfc7e1 289
dzoni 0:6fd0fbcfc7e1 290 */