SEEED STUDIO SEN136B5B test (Using PING library in local)

Dependencies:   mbed

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?

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