fuyuno sakura
/
PINGTEST
SEEED STUDIO SEN136B5B test (Using PING library in local)
PING.cpp@0:02a23e3031ee, 2012-09-24 (annotated)
- Committer:
- mio
- Date:
- Mon Sep 24 15:52:56 2012 +0000
- Revision:
- 0:02a23e3031ee
Import PING code to local.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mio | 0:02a23e3031ee | 1 | #include "PING.h" |
mio | 0:02a23e3031ee | 2 | #include "mbed.h" |
mio | 0:02a23e3031ee | 3 | |
mio | 0:02a23e3031ee | 4 | /* |
mio | 0:02a23e3031ee | 5 | * Constructor |
mio | 0:02a23e3031ee | 6 | */ |
mio | 0:02a23e3031ee | 7 | PING::PING(PinName trigger) : _trigger(trigger) |
mio | 0:02a23e3031ee | 8 | { |
mio | 0:02a23e3031ee | 9 | // Attach interrupts |
mio | 0:02a23e3031ee | 10 | _ticker.attach(this, &PING::_startRange, 0.1); |
mio | 0:02a23e3031ee | 11 | _invalidctr = 0 ; |
mio | 0:02a23e3031ee | 12 | } |
mio | 0:02a23e3031ee | 13 | |
mio | 0:02a23e3031ee | 14 | void PING::_startRange() |
mio | 0:02a23e3031ee | 15 | { |
mio | 0:02a23e3031ee | 16 | int invalid ; |
mio | 0:02a23e3031ee | 17 | invalid = 0 ; |
mio | 0:02a23e3031ee | 18 | |
mio | 0:02a23e3031ee | 19 | // send a trigger pulse, 20uS long |
mio | 0:02a23e3031ee | 20 | _trigger.output(); // set pin to output trigger pulse |
mio | 0:02a23e3031ee | 21 | _trigger = 0; // ensure pin starts low |
mio | 0:02a23e3031ee | 22 | wait_us(2); // wait two microseconds |
mio | 0:02a23e3031ee | 23 | _trigger = 1; // send trigger pulse by setting pin high |
mio | 0:02a23e3031ee | 24 | wait_us(5); // keep sending pulse for 5 microseconds |
mio | 0:02a23e3031ee | 25 | _trigger = 0; // set pin low to stop pulse |
mio | 0:02a23e3031ee | 26 | _trigger.input(); |
mio | 0:02a23e3031ee | 27 | |
mio | 0:02a23e3031ee | 28 | // pulseIn |
mio | 0:02a23e3031ee | 29 | _timer.reset(); |
mio | 0:02a23e3031ee | 30 | _timer.start(); |
mio | 0:02a23e3031ee | 31 | while (!_trigger) { |
mio | 0:02a23e3031ee | 32 | if (_timer.read_us() > 10000) { // invalid thre |
mio | 0:02a23e3031ee | 33 | invalid = 1; |
mio | 0:02a23e3031ee | 34 | break ; |
mio | 0:02a23e3031ee | 35 | } |
mio | 0:02a23e3031ee | 36 | } // wait for high |
mio | 0:02a23e3031ee | 37 | if (invalid == 0) |
mio | 0:02a23e3031ee | 38 | { |
mio | 0:02a23e3031ee | 39 | _timer.stop(); |
mio | 0:02a23e3031ee | 40 | _timer.reset(); |
mio | 0:02a23e3031ee | 41 | _timer.start(); |
mio | 0:02a23e3031ee | 42 | while (_trigger) { |
mio | 0:02a23e3031ee | 43 | if (_timer.read_us() > 10000) |
mio | 0:02a23e3031ee | 44 | { // invalid thre |
mio | 0:02a23e3031ee | 45 | invalid = 1 ; |
mio | 0:02a23e3031ee | 46 | break ; |
mio | 0:02a23e3031ee | 47 | } |
mio | 0:02a23e3031ee | 48 | } // wait for low |
mio | 0:02a23e3031ee | 49 | _timer.stop(); |
mio | 0:02a23e3031ee | 50 | } |
mio | 0:02a23e3031ee | 51 | if (invalid == 0) { |
mio | 0:02a23e3031ee | 52 | _dist = _timer.read_us(); //provides echo time in microseconds |
mio | 0:02a23e3031ee | 53 | _invalidctr = 0 ; |
mio | 0:02a23e3031ee | 54 | } else { |
mio | 0:02a23e3031ee | 55 | _invalidctr++ ; |
mio | 0:02a23e3031ee | 56 | if (_invalidctr > 5) { // Invalid (none) thre |
mio | 0:02a23e3031ee | 57 | _dist = 0.0 ; |
mio | 0:02a23e3031ee | 58 | _invalidctr = 0 ; |
mio | 0:02a23e3031ee | 59 | } |
mio | 0:02a23e3031ee | 60 | } |
mio | 0:02a23e3031ee | 61 | } |
mio | 0:02a23e3031ee | 62 | |
mio | 0:02a23e3031ee | 63 | // returns distance in meters |
mio | 0:02a23e3031ee | 64 | // The speed of sound is 340 m/s or 58 microseconds per meter. |
mio | 0:02a23e3031ee | 65 | // The ping travels out and back, so to find the distance of the |
mio | 0:02a23e3031ee | 66 | // object we take half of the distance travelled. |
mio | 0:02a23e3031ee | 67 | float PING::read(void) |
mio | 0:02a23e3031ee | 68 | { |
mio | 0:02a23e3031ee | 69 | // spin until there is a good value |
mio | 0:02a23e3031ee | 70 | return (_dist/29/2); |
mio | 0:02a23e3031ee | 71 | } |
mio | 0:02a23e3031ee | 72 | |
mio | 0:02a23e3031ee | 73 | // returns distance in inches |
mio | 0:02a23e3031ee | 74 | // According to Parallax's datasheet for the PING))), there are |
mio | 0:02a23e3031ee | 75 | // 73.746 microseconds per inch (i.e. sound travels at 1130 feet per |
mio | 0:02a23e3031ee | 76 | // second). This gives the distance travelled by the ping, outbound |
mio | 0:02a23e3031ee | 77 | // and return, so we divide by 2 to get the distance of the obstacle. |
mio | 0:02a23e3031ee | 78 | // See: http://www.parallax.com/dl/docs/prod/acc/28015-PING-v1.3.pdf |
mio | 0:02a23e3031ee | 79 | |
mio | 0:02a23e3031ee | 80 | // 2012.9.25 : Add check echo timeout detection |
mio | 0:02a23e3031ee | 81 | |
mio | 0:02a23e3031ee | 82 | float PING::read_in(void) |
mio | 0:02a23e3031ee | 83 | { |
mio | 0:02a23e3031ee | 84 | // spin until there is a good value |
mio | 0:02a23e3031ee | 85 | return (_dist/74/2); |
mio | 0:02a23e3031ee | 86 | } |
mio | 0:02a23e3031ee | 87 | |
mio | 0:02a23e3031ee | 88 | PING::operator float() |
mio | 0:02a23e3031ee | 89 | { |
mio | 0:02a23e3031ee | 90 | return read(); |
mio | 0:02a23e3031ee | 91 | } |