
Medidor de distancias a través de ultrasonidos HC-SR04. Si estas buscando un modulo para medir distancias mediante ultrasonidos, este modulo HC-SR04 tiene muy buen precio en eBay (±3€), tiene una buena calidad/precio, tan solo 4 pines de conexión, un código de programación muy simple y un tamaño no muy grande de 4,5 x 2 cm (sin medir los pines de conexión).
En esta entrada publico una librerÃa compatible con todas las placas Arduino y Teensy, siempre que se utilice la versión 0022 o superior del IDE de arduino.
CaracterÃsticas
- Voltaje: 5 VDC
- Corriente en reposo: < 2 mA
- Salida: High 5V/Low 0V
- Angulo: < 15º
- Distancia: 2 a 450 cm
- Resolución: 0,3 cm
Pins de conexión
- VCC
- Trig (Disparo del ultrasonido)
- Echo (Recepción del ultrasonido)
- GND
Formula para medir la distancia
Distancia = {(Tiempo entre Trig y el Echo) * (V.Sonido 340 m/s)}/2

Código de Ejemplo - Medir distancia mediante el puerto serie con el modulo HC-RS04 (Serial.ino)
// Ultrasonic - Library for HR-SC04 Ultrasonic Ranging Module. // Rev.4 (06/2012) // J.Rodrigo ( www.jra.so ) // more info at www.ardublog.com #include <Ultrasonic.h> Ultrasonic ultrasonic(9,8); // (Trig PIN,Echo PIN) void setup() {   Serial.begin(9600); } void loop() {   Serial.print(ultrasonic.Ranging(CM)); // CM or INC   Serial.println(" cm" );   delay(100); }
Código de Ejemplo - Mostrar distancia del modulo HC-SR04 en un display LCD (LCD.ino)
// Ultrasonic - Library for HR-SC04 Ultrasonic Ranging Module. // Rev.4 (06/2012) // J.Rodrigo ( www.jra.so ) // more info at www.ardublog.com #include <Ultrasonic.h> #include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // LCD arduino library Ultrasonic ultrasonic(9,8); // (Trig PIN,Echo PIN) void setup() { lcd.begin(16, 2); } void loop() {   lcd.clear();   lcd.setCursor(0, 0);   lcd.print(ultrasonic.Ranging(CM)); // CM or INC   lcd.print("cm");   delay(100); }
Código de Ejemplo - Obtener tiempo (en ms) que tarda el sonido en ir y volver (Timing.ino)
// Ultrasonic - Library for HR-SC04 Ultrasonic Ranging Module. // Rev.4 (06/2012) // J.Rodrigo ( www.jra.so ) // more info at www.ardublog.com #include <Ultrasonic.h> Ultrasonic ultrasonic(9,8); // (Trig PIN,Echo PIN) void setup() {   Serial.begin(9600); } void loop() {   Serial.print(ultrasonic.Timing());   Serial.println(" ms" ); // milliseconds   delay(100); }
Código de Ejemplo - Utilizar dos módulos HC-SR04 a la vez (TwoOrMore.ino)
// Ultrasonic - Library for HR-SC04 Ultrasonic Ranging Module. // Rev.4 (06/2012) // J.Rodrigo ( www.jra.so ) // more info at www.ardublog.com #include <Ultrasonic.h> Ultrasonic ultraleft(9,8); // (Trig PIN,Echo PIN) Ultrasonic ultraright(6,7); // (Trig PIN,Echo PIN) void setup() {   Serial.begin(9600); } void loop() {   Serial.print("Left: ");   Serial.print(ultraleft.Ranging(CM)); // CM or INC   Serial.print(" cm " );   delay(50);   Serial.print("Right: ");   Serial.print(ultraright.Ranging(CM)); // CM or INC   Serial.println(" cm" );   delay(50); }
Updated & Fixed - rev.2 (6/2011)
Tras probarla, me di cuenta que habÃa un problema en la librerÃa, que si el obstáculo estaba muy lejos se quedaba esperando el PulseIn del rebote del sonido 1 segundo y eso hacia que la programación de Arduino fuese muy lenta si no habÃa obstáculos cercanos (se paraba 1 segundo a esperar la señal), la nueva versión esta limitado el PulseIn a 30 ms ( ± 5 metros) de esa manera cada vez que queramos medir la distancia solo perderemos como mucho 30 ms. ¡ATENCIÓN! Para que funcione la ultima actualización de esta librerÃa requiere la ultima versión del software de Arduino ( 0022 o superior).
 Updated & Fixed - rev.3 (6/2012)
 Añado la compatibilidad con arduino IDE 1.0.1 y anteriores (gracias a @cbolanos79) y la posibilidad de añadir más de un sensor. También he añadido dos ejemplos nuevos.
 Updated & Fixed - GitHub (7/2012)
 He decidido mover la librerÃa a GitHub, para asà distribuirla de mejor manera y mantenerla más actualizada.
Library
04/2011: Ultrasonic.zip (2 KB)
06/2011: Ultrasonic_rev2.zip (3 KB)
06/2012: Ultrasonic_rev3.zip (4 KB)
11/2012: Ultrasonic-HC-SR04.zip (6 KB) (GitHub)
Tags: distance, fast, fix, fixed, HC-SR04, Library, module, rapido, scan, slow, Ultrasonic, ultrasonidos

Yo he adquirido este sensor hace poco, y probandolo, me doy cuenta que me falla mucho a distancias de menos de 5cm, puede ser por el sensor? lo conecto a los 5v de Arduino y aún asà me fuincinoa bien..
08.03.11 a las 17:08
Otro problema que tengo es que lo estoy intentando meter en un coche. Si no conecto los motores, el sensor mide bien, sin ninguna fluctuación de la señal, el problema es cuando conecto el motor, que las mediciones me fluctuan bastante y no me da la medición correcta, puede ser que las ruedas hacen mucho ruido?? e interfieren en la medición?¿
08.04.11 a las 18:18
i love your blog, i have it in my rss reader and always like new things coming up from it.
09.05.11 a las 04:12
Hola Santiago, siento haber tardado tanto en contestarte pero he estado fuera todo el mes de agosto y sin Internet!! =/
Yo lo estoy utilizando en un proyecto mio ( Mobility Shield 4WD ) y el único problema que me da es como tu as dicho en distancias muy cortas que no me detecta con mucha precisión, asà que no se que puede ser, te recomiendo que preguntes en los foros en español de arduino donde seguro te pueden ayudar!
Un saludo!
09.08.11 a las 23:46
Sólo querÃa escribirle unas lÃneas para decirle a su sitio realmente genial! He estado buscando esta solución durante mucho tiempo… thx
11.11.11 a las 13:00
Disculpa de casualidad tendras el codigo para el sensor con puerto USB.agradezco el foro y la informacion, esperando tu cordial respuesta. Gracias!
04.19.12 a las 01:50
Hola Zamora, a que sensor te refieres? ya que este no tiene puerto USB =|
04.21.12 a las 21:33
hola, te cuento q tengo todos lo materiales para realizar el sensor, pero copio los codigos en mi programa de arduino y no me funciona, soy un poco nulo en placas arduino asi q agradeceria la ayuda, saludos
06.13.12 a las 02:21
Hola Claudio, creo que te podremos ayudar mejor en el foro de Arduino en español, Un saludo!
07.08.12 a las 19:13
Hola alguien a hecho la libreria para medir en mm.
07.21.12 a las 22:22
Hola Fernando, tienes el ejemplo de “Timing” que es más preciso que los cm, tendré en cuenta tu sugerencia para la próxima actualización de la librerÃa.
07.26.12 a las 14:26
Efectivamente esos “fallos” son debidos al sensor, pues estás fuera de su rango de actuación. Todo sensor posé un rango de medidas, en el cual estas son buenas. En este caso se debe a la separación entre el generador de ondas ultrasónicas y el receptor, que generan un triángulo con el objeto. Al bajar la distancia del objeto de una distancia umbral las ondas ya no son capaces de llegar al receptor.
Por otro lado, en el caso de los motores, creo que estas a utilizar la misma fuente de alimentación para motores y sensores. Es recomendable separar la alimentación de alta potencia y de baja potencia, ya sea con fuentes independientes o con otro tipo de dispositivos o barreras como pueden ser los optoacoplador.
11.09.12 a las 12:07
hay alguna libreria que permita medir mas de 1 metro??
he probado esta , y solo me permite 51cm… es lo maximo que mide…
11.30.12 a las 18:06
Hola Lisergio, la librerÃa viene “capada” a 3000 microsegundos para hacer medidas más rápidas, por que a partir de esa distancia ya empieza a cometer muchos errores este sensor, pero puedes poner la distancia máxima que necesites aquà te dice como: Sensor ultrasonico HC-SR04 medir más de 51 cm
Un saludo!
11.30.12 a las 18:50
Perfecto!!!
Muchas gracias….
Necesitaba entre en 60 y 130 cm… ahora una maravilla!
asin si!!!
12.01.12 a las 00:09
el sensor a distancias cortas falla por la zona de incertidumbre, todos los ultrazonicos tienen un rango al inicio de falla, esto se debe a que en esa zona se produce ruido y no son confiables los valores por la cercania, chocan las señales
03.04.13 a las 19:53
Estimados, les comento que estoy intentando un proyecto con este sensor pero tengo el problema que no detecta nada mas alla de 1.2 mts aproximadamente. El proyecto lo estoy realizando con un PIC18F452 y el codigo de inicio y lectura es el siguiente:
void iniciar_sr04_h() //Funcion para enviar el pulso al trigger del ultrasonico
{
dist_h=0;
output_high(sr04_o_h);
delay_us(20); //retardo de 20 us mayor a los 10 us fijado por el fabricante
output_low(sr04_o_h);
}
void distancia_h()
{
//En esta funcion se leera el sensor de distancia horizontal
while(!input(sr04_i_h)); //Esperar a que en el PA3 entre un nivel alto (inicio de medicion)
while(input(sr04_i_h) && dist_h<420) //Esperar a que en el PA3 entre un nivel bajo o la distancia sea mayor a 4 mts (final de medicion)
{
//Comienza la medicion de la distancia. Se usa un ciclo while que incrementa cada 60us la variable dist_h mientras el pin
//de eco sea = 1. Los 58us es el tiempo aproximado que tarda en viajar el sonido 2cm osea 1cm ida y vuelta (VS=343m/s a 20°C)
dist_h++;
delay_us(58); //retardo de 58 us
}
delay_ms(50);
}
Cualquier comentario es bienvenido. muchas gracias
05.06.13 a las 15:39
exelente blog me sirvio de mucho, todo bn!!
05.09.13 a las 15:50