PING Library

Revision:
0:ae8d48256ff1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PING.cpp	Thu Feb 11 03:47:41 2010 +0000
@@ -0,0 +1,59 @@
+#include "PING.h"
+#include "mbed.h"
+
+/*
+ * Constructor
+ */
+PING::PING(PinName trigger) : _trigger(trigger)
+{
+   // Attach interrupts
+   _ticker.attach(this, &PING::_startRange, 0.1);
+}
+
+void PING::_startRange()
+{
+   // send a trigger pulse, 20uS long
+   _trigger.output(); // set pin to output trigger pulse
+   _trigger = 0; // ensure pin starts low
+   wait_us(2); // wait two microseconds
+   _trigger = 1; // send trigger pulse by setting pin high
+   wait_us(5); // keep sending pulse for 5 microseconds
+   _trigger = 0; // set pin low to stop pulse
+
+   _trigger.input();
+
+   // pulseIn
+   while (!_trigger); // wait for high
+   _timer.reset();
+   _timer.start();
+   while (_trigger); // wait for low
+   _timer.stop();
+   _dist = _timer.read_us(); //provides echo time in microseconds
+}
+
+// returns distance in meters
+// The speed of sound is 340 m/s or 58 microseconds per meter.
+// The ping travels out and back, so to find the distance of the
+// object we take half of the distance travelled.
+float PING::read(void)
+{
+   // spin until there is a good value
+   return (_dist/29/2);
+}
+
+// returns distance in inches
+// According to Parallax's datasheet for the PING))), there are
+// 73.746 microseconds per inch (i.e. sound travels at 1130 feet per
+// second).  This gives the distance travelled by the ping, outbound
+// and return, so we divide by 2 to get the distance of the obstacle.
+// See: http://www.parallax.com/dl/docs/prod/acc/28015-PING-v1.3.pdf
+float PING::read_in(void)
+{
+   // spin until there is a good value
+   return (_dist/74/2);
+}
+
+PING::operator float()
+{
+   return read();
+}
\ No newline at end of file