Ping (Ultrasonic Distance Sensor)

PING is an ultrasonic distance sensor by Parallax. It measures the distance to an object without any contact and its range is from 2cm (0.8") to 3m (3.3'). It only needs one signal pin and is with $30 relatively affordable. Here is the complete Datasheet .

Servo Mount

The sensor is much eassier to use if it is mounted to a bracket. I got mine from shapeways for less than $10. This one was desinged for a servo, but I usually just use double-sided tape.

Arduino Code

All the code be downloaded from here.

Ping_loop

The first example is a brute force method. The center is a fast loop that waits until the signal pin goes back to LOW and increments a "timer" variable. I did not use any temporary variables to increase speed.

#define PIN_ULTRASOUND 7 // Ultrasound signal pin
#define WAIT 200

int distance()
{
  int timecount = 0;
  pinMode(PIN_ULTRASOUND, OUTPUT);    // Switch signalpin to output
  digitalWrite(PIN_ULTRASOUND, LOW);  // Send low pulse
  delayMicroseconds(2);               // Wait for 2 microseconds
  digitalWrite(PIN_ULTRASOUND, HIGH); // Send high pulse
  delayMicroseconds(5);               // Wait for 5 microseconds
  digitalWrite(PIN_ULTRASOUND, LOW);  // Holdoff

  pinMode(PIN_ULTRASOUND, INPUT);     // Switch signalpin to input
  while(digitalRead(PIN_ULTRASOUND) == LOW) { // Loop until pin reads a high value
  }

  while(digitalRead(PIN_ULTRASOUND) == HIGH) { // Loop until pin reads a high value
    timecount++;                      // Count echo pulse time
  }
  return timecount;
}

void setup()
{
  Serial.begin(19200);                 // Sets the baud rate to 9600
}

void loop()
{
  Serial.println(distance());
  delay(WAIT);
}

Here is a table of measured distance to an object distance in mm:

Counter
mm
75 50
149 100
216 150
287 200
352 250
424 300
500 350
572 400
644 450
722 500
795 550
866 600

Which basically means that the distance in mm is 0.7 × the measured distance

Ping_pulseIn

The more recent Arduino releases have a function called pulseIn() which makes the code much shorter:

/* Ping))) Sensor
 
 This sketch reads a PING))) ultrasonic rangefinder and returns the
 distance to the closest object in range. To do this, it sends a pulse
 to the sensor to initiate a reading, then listens for a pulse 
 to return.  The length of the returning pulse is proportional to 
 the distance of the object from the sensor.
 
 The circuit:
 	* +V connection of the PING))) attached to +5V
 	* GND connection of the PING))) attached to ground
 	* SIG connection of the PING))) attached to digital pin 7
 
 http://www.arduino.cc/en/Tutorial/Ping
 
 created 3 Nov 2008
 by David A. Mellis
 modified 30 Jun 2009
 by Tom Igoe
 
 This example code is in the public domain.
 
 */

// this constant won't change.  It's the pin number
// of the sensor's output:
const int pingPin = 7;

void setup() {
  // initialize serial communication:
  Serial.begin(19200);
}

void loop()
{
  // establish variables for duration of the ping, 
  // and the distance result in inches and centimeters:
  long duration, inches, cm;

  // The PING))) is triggered by a HIGH pulse of 2 or more microseconds.
  // Give a short LOW pulse beforehand to ensure a clean HIGH pulse:
  pinMode(pingPin, OUTPUT);
  digitalWrite(pingPin, LOW);
  delayMicroseconds(2);
  digitalWrite(pingPin, HIGH);
  delayMicroseconds(5);
  digitalWrite(pingPin, LOW);

  // The same pin is used to read the signal from the PING))): a HIGH
  // pulse whose duration is the time (in microseconds) from the sending
  // of the ping to the reception of its echo off of an object.
  pinMode(pingPin, INPUT);
  duration = pulseIn(pingPin, HIGH);

  // convert the time into a distance
  Serial.print(microsecondsToInches(duration));
  Serial.print("in, ");
  Serial.print(microsecondsToCentimeters(duration));
  Serial.print("cm");
  Serial.println();

  delay(200);
}

long microsecondsToInches(long microseconds)
{
  // 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
  return microseconds / 148;
}

long microsecondsToCentimeters(long microseconds)
{
  // The speed of sound is 340 m/s or 29 microseconds per centimeter.
  // The ping travels out and back, so to find the distance of the
  // object we take half of the distance travelled.
  return microseconds / 58;
}