Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Revision 0:ae8d48256ff1, committed 2010-02-11
- Comitter:
- mshoemaker
- Date:
- Thu Feb 11 03:47:41 2010 +0000
- Commit message:
Changed in this revision
| PING.cpp | Show annotated file Show diff for this revision Revisions of this file |
| PING.h | Show annotated file Show diff for this revision Revisions of this file |
--- /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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/PING.h Thu Feb 11 03:47:41 2010 +0000
@@ -0,0 +1,71 @@
+#ifndef MBED_PING_H
+#define MBED_PING_H
+#include "mbed.h"
+
+/* Class: PING
+ * Abstraction for the PING Ultrasonic range finder
+ *
+ * Example:
+ * > // Print measured distance
+ * >
+ * > #include "mbed.h"
+ * > #include "PING.h"
+ * >
+ * > PING ping(p9);
+ * >
+ * > int main() {
+ * > while(1) {
+ * > printf("Measured : %.1f\n", ping.read());
+ * > wait(0.2);
+ * > }
+ * > }
+ */
+class PING
+{
+// Public functions
+public:
+ /* Constructor: PING
+ * Create a PING object, connected to the specified pins
+ *
+ * Variables:
+ * trigger - Output to trigger the PING
+ */
+ PING(PinName trigger);
+
+ /* Function: read
+ * A non-blocking function that will return the last measurement
+ *
+ * Variables:
+ * returns - floating point representation in cm.
+ */
+ float read(void);
+
+ /* Function: read_in
+ * A non-blocking function that will return the last measurement
+ *
+ * Variables:
+ * returns - floating point representation in in.
+ */
+ float read_in(void);
+
+ /* Function: operator float
+ * A short hand way of using the read function
+ *
+ * Example:
+ * > float range = ping.read();
+ * > float range = ping;
+ * >
+ * > if(ping.read() > 0.25) { ... }
+ * > if(ping > 0.25) { ... }
+ */
+ operator float();
+
+private :
+ DigitalInOut _trigger;
+ Timer _timer;
+ Ticker _ticker;
+ void _startRange(void);
+ float _dist;
+};
+
+#endif
\ No newline at end of file