Arduino Programming the HC-SR04 Project Interrupt Driven Software
Software sketch for the Arduino HC-SR04 programming project
If you don't have an oscilloscope then get a copy of my book: Sound Card Oscilloscope and build yourself some very powerful test gear to examine the inner workings of the HC-SRO4.
The sketch below takes advantage of the ATmega328 16 bit timer 1. Before you can use the code you must download and install the TimerOne library.
Download the timerOne library from http://code.google.com/p/arduino-timerone/downloads/detail?name=TimerOne-v9.zip&can=2&q= and install it using the guide http://arduino.cc/en/Guide/Libraries
Copy and paste the sketch below
Load the sketch onto your Arduino Uno and let it run. If all is well then you will see the Arduino onboard LED start to flash. This LED is located near to the USB connector. Place an object in front of the HC-SR04 sensor and vary the distance. The flash rate of the onboard LED will change to reflect the distance. Just like the parking sensor on a new car.
How the program works
The code sketch above is well commented but I will explain briefly how it works here.
When the program is loaded the first thing it does is execute the setup() function. The various pins of the Arduino are set to input or output as appropriate. Timer 1 is initialized, the interrupt service routines attached to the appropriate interrupts and the serial port is initialized.
The background loop() function then begins to run. Any routines placed in loop() are executed continuously. All of the code required to handle the HC-SR04 and the onboard LED is contained in interrupts routines so the only task in the loop() function is to send the distance measured in centimeters to the serial monitor port every 100 mS.
timerIsr() is called every time the timer 1 times out and creates an interrupt. The simplify the code this function calls two more functions. One to handle the trigger pulse and the other one to flash the onboard LED.
The trigger_pulse() function is called from timerIsr() every 50 uS and creates a trigger pulse every 4000 calls or 200 mS. The pulse generator is implemented with a simple finite state machine contained in the switch() statement. Every time this routine is called exactly one of the cases is executed. When the count reaches 200 mS the state is changed from 0 to 1 which immediately causes the trigger output to be set high and the state changed to 2. When the function is next called 50 mS later, case 2 is called which resets the trigger output to low and the state reset to 0.
echo_interrupt() is called every time the echo input signal changes state and generates an interrupt. The echo input is tested to determine whether this is the start or end of the echo pulse and start and end times recorded accordingly. If the input has changed from high to low then this is the end of the pulse and the duration is computed.
The distance_flasher() function is called from timerIsr() every 50 uS. A counter is decremented and if it reaches zero then the onboard LED is toggled and the counter is reloaded with the value of the computed echo pulse duration. This has the effect of flashing the LED faster the closer the object is to the sensor.
If you have followed this project you should now have a working model of an ultrasonic range finder or parking sensor and along the way you may have picked up a few new skills. Now please sign up to our free newsletter.
|Now subscribe to our newsletter and don't miss a thing|