Tutorial – Parallax Ping))) Ultrasonic Sensor

Sense distance with ultrasonic sensors in chapter forty-five of a series originally titled “Getting Started/Moving Forward with Arduino!” by John Boxall – a series of articles on the Arduino universe. The first chapter is here, the complete series is detailed here.

Updated 05/02/2013

Whilst being a passenger in a vehicle with a ‘reversing sensors’, I became somewhat curious as to how the sensors operated and how we can make use of them. So for this chapter we will investigate an ultrasonic sensor from Parallax called the Ping)))™ Ultrasonic Distance Sensor. It can measure distances between ~2cm and ~3m in length. Here is our example sensor:

(Memories of Number Five …)

Parallax have done a lot of work, the board contains not just the bare sensor hardware but controller circuitry as well:

Which is great as it leaves us with only three pins – 5V, GND and signal. More on those in a moment, but first…

How does it work?

Good question. The unit sends out an ultrasonic (a sound that has a frequency which is higher than can be heard by the human ear) burst of sound from one transducer (the round silver things) and waits for it bounce off an object and return – which is detected by the other transducer. The board will then return to us the period of time taken for this process to take, which we can interpret to determine the distance between the sensor and the object from which the ultrasonic sound bounced from.

The Ping))) only measures a distance when requested – to do this we send a very short HIGH pulse of five microseconds to the signal pin. After a brief moment a pulse will come from the board on the same signal pin. The period of this second pulse is the amount of time the sound took to travel out and back from the sensor – so we divide it by two to calculate the distance. Finally, as the the speed of sound is 340 metres per second, the Arduino sketch can calculate the distance to whatever units required.

It may sound complex, but it is not –  so let’s run through the theory of operation with an example. Using our digital storage oscillscope we have measured the waveforms on the signal pin during a typical measurement. Consider the following example of measuring a distance of 12cm:

fulltwelvecm

You can see the 5uS pulse in the centre and the pulse returned from the sensor board on the right. Now to zoom in on the returned pulse:

twelvecm

Without being too picky the pulse is roughly 720uS (microseconds) long – the duration of ultrasonic sound’s return trip from the sensor board. So we divide this by two to find the time to travel the distance – 360uS. Recall the speed of sound is 340 metres per second – which converts to 29.412 uS per centimetre. So, 360uS divided by 29.412 uS gives 12.239902081… centimetres. Rounded that gives us 12 centimetres. Easy!

Finally, there are some limitations to using the Ping))) sensor. Download the data sheet (pdf) and read pages three to five for information on how to effectively mount the sensor and the sensitivity results from factory resting.

How do we use it with Arduino?

As described previously we first need to send a 5uS pulse, then listen for the return pulse. The following sketch does just that, then converts the data to centimetres and displays the result on the serial monitor. The code has been commented to explain each step.

And the results of some hand-waving in the serial monitor:

So there you have it – you can now measure distance with a degree of accuracy. However that image above isn’t very exciting – instead let’s use a 7-segment display shield to get things up in lights. The shield uses the NXP SAA1064 LED display driver IC (explained quite well here). You can download the demonstration sketch from here. And now for the video:

So there you have it – now the use of the sensor is up to your imagination. Stay tuned using the methods below to see what we get up to with this sensor in the future.

LEDborder

Have fun and keep checking into tronixstuff.com. Why not follow things on twitterGoogle+, subscribe  for email updates or RSS using the links on the right-hand column, or join our Google Group – dedicated to the projects and related items on this website. Sign up – it’s free, helpful to each other –  and we can all learn something.

The following two tabs change content below.

John Boxall

Founder, owner and managing editor of tronixstuff.com.

25 Responses to “Tutorial – Parallax Ping))) Ultrasonic Sensor”

  1. steve56 says:

    Does this unit only work on solid surfaces, or would it be ok for measuring water level in a tank ?

    • John Boxall says:

      Yes, you can measure water tank levels, as long as the water surface is still – good for farm tanks, not for things in motion.

      • Jim says:

        Hi John,

        If max7219CNG or BCD4511 use what will section of the code look like and does #include “Wire.h” library includes the MAX7219CNG and BCD4511??

        #include “Wire.h”
        byte saa1064 = 0×70 >> 1; // define the I2C bus address for our SAA1064

        void setup()
        {
        Wire.begin(); // start up I2C bus
        pinMode(signal, OUTPUT);
        initDisplay();
        }

        void initDisplay()
        // turns on dynamic mode and adjusts segment current to 12mA
        {
        Wire.beginTransmission(saa1064);
        Wire.write(B00000000); // this is the instruction byte. Zero means the next byte is the control byte
        Wire.write(B01000111); // control byte (dynamic mode on, digits 1+3 on, digits 2+4 on, 12mA segment current
        Wire.endTransmission();
        }

      • John Boxall says:

        ? MAX7219 uses SPI bus (not I2C). Also 4511 nothing to do with I2C.

  2. Steve56 says:

    Hi John,

    I built a remote tank water level sensor using the Ping and an xBee radio to transmit the data back to my PC.

    I powered it with a 9V battery which lasted about 8 hours. Not very satisfactory. The unit logged and radioed data every 15 minutes.

    Can you give any tips on battery powered applications with a view to extending battery life, to maybe a few months ?

    regards
    Steve56

  3. ANDREEA says:

    Vreau si eu un program pentru masurarea nivelului de lichid dintr-un vas va rog.Folosesc un senzor PING si o placa ARDUINO UNO

  4. Andrew Molnar says:

    I see that you calibrated it to 1 cm. Is it possible to get an accuracy of 0.1 mm, over a range of 2 -5cm?

  5. imam m says:

    how if im using module ultrasonic sensor HR-SR04 ? that’s code in below still works?

    thanks :_

  6. Omar Andres says:

    How would u be able to have two sensors take the distances at the same time…Im using the same sensor and an UNO board

Trackbacks/Pingbacks


Leave a Reply

Receive notifications of new posts by email.

The Arduino Book

Arduino Workshop

Für unsere deutschen Freunde

Dla naszych polskich przyjaciół ...

Australian Electronics!

Buy and support Silicon Chip - Australia's only Electronics Magazine.

Use of our content…

%d bloggers like this: