PING Library
PING.cpp@0:ae8d48256ff1, 2010-02-11 (annotated)
- Committer:
- mshoemaker
- Date:
- Thu Feb 11 03:47:41 2010 +0000
- Revision:
- 0:ae8d48256ff1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mshoemaker | 0:ae8d48256ff1 | 1 | #include "PING.h" |
mshoemaker | 0:ae8d48256ff1 | 2 | #include "mbed.h" |
mshoemaker | 0:ae8d48256ff1 | 3 | |
mshoemaker | 0:ae8d48256ff1 | 4 | /* |
mshoemaker | 0:ae8d48256ff1 | 5 | * Constructor |
mshoemaker | 0:ae8d48256ff1 | 6 | */ |
mshoemaker | 0:ae8d48256ff1 | 7 | PING::PING(PinName trigger) : _trigger(trigger) |
mshoemaker | 0:ae8d48256ff1 | 8 | { |
mshoemaker | 0:ae8d48256ff1 | 9 | // Attach interrupts |
mshoemaker | 0:ae8d48256ff1 | 10 | _ticker.attach(this, &PING::_startRange, 0.1); |
mshoemaker | 0:ae8d48256ff1 | 11 | } |
mshoemaker | 0:ae8d48256ff1 | 12 | |
mshoemaker | 0:ae8d48256ff1 | 13 | void PING::_startRange() |
mshoemaker | 0:ae8d48256ff1 | 14 | { |
mshoemaker | 0:ae8d48256ff1 | 15 | // send a trigger pulse, 20uS long |
mshoemaker | 0:ae8d48256ff1 | 16 | _trigger.output(); // set pin to output trigger pulse |
mshoemaker | 0:ae8d48256ff1 | 17 | _trigger = 0; // ensure pin starts low |
mshoemaker | 0:ae8d48256ff1 | 18 | wait_us(2); // wait two microseconds |
mshoemaker | 0:ae8d48256ff1 | 19 | _trigger = 1; // send trigger pulse by setting pin high |
mshoemaker | 0:ae8d48256ff1 | 20 | wait_us(5); // keep sending pulse for 5 microseconds |
mshoemaker | 0:ae8d48256ff1 | 21 | _trigger = 0; // set pin low to stop pulse |
mshoemaker | 0:ae8d48256ff1 | 22 | |
mshoemaker | 0:ae8d48256ff1 | 23 | _trigger.input(); |
mshoemaker | 0:ae8d48256ff1 | 24 | |
mshoemaker | 0:ae8d48256ff1 | 25 | // pulseIn |
mshoemaker | 0:ae8d48256ff1 | 26 | while (!_trigger); // wait for high |
mshoemaker | 0:ae8d48256ff1 | 27 | _timer.reset(); |
mshoemaker | 0:ae8d48256ff1 | 28 | _timer.start(); |
mshoemaker | 0:ae8d48256ff1 | 29 | while (_trigger); // wait for low |
mshoemaker | 0:ae8d48256ff1 | 30 | _timer.stop(); |
mshoemaker | 0:ae8d48256ff1 | 31 | _dist = _timer.read_us(); //provides echo time in microseconds |
mshoemaker | 0:ae8d48256ff1 | 32 | } |
mshoemaker | 0:ae8d48256ff1 | 33 | |
mshoemaker | 0:ae8d48256ff1 | 34 | // returns distance in meters |
mshoemaker | 0:ae8d48256ff1 | 35 | // The speed of sound is 340 m/s or 58 microseconds per meter. |
mshoemaker | 0:ae8d48256ff1 | 36 | // The ping travels out and back, so to find the distance of the |
mshoemaker | 0:ae8d48256ff1 | 37 | // object we take half of the distance travelled. |
mshoemaker | 0:ae8d48256ff1 | 38 | float PING::read(void) |
mshoemaker | 0:ae8d48256ff1 | 39 | { |
mshoemaker | 0:ae8d48256ff1 | 40 | // spin until there is a good value |
mshoemaker | 0:ae8d48256ff1 | 41 | return (_dist/29/2); |
mshoemaker | 0:ae8d48256ff1 | 42 | } |
mshoemaker | 0:ae8d48256ff1 | 43 | |
mshoemaker | 0:ae8d48256ff1 | 44 | // returns distance in inches |
mshoemaker | 0:ae8d48256ff1 | 45 | // According to Parallax's datasheet for the PING))), there are |
mshoemaker | 0:ae8d48256ff1 | 46 | // 73.746 microseconds per inch (i.e. sound travels at 1130 feet per |
mshoemaker | 0:ae8d48256ff1 | 47 | // second). This gives the distance travelled by the ping, outbound |
mshoemaker | 0:ae8d48256ff1 | 48 | // and return, so we divide by 2 to get the distance of the obstacle. |
mshoemaker | 0:ae8d48256ff1 | 49 | // See: http://www.parallax.com/dl/docs/prod/acc/28015-PING-v1.3.pdf |
mshoemaker | 0:ae8d48256ff1 | 50 | float PING::read_in(void) |
mshoemaker | 0:ae8d48256ff1 | 51 | { |
mshoemaker | 0:ae8d48256ff1 | 52 | // spin until there is a good value |
mshoemaker | 0:ae8d48256ff1 | 53 | return (_dist/74/2); |
mshoemaker | 0:ae8d48256ff1 | 54 | } |
mshoemaker | 0:ae8d48256ff1 | 55 | |
mshoemaker | 0:ae8d48256ff1 | 56 | PING::operator float() |
mshoemaker | 0:ae8d48256ff1 | 57 | { |
mshoemaker | 0:ae8d48256ff1 | 58 | return read(); |
mshoemaker | 0:ae8d48256ff1 | 59 | } |