Medir distancias con Arduino y HC-SR04 (sensor de ultrasonidos)

Hace unos días me ha llegado desde mi proveedor asiático habitual 😅 un par de módulos de sensores de ultrasonido HC-SR04 para incluir en mis próximos proyectos de electrónica.

Antes de la compra había visto numerosos vídeos en Youtube acerca de este módulo y sus usos. El bajo precio de estos me animaron a pedirlo, y allí estaba Aliexpress.

Tras la espera habitual, me acaban de llegar las dos unidades pedidas, sorprendéntemente el acabado es realmente bueno. Siempre me pregunto como es rentable fabricar y enviar estos componentes por medio mundo, a un precio tan sumamente económico.

El funcionamiento es bien sencillo: el HC-SR04 dispone de 4 pins, de los cuales dos están dedicados a la alimentación de 5v (Vcc) y tierra (Gnd), y otros dos a las señales de entrada Trig y de salida Echo. La activación de la señal de Trig genera una serie de pulsos cuyo eco es recibido y trasmitido por la salida Echo. Conociendo el espacio de tiempo desde el envío del tren de pulsos a su recepción, podemos calcular el espacio recorrido por la señal acústica (ultrasónica), y con ella la distancia al obstáculo. El rango de distancia que nos permite medir se encuentra entre los 3 y 400 cm.

Si bien no es un procedimiento muy exacto, porque puede depender de la textura, el material, la forma y la orientación del objeto, en general es un buen sensor para usos como el de esquivar obstáculos, evitar paredes o detectar la llegada de un objeto en una cinta transportadora, etc..

A continuación comparto un vídeo con una excelente descripción del módulo en el canal de Youtube vt en línea:

Para la primera prueba nos basta con un conexionado mínimo de los 4 pines a los pines del sensor a los pines de Arduino Vcc, Gnd. Pin2 (Trig) y Pin3 (Echo). Con esa sencilla configuración y el siguiente script tenemos el sistema funcionando y reportando la distancia en centímetros:

// Configuramos los pines del sensor Trigger y Echo
const int PinTrig = 2;
const int PinEcho = 3;
 
// Constante velocidad sonido en cm/s
const float VelocidadSonido = 34000.0;

// Ajuste de distancia del objeto a nuestra posición de referencia
const Ajuste = -0.2;
 
float distancia;
 
void setup()
{
  // Iniciamos el monitor serie para mostrar el resultado
  Serial.begin(9600);
  // Ponemos el pin Trig en modo salida
  pinMode(PinTrig, OUTPUT);
  // Ponemos el pin Echo en modo entrada
  pinMode(PinEcho, INPUT);
}
void loop()
{
  iniciarTrigger();
  
  // La función pulseIn obtiene el tiempo que tarda en cambiar entre estados, en este caso a HIGH
  unsigned long tiempo = pulseIn(PinEcho, HIGH);
  
  // Obtenemos la distancia en cm, hay que convertir el tiempo en segudos ya que está en microsegundos
  // por eso se multiplica por 0.000001
  distancia = (tiempo * 0.000001 * VelocidadSonido / 2.0) + Ajuste;
  Serial.print(distancia);
  Serial.print("cm");

  // Mostramos la distancia medida y una alerta si está próximo
  if(distancia<5)
  {
    Serial.print(" ALERTA - PARADA DE EMERGENCIA !!!!!!");
  }  
  else if(distancia<10)
  {
    Serial.print(" ALERTA - IMPACTO!");
  }  
  else if(distancia<20)
  {
    Serial.print(" AVISO - PROXIMIDAD!");
  }  
  Serial.println();
  delay(400);
}
 
// Método que inicia la secuencia del Trigger para comenzar a medir
void iniciarTrigger()
{
  // Ponemos el Trigger en estado bajo y esperamos 2 ms
  digitalWrite(PinTrig, LOW);
  delayMicroseconds(2);
  
  // Ponemos el pin Trigger a estado alto y esperamos 10 ms
  digitalWrite(PinTrig, HIGH);
  delayMicroseconds(10);
  
  // Comenzamos poniendo el pin Trigger en estado bajo
  digitalWrite(PinTrig, LOW);
}

Este script está basado en el publicado en https://programarfacil.com/tutoriales/fragmentos/sensor-de-ultrasonidos-con-arduino, y al que le hemos incluido unas condiciones para alertar por proximidad y un valor adicional de ajuste, que nos permite corregir las mediciones con el punto de referencia que deseemos en nuestro proyecto.

Con este script realizamos algunas pruebas y comprobamos que los sensores funcionan perfectamente y están disponibles para su uso.