Ultra
Dependents: Group2 c8_Final_course1
ultrasonic.cpp@5:77c5e5b512c7, 2019-06-12 (annotated)
- Committer:
- kmsmile2
- Date:
- Wed Jun 12 08:06:16 2019 +0000
- Revision:
- 5:77c5e5b512c7
- Parent:
- 4:e0f9c9fb4cf3
ultra;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ejteb | 0:6aa04a8c8d4c | 1 | #include "ultrasonic.h" |
ejteb | 0:6aa04a8c8d4c | 2 | |
kmsmile2 | 5:77c5e5b512c7 | 3 | // generate a 10 us pulse to start HCSR04 ultrasonic sensor and |
kmsmile2 | 5:77c5e5b512c7 | 4 | // enable IRQ for echo pin. |
kmsmile2 | 5:77c5e5b512c7 | 5 | Ultrasonic::Ultrasonic(PinName trigPin, PinName echoPin, float timeout, bool repeat):\ |
kmsmile2 | 5:77c5e5b512c7 | 6 | _trig(trigPin), _echo(echoPin), _toVal(timeout), _repeat(repeat) |
kmsmile2 | 5:77c5e5b512c7 | 7 | { |
kmsmile2 | 5:77c5e5b512c7 | 8 | _timer.reset(); |
kmsmile2 | 5:77c5e5b512c7 | 9 | _echo.rise(this, &Ultrasonic::_startT); |
kmsmile2 | 5:77c5e5b512c7 | 10 | _echo.fall(this, &Ultrasonic::_endT); |
kmsmile2 | 5:77c5e5b512c7 | 11 | _echo.disable_irq(); |
kmsmile2 | 5:77c5e5b512c7 | 12 | _done = 0; |
kmsmile2 | 5:77c5e5b512c7 | 13 | _cnt = 0; |
kmsmile2 | 5:77c5e5b512c7 | 14 | } |
kmsmile2 | 5:77c5e5b512c7 | 15 | |
kmsmile2 | 5:77c5e5b512c7 | 16 | Ultrasonic::~Ultrasonic() |
kmsmile2 | 5:77c5e5b512c7 | 17 | { |
kmsmile2 | 5:77c5e5b512c7 | 18 | } |
kmsmile2 | 5:77c5e5b512c7 | 19 | |
kmsmile2 | 5:77c5e5b512c7 | 20 | void Ultrasonic::trig(void) |
kmsmile2 | 5:77c5e5b512c7 | 21 | { |
kmsmile2 | 5:77c5e5b512c7 | 22 | _done = 0; |
kmsmile2 | 5:77c5e5b512c7 | 23 | _echo.enable_irq(); |
kmsmile2 | 5:77c5e5b512c7 | 24 | _trig = 1; // trigger = 1 |
kmsmile2 | 5:77c5e5b512c7 | 25 | wait_us(10); // for 10 sec |
kmsmile2 | 5:77c5e5b512c7 | 26 | _trig = 0; // turn off the trigger |
kmsmile2 | 5:77c5e5b512c7 | 27 | } |
kmsmile2 | 5:77c5e5b512c7 | 28 | |
kmsmile2 | 5:77c5e5b512c7 | 29 | int Ultrasonic::getDistance(void) |
kmsmile2 | 5:77c5e5b512c7 | 30 | { |
kmsmile2 | 5:77c5e5b512c7 | 31 | if(_distance >= 0) // if the _distance is equal or more than 0, resume that detection is completed. |
kmsmile2 | 5:77c5e5b512c7 | 32 | return _distance; // return _distance. |
kmsmile2 | 5:77c5e5b512c7 | 33 | else |
kmsmile2 | 5:77c5e5b512c7 | 34 | return -1; // if not, return the '-1'. |
kmsmile2 | 5:77c5e5b512c7 | 35 | } |
kmsmile2 | 5:77c5e5b512c7 | 36 | |
kmsmile2 | 5:77c5e5b512c7 | 37 | // return the echo pulse duration in us and return -1 in case of failure. |
kmsmile2 | 5:77c5e5b512c7 | 38 | int Ultrasonic::getPulseDuration(void) |
kmsmile2 | 5:77c5e5b512c7 | 39 | { |
kmsmile2 | 5:77c5e5b512c7 | 40 | if(_pulseDuration >= 0) // if the _pulseDuration is equal or more than 0, resume that detection is completed. |
kmsmile2 | 5:77c5e5b512c7 | 41 | return _pulseDuration; // return _pulseDuration. |
kmsmile2 | 5:77c5e5b512c7 | 42 | else |
kmsmile2 | 5:77c5e5b512c7 | 43 | return -1; // if not, return the '-1'. |
kmsmile2 | 5:77c5e5b512c7 | 44 | } |
kmsmile2 | 5:77c5e5b512c7 | 45 | |
kmsmile2 | 5:77c5e5b512c7 | 46 | int Ultrasonic::getStatus(void) |
kmsmile2 | 5:77c5e5b512c7 | 47 | { |
kmsmile2 | 5:77c5e5b512c7 | 48 | return _done; // Measurement status |
kmsmile2 | 5:77c5e5b512c7 | 49 | } |
kmsmile2 | 5:77c5e5b512c7 | 50 | |
kmsmile2 | 5:77c5e5b512c7 | 51 | void Ultrasonic::clearStatus(void) |
kmsmile2 | 5:77c5e5b512c7 | 52 | { |
kmsmile2 | 5:77c5e5b512c7 | 53 | _done = 0; |
kmsmile2 | 5:77c5e5b512c7 | 54 | _timer.reset(); |
kmsmile2 | 5:77c5e5b512c7 | 55 | _echo.disable_irq(); |
kmsmile2 | 5:77c5e5b512c7 | 56 | _cnt = 0; |
kmsmile2 | 5:77c5e5b512c7 | 57 | _distance = 0; |
kmsmile2 | 5:77c5e5b512c7 | 58 | } |
kmsmile2 | 5:77c5e5b512c7 | 59 | |
kmsmile2 | 5:77c5e5b512c7 | 60 | void Ultrasonic::pauseMeasure(void) |
kmsmile2 | 5:77c5e5b512c7 | 61 | { |
kmsmile2 | 5:77c5e5b512c7 | 62 | _timeout.detach(); // make timeout detach to pause the measurement |
kmsmile2 | 5:77c5e5b512c7 | 63 | } |
kmsmile2 | 5:77c5e5b512c7 | 64 | |
kmsmile2 | 5:77c5e5b512c7 | 65 | |
kmsmile2 | 5:77c5e5b512c7 | 66 | void Ultrasonic::setMode(bool mode) |
kmsmile2 | 5:77c5e5b512c7 | 67 | { |
kmsmile2 | 5:77c5e5b512c7 | 68 | _repeat = mode; // input the value to _repeat according to the value of mode |
kmsmile2 | 5:77c5e5b512c7 | 69 | // _repeat determine the way of measurement |
kmsmile2 | 5:77c5e5b512c7 | 70 | } |
kmsmile2 | 5:77c5e5b512c7 | 71 | |
kmsmile2 | 5:77c5e5b512c7 | 72 | void Ultrasonic::setTime(float time) |
kmsmile2 | 5:77c5e5b512c7 | 73 | { |
kmsmile2 | 5:77c5e5b512c7 | 74 | _toVal = time; // input the value to _toVal accoring to the value of time |
kmsmile2 | 5:77c5e5b512c7 | 75 | // _toVal make the interrupt of _timer which is a timer object |
kmsmile2 | 5:77c5e5b512c7 | 76 | } |
kmsmile2 | 5:77c5e5b512c7 | 77 | |
kmsmile2 | 5:77c5e5b512c7 | 78 | void Ultrasonic::_startT(void) |
kmsmile2 | 5:77c5e5b512c7 | 79 | { |
kmsmile2 | 5:77c5e5b512c7 | 80 | _timer.start(); // read timer microseconds, this is starting time of the measurement |
kmsmile2 | 5:77c5e5b512c7 | 81 | } |
kmsmile2 | 5:77c5e5b512c7 | 82 | |
kmsmile2 | 5:77c5e5b512c7 | 83 | void Ultrasonic::_endT(void) |
kmsmile2 | 5:77c5e5b512c7 | 84 | { |
kmsmile2 | 5:77c5e5b512c7 | 85 | _timer.stop(); // when the pulse is falling, timer pulsetime is stopped. |
kmsmile2 | 5:77c5e5b512c7 | 86 | _pulseDuration = _timer.read_us(); // and the value of timer pulsetime enter the variable 'pulsedur' |
kmsmile2 | 5:77c5e5b512c7 | 87 | _distance = (_pulseDuration*343)/20000; // 340m/s * sec / 2(rounded) / 10000 (/u*100) |
kmsmile2 | 5:77c5e5b512c7 | 88 | _timer.reset(); // After knowing the distance, time pulsetime is reseted. |
kmsmile2 | 5:77c5e5b512c7 | 89 | if(_repeat == true) |
ejteb | 0:6aa04a8c8d4c | 90 | { |
kmsmile2 | 5:77c5e5b512c7 | 91 | _timeout.attach(this, &Ultrasonic::_timeout_cb, _toVal); |
kmsmile2 | 5:77c5e5b512c7 | 92 | printf("%d trial: %dcm\r\n", (_cnt+1), _distance); |
ejteb | 0:6aa04a8c8d4c | 93 | } |
kmsmile2 | 5:77c5e5b512c7 | 94 | else |
ejteb | 0:6aa04a8c8d4c | 95 | { |
kmsmile2 | 5:77c5e5b512c7 | 96 | _echo.disable_irq(); |
kmsmile2 | 5:77c5e5b512c7 | 97 | _done = 1; |
kmsmile2 | 5:77c5e5b512c7 | 98 | //printf("%dcm\r\n", _distance); |
ejteb | 0:6aa04a8c8d4c | 99 | } |
kmsmile2 | 5:77c5e5b512c7 | 100 | } |
kmsmile2 | 5:77c5e5b512c7 | 101 | |
kmsmile2 | 5:77c5e5b512c7 | 102 | void Ultrasonic::_timeout_cb(void) |
kmsmile2 | 5:77c5e5b512c7 | 103 | { |
kmsmile2 | 5:77c5e5b512c7 | 104 | |
kmsmile2 | 5:77c5e5b512c7 | 105 | if(_cnt >= 9) |
ejteb | 0:6aa04a8c8d4c | 106 | { |
kmsmile2 | 5:77c5e5b512c7 | 107 | _echo.disable_irq(); |
kmsmile2 | 5:77c5e5b512c7 | 108 | _done = 1; |
kmsmile2 | 5:77c5e5b512c7 | 109 | _cnt = 0; |
ejteb | 0:6aa04a8c8d4c | 110 | } |
kmsmile2 | 5:77c5e5b512c7 | 111 | else |
ejteb | 0:6aa04a8c8d4c | 112 | { |
kmsmile2 | 5:77c5e5b512c7 | 113 | trig(); |
kmsmile2 | 5:77c5e5b512c7 | 114 | _cnt++; |
ejteb | 0:6aa04a8c8d4c | 115 | } |
kmsmile2 | 5:77c5e5b512c7 | 116 | } |
kmsmile2 | 5:77c5e5b512c7 | 117 |