HC-SR04: módulo ultrasonido de detección de distancia

HC-SR04: módulo ultrasonido de detección de distancia

El módulo HC-SR04

El HC-SR04 es un módulo universal de ultrasonido para sensar la presencia de un obstáculo frente al módulo y la distancia a la que se encuentra del mismo.

modulo ultrasonido HC-SR04

El módulo HC-SR04 no es específico para Arduino sino que puede conectarse a otras plataformas. Posee 4 pines de conexión etiquetados Vcc (voltaje +5v), Gnd (masa), Trig (Trigger o disparador), Echo (Eco o retorno).

Características del HC-SR04:

Voltaje: +5v DC (corriente contínua)
Consumo: < 2 mA
Frecuencia: 40khz (40.000 ciclos por segundo)
Disparador: +5v durante 10 μs mínimo
Distancia mínima de detección: 2,5 cm aprox.
Distancia máxima de detección: 5 m aprox.
Resolución: 0,3 cm

¿Cómo funciona?

El sensor de ultrasonido HC-SR04 es un dispositivo que emite un sonido de muy alta frecuencia, y luego espera a recibir el eco o rebote del mismo. Debido a que opera a muy alta frecuencia, no es audible para el oído humano.  Trabaja emitiendo 8 pulsos cortos a una frecuencia de 40 Khz (algunas personas pueden oir hasta 20khz). El trigger o disparador (pin Trig), esperará un pulso alto (HIGH) por al menos 10 μs (10 microsegundos) para comenzar su ciclo de detección a distancia. En ese momento disparará 8 pulsos altos (HIGH) seguidos a 40 Khz y luego se quedará esperando el retorno de los pulsos emitidos. Cuando detecte los pulsos emitidos, generará un pulso alto (HIGH) en la salida (pin Echo) de duración igual al tiempo que transcurrió entre la emisión y recepción del pulso.

Algo a tener en cuenta es que el sensor usa sonido (de alta frecuencia), por lo que es muy suceptible a materiales que tienden a absorber el sonido. Otras consideración es que el HC-SR04 rebotará teniendo encuenta angulos y eventulmente recibirá un eco. Esto quiere decir que si ponemos una superficie inclinada faboreceremos un rebote errático, y la distancia medida será mayor a la real.

¿Cómo se calcula la distancia a la que se encuentra el objeto detectado?

La velocidad se mide en distancia recorrida en un tiempo determinado. Por ejemplo un vehículo que circula a 20 km/h (kilómetros por hora) recorre una distancia de 20 kilómetros en exactamente 1 hora. El sonido también viaja a una velocidad específica. De hecho la velocidad del sonido es conocida y es de 340 m/s (metros por segundo). Por lo tanto, conociendo la velocidad del sonido, podemos calcular la distancia de un objeto cuando el sonido rebota en él, dado que sabemos cuanto tiempo demoró el sonido en volver, luego de que fue emitido. La fórmula sería:

(tiempo demora retorno) / (velocidad del sonido) / 2 = (distancia)

Aclaro que divido por 2 ya que el sonido debe viajar 2 veces la distancia, una vez hasta el objeto y otra vez de retorno, por lo que la distancia medida equivale al viaje de ida y vuelta. Para obtener la distancia en centímetros y dado que los tiempos que nos retornará el módulo serán del orden de los μs (microsegundos), debemos adecuar la velocidad del sonido a las unidades mencionadas: 340 m/s * 100 cm/m / 1.000.000 μs/s = 0,034 cm/μs al que podemos dividir por 2 para tener una constante simple de aplicar en nuestros cálculos: 0,017 

Ahora supongamos que recibimos un pulso de Eco del módulo de duración igual a 300 μs, entonces 300 μs * 0,017 cm/μs = 5,1 cm de distancia!

Probando todo en la práctica

Necesitará pocos componentes para probar el módulo HC-SR04. Además del mismo, necesitaremos un Arduino (en mi caso usé un Arduino UNO) y su cable USB para programarlo y para poder ver algunas salidas por consola también, un breadboard o protoboard (placa de prototipo, que no es obligatoria pero simplificará las pruebas), y 4 cables de conexion.

Elementos prueba módulo ultrasonido HC-SR04

Conectaremos el módulo de la siguiente manera:

Módulo HC-SR04 -> Arduino
Vcc -> 5v
Gnd -> GND
Trig -> D8 (Digital 8)
Echo -> D9 (Digital 9)

Arduino UNO con módulo ultrasonido HC-SR04

y luego ingresaremos el siguiente programa en nuestro Arduino:

#define TRIGGER_PIN 8
#define ECHO_PIN 9 

void setup() {
  Serial.begin(9600);
  Serial.println("Prueba de sensor HC-SR04...");
  
  // Init pins
  pinMode(TRIGGER_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
  
  // Trigger debe iniciar en LOW
  digitalWrite(TRIGGER_PIN, LOW);
  digitalWrite(ECHO_PIN, LOW);
}

void loop() {
  double pulse; // uso double para más precision
  
  // Enviando pulso de trigger. Debe ser 10us minimo
  digitalWrite(TRIGGER_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGGER_PIN, LOW);

  // Leyendo pulso de eco en us
  pulse = pulseIn(ECHO_PIN, HIGH);
 
  // Distancia = pulso / velocidad_del_sonido
  Serial.println(String(pulse*.017)+"cm"); 
  
  // Repetir cada 1 segundo
  delay(1000);
}

Carguen el sketch en su Arduino IDE y luego abran la consola con Ctrl+Shift+M y disfruten de los resultados. Prueben aproximarle algun objeto o la mano.

Avanzado

Me gusta dejarles algunos trucos avanzados. En este caso como el HC-SR04 es muy común en la construcción de robots Arduino, un error comun es no considerar lo que expliqué del rebote del sonido en los ángulos. Un truco para ello es revisar el sensor muchas veces cada 1 segundo, ejemplo 10 veces seguidas cada 1 segundo, y usar la medida menor que obtengamos. A veces aun cuando queremos engañar al sensor, obtendremos una lectura correcta de cada tantas, y nos dirá la distancia real.

Otro truco es guardar/recordar la última distancia medida y usarla para validar la nueva distancia medida. Por cierto cuando usamos el sensor en un robot o en cualquier aplicación donde el objeto en frente cambie rapidamente de distancia, es muy bueno si podemos variar la frecuencia en la que medimos la distancia a medida que nos acercamos. Esto es debido a que si nos movemos o el objeto se mueve, cuanto más cerca estamos menos tiempo tenemos para reaccionar, y debido a ello esperar 1 segundo puede significar que estemos demasiado tardes!

Espero sus comentarios y consultas!

2 comentarios en “HC-SR04: módulo ultrasonido de detección de distancia”

  1. HOLA, GRACIAS MUY INTERESANTE, YO HE LOGRADO HACER FUNCIONAR EL SENSOR DE PROXIMIDAD, PERO AHORA DEBO HACER QUE EL SENSOR DE PROXIMIDAD HAGA FUNCIONAR UN SERVOMOTOR PARA QUE SE ABRA UNA PUERTA Y SI AL CABO DE 5 SEGUNDOS NO DETECTA OBSTACULOS SE CIERRE LA PUERTA, NO SE COMO HACERLO, POR FAVOR SU AYUDA.

    • Hola, este tipo de consultas son más recomendadas para un grupo o un foro. La idea general sería si detecto un obtáculo, abro la puerta, luego espero 5 segundos, luego senso si hay un obstáculo. Si hay, sigo esperando, tal vez otros 5 segundos? y si no hay obstáculos cierro. Si buscas en el menu superior hay codigo para servos. El resto deberías investigar y probar un poco vos, sino no hay aprendizaje!

Deja un comentario