PING Library

Committer:
mshoemaker
Date:
Thu Feb 11 03:47:41 2010 +0000
Revision:
0:ae8d48256ff1

        

Who changed what in which revision?

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