Monday, May 24, 2010

Ultrasonic Range-finder with LCD Character Display

I purchased a 'Ping)))' Sensor from Radio Shack today, and after soldering pins onto my 16x2 LCD character display, I set out to create an ultrasonic range-finder with my Arduino.  As far as the hardware was concerned, wiring the LCD panel took the most time.  I am quite pleased, though, with the level of contrast control obtained from the potentiometer (seen in the upper left corner of the breadboard).  This simple adjustment makes it easy to get a crisp character readout on the display.  The device runs on a nine volt battery and gives accurate distance readings from 2cm to about 3m at increments of 1cm.  You can power the device via USB instead of a 9volt battery and when connected to the computer in this way, range data is sent to the computer via virtual com port.  Below is the code being run.

/* Ping))) Sensor and LCD Readout

This sketch reads a PING))) ultrasonic rangefinder and displays 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.

created by David A. Mellis and Tom Igoe
modified to include LCD readout by Glenn Langton

// include the library code:

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

// pin number of the sensor's output:
const int pingPin = 5;

void setup() {
// set up the LCD's number of rows and columns:
lcd.begin(16, 2);
// set the cursor to column 0, line 0
lcd.setCursor(0, 0);
// Print inches to the LCD.
lcd.setCursor(0, 1);
// Print cm to the LCD.
// initialize serial communication:

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);
digitalWrite(pingPin, HIGH);
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
inches = microsecondsToInches(duration);
cm = microsecondsToCentimeters(duration);

Serial.print("in, ");

// set the cursor to column 8, line 0
lcd.setCursor(8, 0);
lcd.print(" ");
lcd.setCursor(8, 0);
// set the cursor to column 8, line 1
lcd.setCursor(8, 1);
lcd.print(" ");
lcd.setCursor(8, 1);


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:
return microseconds / 74 / 2;

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 / 29 / 2;


Post a Comment