Ir al contenido principal

Sensor HC-SR04 de ultrasonidos

¿Cómo medir distancias con el sensor de ultrasonidos HC-SR04 para Arduino?

En ocasiones tenemos la necesidad de medir  distancias de forma precisa, para ello utilizamos herramientas con las que podemos medir de forma muy precisa como, por ejemplo, un telémetro láser.


Esta herramienta permite enviar un rayo láser a un objetivo y calcular la distancia mediante el tiempo que tarda en llegar al objetivo y volver al emisor de manera muy precisa como el Nikon Prostaff.
Este es el ejemplo de  una herramienta utilizada en el ámbito deportivo con un alcance de hasta
910 metros como por ejemplo en el Golf o en deportes de grandes distancias y precisión.

Pero en el caso de los HC-SR04 son sensores que tienen un funcionamiento distinto. Estos sensores se componen de un emisor de ultrasonidos y otro de recepción de este. 
Su funcionamiento se basa en envío de pulsos de altas frecuencias, de 40 kHz que no son audibles al ser humano. 
Al rebotar el pulso en el objeto cercano, el pulso es reflejado hacia el otro sensor del HC-SR04.
Con los datos recabados por el sensor, calculamos el tiempo entre pulsos para saber la distancia.

El sensor de ultrasonidos capaz de medir distancias cortas de entre 2cm y 400cm.






Estos elementos pese a su baja exactitud en la recopilación de datos, se emplean con frecuencia para proyectos de automatización, robótica, prototipos, detección de obstáculos...

Cabe destacar que el sensor trabaja en una frecuencia de 40 kHz y por lo tanto se encuentra en la franja de frecuencias inaudibles para el ser humano.

Funcionamiento físico del sensor HC-SR04


Como se ha dicho anteriormente, el sensor se basa en la emisión de pulsos que han de ser captados por el sensor receptor para poder recabar la información.
Sus dos elementos de emisión y recepción se llaman Trigger y Echo, respectivamente. Así, el Trigger se encarga de emitir  los pulsos y Echo de recibirlos.
Utilizando la fórmula básica que relaciona la velocidad con el tiempo, podemos calcular el espacio recorrido por los ultrasonidos:

V= S/T
-S= espacio 
-T= tiempo
Con lo cual, el espacio es:

S=VxT
Debemos de tener en cuenta que se deberá dividir S entre 2 debido a que el resultado es la distancia entre emisor, objeto y el retorno a receptor.
La velocidad de propagación del sonido por el aire en temperatura ambiente de 20ºC es de 343 m/s aproximadamente. Según la temperatura y humedad esta aumenta o disminuye en X m/s por grado centígrado.
Por eso en ocasiones sería conveniente utilizar un sensor de temperatura y humedad como el DHT11
y adecuar 0.6m/s por grado centígrado.


Pines y características técnicas

Enfocándonos mejor en las características de este sensor, observamos que el HC-SR04 tiene 4 pines.Estos pines se corresponden a:
  • VCC
  • Trig
  • Echo
  • GND
Estos pines se corresponde a alimentación (VCC), Emisor (Trigger), Receptor (Echo) y tierra(GND).

Os aconsejo que siempre que cuando compráis un sensor o producto, reviséis su ficha técnica para confirmar sus pines. Este consejo se debe a que en ocasiones, se ha dibujado incorrectamente sus signos y esto puede traernos muchos quebraderos de cabeza y en ocasiones dañar el sensor.
Aquí os dejo el datasheet de HC-SR04.

-Voltaje: 5v
-Consumo en stand-by: <2mA
-Consumo de trabajo: 15mA
-Frecuencia de HC-SR04: 40Khz
-Ángulo efectivo: <15º
-Distancia: 2cm a 400cm
-Resolución: 0,3cm
-Precio: suele oscilar entre los 0,60€ a los 5€

Esquema montaje


En el montaje necesitaremos:
  • Protoboard
  • Cables
  • Arduino
  • HC-SR04
Quedaría algo así:

Pines correspondientes

-Trig: D4
-Echo: D5
-GND: GND
-VCC: 5V

Código

Este elemento puede programarse mediante librería para facilitar los pasos y ahorrar pines.
Código sin librería:

const int TriggerPin = 4;
const int EchoPin = 5;

 
void setup() {
Serial.begin(9600);
pinMode(EchoPin, INPUT);   
pinMode(TriggerPin, OUTPUT);
   
}
 
void loop() {
   int cm = ping(TriggerPin, EchoPin);
   Serial.print("Distancia:   ");
   Serial.println(cm);
   delay(1000);
}
 
int ping(int TriggerPin, int EchoPin) {
   long duration, distanceCm;
   
   digitalWrite(TriggerPin, LOW);  //generamos un pulso limpio ponemos a LOW 4us
   delayMicroseconds(4);
   digitalWrite(TriggerPin, HIGH);  //generamos Trigger (disparo) de 10us
   delayMicroseconds(10);
   digitalWrite(TriggerPin, LOW);
   
   duration = pulseIn(EchoPin, HIGH);  //medimos el tiempo entre pulsos, en microsegundos
   
   distanceCm = duration * 10 / 292/ 2;   //pasamos la distancia, en cm
   return distanceCm;
}

Código con librería

NewPing.h library

#include <NewPing.h>
 
const int UltrasonicPin = 5;
const int MaxDistance = 200;
 
NewPing sonar(UltrasonicPin, UltrasonicPin, MaxDistance);
 
void setup() {
  Serial.begin(9600);
}
 
void loop() {
  delay(50);                      // esperar 50ms entre pings (29ms como minimo)
  Serial.print(sonar.ping_cm()); // obtener el valor en cm (0 = fuera de rango)
  Serial.println("cm");
}

Comentarios