Inicio » Sensores para Arduino » Sensor ultrasónico HC-SR04

¿Qué es un sensor ultrasónico HC-SR04?

El sensor HC-SR04 es un módulo de bajo coste que utiliza ultrasonidos para medir distancias entre dos puntos y detectar objetos.

Tiene un rango de medición de 2 a 450 cm y una precisión de aproximadamente 3mm.

Está compuesto por dos transductores ultrasónicos: un transmisor y un receptor. Los veremos en detalle más adelante.

Tiene unas dimensiones muy pequeñas y gracias a sus pines podemos realizar mediciones de tiempo y distancia desde Arduino.

Módulo HC-SR04
Módulo HC-SR04

¿Para qué sirve el HC-SR04?

Se trata de un sensor muy versátil, económico y preciso, por lo que los usos del sensor HC-SR04 son muy variados, entre los que se incluyen:

Medir distancias: Este es el uso principal que se le da a este sensor. Conocer la distancia que existe entre el sensor y un objeto puede ser muy útil en diferentes escenarios como medir un espacio, la longitud de un objeto o la distancia entre dos elementos. En realidad es la base de todos los usos que vamos a ver a continuación.

Detector de objetos: Puede usarse para detectar la presencia de objetos o personas. Puede ser de gran utilidad en un sistema de alarma o en un cuenta personas de una tienda.

Evitar obstáculos: En robots y vehículos autónomos, el HC-SR04 se utiliza para evitar obstáculos al detectar objetos cercanos y ajustar la trayectoria o detenerse para evitar colisiones.

Control de aparcamiento: Muchos coches llevan un sensor similar a este en la parte trasera para medir la distancia entre el vehículo y un obstáculo. El sistema suele emitir un pitido cuando la distancia es muy corta y hay riesgo de colisión.

Control de nivel de líquido: Al colocar el sensor en la parte superior de un tanque apuntando hacía abajo, la señal ultrasónica rebota sobre la superficie del líquido, lo que permite conocer la distancia que hay entre ambos y conocer así el nivel al que se encuentra el líquido.

Proyectos de IoT: En proyectos de Internet de las Cosas (IoT), el HC-SR04 se utiliza para recopilar datos de distancia o como actuador para activar dispositivos en función de la proximidad.

Mapeo de espacios: En aplicaciones de robótica avanzada, como la creación de mapas de espacios interiores, el sensor se utiliza para determinar la distancia a las paredes y objetos circundantes.

Monitoreo de puertas y ventanas: Puede utilizarse en sistemas de seguridad para detectar la apertura o cierre de puertas y ventanas. También puede ser útil el puertas automáticas como entradas a garajes o a centros comerciales.

Proyectos educativos: Debido a su bajo coste es una excelente herramienta para enseñar principios de electrónica y programación, por lo que es ámpliamente utilizado en entornos educativos.

Especificaciones del sensor HC-SR04

En la siguiente tabla puedes consultar las especificaciones principales del sensor ultrasónico HC-SR04.

Rango de mediciónDe 2 cm a 450 cm
Precisión±3 milímetros
Ángulo de detección15 º
Fuera del ángulo pierde precisión o no detecta
Frecuencia ultrasonido40 kHz
Alimentación5 V
Consumo< 15 mA por medición
< 100 mA por segundo
Tiempo de ciclo50 mediciones por segundo
Peso10 g
Dimensiones35 x 20 x 10 mm
Interfaz2 transductores ultrasónicos:
– Transmisor
– Receptor

4 pines:
– vcc
– trig
– echo
– gnd

A continuación puedes ver las partes más importantes que componen la interfaz del módulo HC-SR04:

Partes de la interfaz del módulo HC-SR04
  • Transmisor: Es el transductor ultrasónico encargado de enviar el pulso de ultrasonido.
  • Receptor: Es el transductor responsable de recibir el echo del pulso.
  • vcc: Pin de alimentación (5V).
  • trig: Pin para disparar el pulso ultrasónico.
  • echo: Pin para leer el tiempo de vuelo.
  • gnd: Pin a tierra

¿Cómo funciona el sensor HC-SR04?

El funcionamiento del sensor HC-SR04 es muy sencillo, básicamente envía un pulso de ultrasonido y espera recibir su eco tras rebotar con un objeto. Es muy similar a la técnica que utilizan los murciélagos para detectar obstáculos cuando vuelan.

El sensor en sí no calcula ni la distancia ni el tiempo, solo cambia el estado del pin echo durante el tiempo que tarda la señal ultrasónica en ir y volver. Para calcular la distancia tenemos que aplicar la física, pero no te asustes, es un cálculo muy sencillo.

Ahora que ya tienes la idea general, vamos a ver un poco más en detalle el funcionamiento del sensor de ultrasonido HC-SR04.

Cálculo del tiempo de vuelo

Como ya vimos en el apartado anterior, el HC-SR04 tiene dos componentes principales: un transmisor de ultrasonido (asociado al pin trig) y un receptor de ultrasonido (asociado al pin echo).

Primero, hay que enviar una señal al pin trig (desde Arduino, por ejemplo), esta señal actúa como disparador para que el transmisor envíe un pulso ultrasónico de 40kHz. Este pulso es una onda sonora de alta frecuencia que está fuera del rango de audición humana, por tanto no vas a escuchar nada.

En el momento que envía el pulso a través del transmisor, también cambia el estado del pin echo que pasa de LOW a HIGH.

El pulso se propaga desde el transmisor en todas las direcciones, en un ángulo de 15º y viaja a través del aire hasta que choca con un objeto en su camino. Cuando el pulso de ultrasonido alcanza un objeto, rebota y vuelve hacia el HC-SR04 donde es recepcionado por el receptor.

Cuando el receptor del HC-SR04 detecta el pulso de ultrasonido reflejado cambia de nuevo el valor del pin echo que pasa de HIGH a LOW. Gracias a ese cambio de estado podemos medir el tiempo que ha tardado en viajar desde el transmisor hasta el objeto, rebotar y volver al receptor. Esto se llama el “tiempo de vuelo” del pulso. Con Arduino podemos calcularlo midiendo el tiempo que se encuentra el pin echo en estado HIGH.

tiempo de vuelo del pulso sensor hc-sr04

Cálculo de la distancia

Una vez conocemos el tiempo de vuelto, calcular la distancia es muy sencillo. Solo hay que aplicar la siguiente formula:

distancia = (tiempo de vuelo * velocidad del sonido) / 2

El tiempo de vuelo lo conocemos, lo podemos obtener midiendo el estado del pin echo. Para hacer el cálculo lo necesitamos en segundos.

La velocidad del sonido también la sabemos porque es una constante conocida. Es aproximadamente 343m/s a 20ºC. Si, depende de la temperatura, a mayor temperatura, mayor velocidad. Para ser más precisos, se incrementa 6m/s por cada 10ºC que aumenta la temperatura. Pero no te preocupes ahora por esto, para simplificar utilizaremos 343m/s como referencia.

Y nos queda un último detalle, la división entre 2. Recuerda que el tiempo que nos da el sensor es el que tarda el pulso de ultrasonido en ir y volver. Si solo multiplicamos el tiempo de vuelo por la velocidad del sonido, el resultado será la distancia de ida y vuelta, es decir, el doble de la distancia entre el sensor y el objeto. Como es el doble, basta con dividirla entre 2 para obtener solo la distancia en un sentido.

Como el tiempo de vuelo está en segundos(s) y la velocidad del sonido en m/s, la distancia resultante estará en metros (m).

Dicho todo esto, vamos a ver un pequeño ejemplo:

Supongamos que el sensor nos ha devuelto un tiempo de vuelo de 100 microsegundos. Aplicando la formula obtenemos el siguiente resultado:

distancia = (0,0001s * 340m/s) / 2 = 0,34m

Recuerda que el tiempo debe estar en segundos, por eso he pasado 100 microsegundos a 0,0001s. El resto de la fórmula no tiene más misterio. El resultado son 0,34 metros, es decir, 34cm.

¿Cómo se conecta el sensor ultrasónico HC-SR04 con Arduino?

En la siguiente imagen puedes ver las conexiones necesarias para conectar el modulo HC-SR04 con un Arduino:

Sensor ultrasónico HC-SR04 conectado con Arduino UNO

En realidad las conexiones son muy sencillas. Simplemente debes conectar el pin trig del sensor con un pin digital de tu placa Arduino y hacer lo mismo con el pin echo del sensor.

En mi caso, he conectado trig al pin 5 digital y echo al pin 4 digital de Arduino. Puedes usar cualquier pin digital que elijas.

En cuanto a los pines vcc y gnd, no tienen mucho misterio. El pin vcc es el de alimentación, por lo que va conectado a 5V. En el caso del pin gnd va conectado a tierra.

No hay más misterio. ¿Lo tienes? Pues a programar.

¿Cómo programar el sensor HC-SR04 con Arduino?

Tenemos dos formas de programar el sensor HC-SR04 con Arduino. Una es programando nosotros mismos todos los pasos que vimos en el apartado ¿Cómo funciona el sensor HC-SR04? y la segunda forma es utilizando una librería disponible para Arduino.

En este apartado vamos a ver ambas soluciones.

Programación sin librería

Empezaremos por la opción sin librería. El sketch que usaremos es el siguiente:

//DECLARACIONES
const int ECHO = 4;
const int TRIG = 5;

//CONFIGURACIÓN
void setup()
{
  Serial.begin(9600);
  pinMode(ECHO, INPUT);
  pinMode(TRIG, OUTPUT);
}

//FUNCIÓN LOOP
void loop()
{
  //Enviar el pulso ultrasónico:
  digitalWrite(TRIG, LOW);  
  delayMicroseconds(4);
  digitalWrite(TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG, LOW);
  
  //tiempo que tarda en recibir el echo en microsegundos
  float tiempo = pulseIn(ECHO, HIGH); 
  
  //tiempo en segundos
  tiempo = tiempo / 1000000.0;

  //calculo de la distancia en m
  float distancia = (tiempo * 343)/ 2;
  
  //resultado en el monitor serie
  Serial.print("Tiempo: ");
  Serial.print(tiempo / 2);
  Serial.print("s - Distancia: ");
  Serial.print(distancia);
  Serial.println("m");
}

Declaraciones

He declarado dos constantes enteras: ECHO y TRIG. La primera representa el pin de Arduino en el que está conectado el pin echo del sensor (en mi caso el 4) y la segunda es el pin digital en el que está conectado el pin trig del sensor (en mi caso el 5).

const int ECHO = 4;
const int TRIG = 5;

Configuración

Dentro de la función setup tenemos que inicializar el puerto serie para poder mostrar los resultados en el monitor serie del IDE. Como siempre usando la siguiente instrucción:

Serial.begin(9600);

Las siguientes instrucción de la función setup son las responsables de configurar los pines digitales ECHO y TRIG:

pinMode(ECHO, INPUT);
pinMode(TRIG, OUTPUT);

El pin ECHO se configura como entrada puesto que es el pin a través del cual recibiremos el pulso que nos permitirá calcular el tiempo.

En el caso de TRIG se configura como salida, porque enviaremos un pulso hacía el sensor para disparar la señal ultrasónica.

Función loop

La función loop es un poco extensa porque debemos implementar todos los pasos que vimos anteriormente: enviar la señal, recibir el tiempo y calcular la distancia.

Vamos a analizar el código paso a paso.

Primero enviamos el pulso ultrasónico con estas instrucciones:

digitalWrite(TRIG, LOW);  
delayMicroseconds(4);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);

Con la primera instrucción (digitalWrite(TRIG, LOW)) apagamos el transmisor para asegurarnos que la señal ultrasónica se envía justo cuando lo indiquemos y el tiempo se calcule de forma correcta. Con apagarlo 4 microsegundos es suficiente. De eso se encarga la instrucción delayMicroseconds(4).

Con la tercera instrucción (digitalWrite(TRIG, HIGH)) iniciamos el transmisor para que envíe la señal ultrasónica. Con un ciclo de 10 microsegundos es suficiente (delayMicroseconds(10)), tras el cual apagaremos el transmisor de nuevo (digitalWrite(TRIG, LOW));

Puede parecer engorroso, pero de esta forma damos tiempo al receptor a recibir el echo de forma limpia antes de enviar un nuevo pulso y evitamos que se mezclen las señales.

Una vez enviada la señal tenemos que medir el tiempo que está el pin ECHO en estado HIGH. Eso lo conseguimos con la funicón pulseIn:

float tiempo = pulseIn(ECHO, HIGH); 

Al pasa HIGH como segundo parametro a la función pulseIn, le estamos diciendo que mida el tiempo en el que está el pin en ese estado, por lo que analiza el pin ECHO esperando que pase de LOW a HIGH, mide el tiempo en microsegundos que permanece en estado HIGH y lo devuelve cuando vuelve a ser LOW.

Señal high en ECHO

El resultado son microsegundos. En la siguiente instrucción lo pasamos a segundos dividiendo entre 1000000:

tiempo = tiempo / 1000000.0;

Esta operación devuelve un valor muy pequeño con decimales, por eso la variable tiempo es de tipo float, para no perder la precisión. Si no lo hacemos así es probable que obtengamos un 0 como resultado.

Ahora que ya está el tiempo en segundos solo falta calcular la distancia aplicando la fórmula que vimos anteriormente:

float distancia = (tiempo * 343)/ 2;

El resultado serán metros. Uso float de nuevo porque el resultado puede tener decimales. Recuerda que el sensor detecta distancias desde los 2 cm. Si quieres pasarlo a cm simplemente divide entre 100.

Para ver el resultado final en el monitor serie utilizamos estas instrucciones:

Serial.print("Tiempo: ");
Serial.print(tiempo / 2);
Serial.print("s - Distancia: ");
Serial.print(distancia);
Serial.println("m");

Simplemente se muestran el tiempo y la distancia. El tiempo está dividido entre 2 para que sea solo en un sentido y no el total.

Y con esto estaría todo. Carga el sketch en tu Arduino y haz diferentes pruebas alejando y acercado un objeto para ver los resultados que obtienes.

Programación con librería

Ahora vamos a ver cómo medir la distancia con el sensor HC-SR04 utilizando la librería HCSR04 ultrasonic sensor.

Antes de hacer nada más debes instalar la librería en tu IDE de Arduino siguiendo estos pasos:

Paso 1: Abre el Library Manager de tu IDE de Arduino. Para ello ve a Sketch > Include Library > Manage Libraries… desde el menú superior del IDE:

Library Manager de Arduino

Paso 2: Busca e instala la librería. Escribe HCSR04 ultrasonic sensor en el buscador del Library Manager y automáticamente aparecerá como primer resultado. Fíjate que el autor sea gamegine:

Libraría del sensor ultrasónico HCSR04 para Arduino

Simplemente pulsa en INSTALL para comenzar su instalación en el IDE.

La instalación no tardará mucho. Puedes ver el proceso en la salida del IDE:

Instalación completada de la librería HCSR04 de Arduino

Una vez tengas la librería instalada vamos a por el sketch. Verás que es muy sencillo:

#include <HCSR04.h>

//DECLARACIONES
const int ECHO = 4;
const int TRIG = 5;

HCSR04 hc(TRIG, ECHO);

//CONFIGURACIÓN
void setup() {
  Serial.begin(9600);
}

//FUNCIÓN LOOP
void loop() {
  long distancia = hc.dist();

  Serial.print("Distancia: ");
  Serial.print(distancia);
  Serial.println(" cm");
  
  delay(60);
}

Librería

Lo primero de todo es importar la librería con la siguiente instrucción:

#include <HCSR04.h>

Declaraciones

Ahora es el turno de las declaraciones:

const int ECHO = 4;
const int TRIG = 5;

HCSR04 hc(TRIG, ECHO);

Las constantes enteras ECHO y TRIG con los pines digitales a los que hemos conectado el HC-SR04. El pin echo al pin 4 digital de Arduino y el pin trig al 5.

Lo siguiente que tenemos declarado es el objeto hc. Este objeto lo podemos crear gracias a la librería. Tenemos que pasar 2 parámetros en ese orden, el pin TRIG y el pin ECHO. Basicamente son las constantes que declaramos antes.

En cuanto a declaraciones nada más.

Configuración

La configuración no tiene mucho misterio porque la librería se encarga de todo. Simplemente inicializamos el puerto serie para mostrar a través del monitor serie la distancia calculada por el objeto hc.

void setup() {
  Serial.begin(9600);
}

Función loop

Dentro de la función loop lo único que tenemos que hacer es utilizar el objeto hc para medir la distancia. Basta con llamar a la función dist:

long distancia = hc.dist();

La función dist(), implementada en la librería, realiza todo el proceso que vimos anteriormente: envía el pulso, recibe el echo, mide el tiempo y calcula la distancia. Todos estos pasos ya están implementados, por lo que no tendremos que hacer nada, simplemente recibir el resultado que nos devuelve. Es la distancia en centímetros. Por eso lo guardo en una variable long.

Si necesitas el resultado en metros divídelo entre 100 y utiliza datos de tipo float.

Las siguientes instrucciones del sketch (líneas 18, 19 y 20) muestran el resultado en el monitor serie:

Serial.print("Distancia: ");
Serial.print(distancia);
Serial.println(" cm");

El autor de la librería recomienda realizar ciclos de al menos 60 ms entre disparos para evitar solapamientos entre la señal y el eco, por eso debemos incluir un delay de 60 ms al finalizar la función loop:

delay(60);

Como habrás comprobado, medir la distancia utilizando la librería es facilísimo. Aunque esta no es la única librería que existe para este sensor. Puedes investigar un poco en el Library Manager de tu IDE para descubrir otras opciones.


Te avisaré cuando publique nuevo contenido en paraarduino.com y en mi canal de YouTube (@ParaArduino).

No hemos podido validar tu suscripción.
¡Se ha realizado tu suscripción!

Newsletter

Suscríbete para que te avise cuando publique nuevo contenido.

Usamos Brevo como plataforma de marketing. Al hacer clic a continuación para enviar este formulario, consiente que la información proporcionada sea transferida a Brevo para su procesamiento de acuerdo con sus términos de uso