Arduino – Sonic range finder with SRF05

SRF05

A guide to using the SRF05 Distance Sensor with Arduino in order to calculate distances from objects. In this case I’m also altering the output of an LED with PWM according to how close an object is to the sensor. So the nearer you are the brighter the LED.

So if we start with the SRF05, it’s an IC that works by sending an ultrasound pulse at around 40Khz. It then waits and listens for the pulse to echo back, calculating the time taken in microseconds (1 microsecond = 1.0 × 10-6 seconds). You can trigger a pulse as fast as 20 times a second and it can determine objects up to 3 metres away and as near as 3cm. It needs a 5V power supply to run.

Adding the SRF05 to the Arduino is very easy, only 4 pins to worry about. Power, Ground, Trigger and Echo. Since it needs 5V and Arduino provides 5V I’m obviously going to use this to power it. Below is a diagram of my SRF05, showing the pins. There are 2 sets of 5 pins, 1 set you can use, the other is for programming the PIC chip so don’t touch them!

SRF05 pin layout

SRF05 Arduino Components

220 Ohm resistor (Red, Red, Brown, Gold)
SRF05 Ultrasonic range finder
LED
Arduino Deumilanove w/ ATMEGA328
Breadboard / Prototyping board
Jumper/ Connector wires
Optional 9V DC power supply or use the USB power for the Arduino

Arduino SRF05 Circuit

Very, very simple circuit, I’ve used the breadboard to share the GND connection and to add the LED which I could probably have done with out the breadboard. You’ll see the most complex thing is the code later on.

Arduino-SRF05

SRF05 Arduino Distance Sensor sketch

All the work is done here, I’ve added code that averages the distance readings to remove some of the jitter in the results as the SRF05 is calculating distances very rapidly and there can be a lot of fluctuation. Also I convert the time in microseconds to distance by dividing the time by 58.

Why 58? Well because if you take the time in microseconds for a pulse to be sent and received e.g. for 1 meter it takes about 5764 microseconds – at least from my wall anyway. If I divide this time by the distance in cm in I will get 57.64 so I just round this up – you can calculate distance in any other unit with this method.

Here I’ve also decided that for every cm under 255 my LED will get 1 step brighter. I’ve been lazy here for the sake of the sensors 3 metre range I didn’t see the point in making this any more complicated. Otherwise I would calculate the brightness on the percentile of proximity out of total range.

[ad#Google Ad in content]

// written at: luckylarry.co.uk
// variables to take x number of readings and then average them
// to remove the jitter/noise from the SRF05 sonar readings

const int numOfReadings = 10;                   // number of readings to take/ items in the array
int readings[numOfReadings];                    // stores the distance readings in an array
int arrayIndex = 0;                             // arrayIndex of the current item in the array
int total = 0;                                  // stores the cumlative total
int averageDistance = 0;                        // stores the average value

// setup pins and variables for SRF05 sonar device

int echoPin = 2;                                // SRF05 echo pin (digital 2)
int initPin = 3;                                // SRF05 trigger pin (digital 3)
unsigned long pulseTime = 0;                    // stores the pulse in Micro Seconds
unsigned long distance = 0;                     // variable for storing the distance (cm)

// setup pins/values for LED

int redLEDPin = 9;                              // Red LED, connected to digital PWM pin 9
int redLEDValue = 0;                            // stores the value of brightness for the LED (0 = fully off, 255 = fully on)

//setup

void setup() {

  pinMode(redLEDPin, OUTPUT);                   // sets pin 9 as output
  pinMode(initPin, OUTPUT);                     // set init pin 3 as output
  pinMode(echoPin, INPUT);                      // set echo pin 2 as input

  // create array loop to iterate over every item in the array

  for (int thisReading = 0; thisReading < numOfReadings; thisReading++) {
readings[thisReading] = 0;
 }
// initialize the serial port, lets you view the
 // distances being pinged if connected to computer
     Serial.begin(9600);
 } 

// execute
void loop() {
digitalWrite(initPin, HIGH);                    // send 10 microsecond pulse
delayMicroseconds(10);                  // wait 10 microseconds before turning off
digitalWrite(initPin, LOW);                     // stop sending the pulse
pulseTime = pulseIn(echoPin, HIGH);             // Look for a return pulse, it should be high as the pulse goes low-high-low
distance = pulseTime/58;                        // Distance = pulse time / 58 to convert to cm.
 total= total - readings[arrayIndex];           // subtract the last distance
readings[arrayIndex] = distance;                // add distance reading to array
total= total + readings[arrayIndex];            // add the reading to the total
arrayIndex = arrayIndex + 1;                    // go to the next item in the array
// At the end of the array (10 items) then start again
if (arrayIndex >= numOfReadings)  {
    arrayIndex = 0;
  }

  averageDistance = total / numOfReadings;      // calculate the average distance

  // if the distance is less than 255cm then change the brightness of the LED

  if (averageDistance < 255) {
    redLEDValue = 255 - averageDistance;        // this means the smaller the distance the brighterthe LED.
  }

  analogWrite(redLEDPin, redLEDValue);          // Write current value to LED pins
  Serial.println(averageDistance, DEC);         // print out the average distance to the debugger
  delay(100);                                   // wait 100 milli seconds before looping again

}

[ad#Google Ad in content]

Well this is going to make the sensor for a robot methinks. I'll alter this to control a servo so turn left or right when blocked, or perhaps to alter the speed of the motors. Or maybe I'll just give myself bat like senses, maybe even fight crime! Anyway below is the quick video of it in action:

24 Comments

  • Hey
    Great work at all. But I have a problem with the code: when a paste the code in the arduino software “Arduino 0015 running it it cames out some problems that I am not able to resolve. Can you please tell me what I can do and change the code?
    Thank you

    • Hi, if you can let me know the error that you get and I’ll try to see if I can fix it. I’m also using Arduino 0015 release to do this.

      • Hello Larry
        the error is
        “error: expected constructor, destructor, or type conversion before ‘(‘ token” .
        Is in the row
        “digitalWrite(initPin, HIGH); // send 10 microsecond pulse”
        Thank you
        Ps I am passing also in the Arduino 0017 and it gives the same

        • Ah… if you look for the line ‘// execute
          void loop() { ‘

          WordPress has messed up my code a bit, you can see that the // starts a code comment and there should have been a return after my comment of // execute.

          The void loop() { is a method needed to run your Arduino code and its been commented out. Anyway I’ve updated the post to fix that.

          Hope that helps.

          • Great Larry!!!
            It funtion all.
            Thank you!

          • Hey Larry
            I wanted to ask you something other. I am not able to interface the SFR05 with the software MaxMSP 5. I am trying to do it with the Arduino instructions but no way till now. If you have any idea will be great.
            Thank you and Merry Christmas!

          • Not sure what you want to do with MAX MSP? I’ve never used it myself – but from the looks of it you can link it up using information here: http://www.arduino.cc/playground/Interfacing/MaxMSP and here: http://www.soundplusdesign.com/?p=1305 And it looks like its fairly straight forward.

            I personally use Processing which I think does the same kind of things – I’ve done a few projects here: http://luckylarry.co.uk/tag/processing/

            Specifically check out this post involving the SRF-05 and Processing: http://luckylarry.co.uk/2009/11/arduino-basic-theremin-meets-processing/

            Hope the links help.

          • Hello Larry
            How are you?
            I am using you for different things and I hope you did not get tired of this.
            I wanted to use some Wii object but with the mac. You think that it exist a mood to get the controller in my computer?
            I am trying right now but nothing happen
            Thank you
            Lorenc

          • Hey Lorenc,

            I’ve got a Wii myself but I’ve not tried working with the controllers yet. I see a few tutorials online though – I guess its a case of receiving the signal from the Wii controller so you’ll need an RF receiver (not IR) the sensor bar doesnt receive data from the Wii controller, it sends it. You can disconnect the Wii sensor bar and use TV remotes, IR leds etc… instead and the Wii controller will still work. The IR bit in the controller is actually an IR camera! cool huh?

            Check this out: http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1172459283

            And: http://www.windmeadow.com/node/45

            Loads of stuff already online about Arduino and Wii.

            Looks like you can plug the wiimote in by using the expansion port – the bit where you connect the nunchuck to the Wiimote, if you take the plug off you’ll have 6 pins that you can wire into Arduino.

            BUT – I reckon there must be a way of receiving the RF signal from the remote which would be better. Can’t think of how else the signal is sent wirelessly other than RF.

            Good luck! Let me know how you get on as I’ve yet to try doing any of this myself.

            Larry

      • hi larry.. my project is about human follower can you help me.. tnx God bless

        • what sensor could be easy to use in following the human.. can you help me please..

  • Larry, great stuff, thanks for posting. We are working on a way to locate water level in our educational river models and thinking of ultrasound. Specs on commercial units are all over the place–did you test accuracy on this and if so would you share? We need ~2mm precision over a range of about 100mm.

    • Hi Steve,

      The measurement is worked out from the time the signal is detected bouncing back – I worked this out by setting an object a metre away and dividing the time in microseconds by the distance in centimeters/ inchs etc… So if you’re using a different ultrasound sensor the first stage for calibration is to record the time when the echo is detected and go from there.

      I generally found that for large surface areas its very accurate.

      Larry.

  • Hi Larry,

    Just wondering, would this same sketch work with the SRF10 Ultrasonic Sensor?

    • Should do, just depends on the pin configuration as I think the SRF10 use only one set of pins for both echo and trigger.

  • […] experimenters and not robotics people, so screw ‘em.  I stole the timing algorithm from the luckylarry.co.uk website, just like pretty much everyone else who uses the SRF05. Good old Lucky Larry was the only […]

  • Hey Larry,

    can you explain how these lines work?

    total= total – readings[arrayIndex]; // subtract the last distance
    readings[arrayIndex] = distance; // add distance reading to array
    total= total + readings[arrayIndex]; // add the reading to the total

    won’t the total always be readings zero? I’ve ran your code and I can see that it doesn’t but this just doesnt make sense to me.

    Thanks

    • I’ve been puzzling over this a while too, but I think I finally get it. What is stored in the array is the 10 readings from the previous 10 cycles. In each cycle the current reading is averaged with the reading of 10 cycles ago.

  • Hi larry, I’m pretty interesting in building my own experimental produce but to start with, I stayed in Singapore. How do i get my hands on Arduino chip and SRF05?

    Is there like a website that deals international orders?

    Thank you!

  • Beware the SRF pins, mine have pins in reverse order than your pics!.

  • Great – works a treat – thanks for sharing…

  • how about we use Ping ultrasonic sensor which have only 3 pin??how it connection??

  • Hey is there a way too use a speaker instead of a red LED?

  • Hi,
    Great idea and description. I love when people are sharing things like this to benefit of all of us so big thank you for sharing.

    I am not a specialist and just about to begin learning about arduino and I was wondering if you could tell me if i can use a speaker instead of a LED. the idea is to use speaker to transmit audio/sound as a feedback rather then light. I am trying to build a small device that you can use for simple school project .Kids can use this device to not only learn about but also experience echolocation. they will have to navigate true simple obstacle course just using sound as main feedback. So I was thinking of connecting in a speaker instead of the LED. My question is your code has to be changed/adjusted or will do just fine. I know I could just swap the LED wth the speaker to find out but I am afraid to brake something.
    Thank you for your help.

Join the Discussion

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>