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.
En Amazon podemos encontrar las distintas versiones del Arduino original como de compatibles de otras que incorporan numerosos accesorios como el mencionado HC-SR04: