HC-SR04: todo sobre el sensor de ultrasonidos

Sensor HC-SR04

En ocasiones es necesario medir distancias y para eso tienes a tu disposición varios sensores. Ya dedicamos un artículo a hablar de un sensor de distancia de alta precisión como era el VL52L0X. Ese sensor era de tipo ToF y se basaba en mediciones muy precisas gracias a su láser. Pero si la precisión no es tan importante para ti y quieres algo que te permita medir distancias a un precio bajo, otra de las posibilidades que tienes a tu alcance es el HC-SR04.

En el caso del sensor de distancias HC-SR04, la distancia se mide mediante ultrasonidos. El sistema es similar al método óptico del VL52L0X. Es decir, se emite, hay un rebote y se recibe, pero en este caso en vez de ser un láser o IR, se trata de ultrasonidos. Si eres apasionado de la electrónica, robótica o maker aficionado, lo podrás usar para multitud de proyectos DIY como sistemas de detección de obstáculos para robots, sensores de presencia, etc.

¿Qué es el HC-SR04?

Bien, es obvio, como ya he comentado en los párrafos anteriores, el HC-SR04 es un sensor de distancia de baja precisión basado en ultrasonidos. Con él permite medir distancias de una forma sencilla y rápida, aunque en principio no se suele usar para eso. Lo más frecuente es que se utilice como un transductor para detectar obstáculos y poderlos evitar mediante otros mecanismos asociados a la respuesta del sensor.

El aspecto del HC-SR04 es muy característico y se reconoce con facilidad. Además, es un elemento bastante popular en los kits de iniciación para Arduino y necesario para multitud de proyectos. Se identifica fácilmente porque tiene dos “ojos” que realmente son los dispositivos de ultrasonidos que integra este módulo. Uno de ellos es un emisor de ultrasonidos y el otro un receptor. Trabaja a una frecuencia de 40 Khz, por tanto es inaudible para los seres humanos.

Principios del sensor de ultrasonidos

El principio en el que se basa es simular al utilizado cuando tiras una piedra a un pozo para medir su profundidad. Tiras la piedra y cronometras lo que tarda en caer al fondo. Luego haces cálculos de la velocidad por el tiempo transcurrido y obtienes la distancia que ha recorrido la piedra. Pero en ese caso el sensor eres tú.

Artículo relacionado:
ESP8266: el módulo WIFI para Arduino

En el HC-SR04, el emisor emitirá ultrasonidos y cuando reboten en un objeto u obstáculo que se encuentre en el camino serán captados por el receptor. El circuito se encargará de hacer los cálculos necesarios de ese eco para determinar la distancia. Esto también te puede ser familiar si conoces el sistema que usan algunos animales como los delfines, ballenas o murciélagos para localizar obstáculos, presas, etc.

Contando el tiempo desde que se envia el pulso hasta que se recibe respuesta se puede determinar con exactitud el tiempo y por tanto la distancia. Recuerda que [Espacio = velocidad · tiempo] pero en el caso del HC-SR04 deberá dividir esta cantidad entre /2, ya que se ha medido el tiempo desde que sale el ultrasonido y recorre el espacio hasta impactar con el obstáculo y el camino de vuelta, así que será aproximadamente de la mitad de éste…

Pinout y datasheets

Ya sabes que para ver los datos al completo del modelo que hayas adquirido, lo mejor es buscar el datasheet concreto del fabricante. Por ejemplo, aquí tienes un datasheet de Sparkfun, pero hay muchos más disponibles en PDF. No obstante, aquí te expongo los datos técnicos más importantes del HC-SR04:

  • Pinout: 4 pines para alimentación (Vcc), disparador (Trigger), receptor (Echo) y tierra (GND). El disparador indica cuándo se debe activar el sensor (cuándo se lanza el ultrasonido), y así se podrá saber el tiempo transcurrido cuando el receptor recibe la señal.
  • Alimentación: 5v
  • Frecuencia de ultrasonidos: 40 Khz, el oído humano solo puede escuchar desde 20Hz hasta 20Khz. Todo lo que esté por debajo de 20Hz (infrasonidos) y por encima de 20Khz (ultrasonidos) no será perceptible.
  • Consumo (stand-by): <2mA
  • Consumo trabajando: 15mA
  • Ángulo efectivo: <15º, en función de los ángulos de los objetos podrá tener mejores o peores resultados.
  • Distancia medida: de 2cm a 400cm, aunque a partir de los 250 cm la resolución no será muy buena.
  • Resolución media: 0.3 cm de variación entre la distancia real y la medida, así que a pesar de no considerarse de alta precisión como el láser, las medidas son bastante aceptables para la mayor parte de las aplicaciones.
  • Precio: a partir de unos 0,65€

Integración con Arduino

HC-SR04 con Arduino

Para conectarlo a Arduino no puede ser más sencillo. Tan solo te debes encargar de conectar GND a la salida correspondiente de tu Arduino marcada como tal, Vcc con la alimentación 5v de Arduino y los otros dos pines del HC-SR04 con las entradas/salidas elegidas para tu proyecto. Puedes ver que es sencillo en el esquema de Fritzing superior…

Solo debes tener una consideración, que el tigger debe recibir un pulso eléctrico de al menos 10 microsegundos para que se active adecuadamente. Previamente debes asegurarte que está en valor LOW.

En cuanto al código para Arduino IDE, no tienes que usar ninguna biblioteca ni nada por el estilo como con otros componentes. Tan solo confeccionar la fórmula para calcular la distancia y poco más… Por supuesto, si quieres que tu proyecto haga algo en respuesta a la medición del sensor HC-SR04, tendrás que agregar el código que necesites. Por ejemplo, en vez de simplemente mostrar las medidas por la consola, puedes hacer que para ciertas distancias unos servomotores se muevan en un sentido u otro para evitar el obstáculo, o que un motor pare, que una alarma se active cuando detecte proximidad, etc.

 Más información sobre la programación: Manual de Arduino (PDF gratis)

Por ejemplo, puedes ver este código básico para usarlo como base:


//Define las constantes para los pines donde hayas conectado el pin Echo y Trigger
const int EchoPin = 8;
const int TriggerPin = 9;
 
void setup() {
   Serial.begin(9600);
   pinMode(TriggerPin, OUTPUT);
   pinMode(EchoPin, INPUT);
}

//Aquí la muestra de las mediciones
void loop() {
   int cm = ping(TriggerPin, EchoPin);
   Serial.print("Distancia medida: ");
   Serial.println(cm);
   delay(1000);
}

//Cálculo para la distancia
int ping(int TriggerPin, int EchoPin) {
   long duration, distanceCm;
   
   digitalWrite(TriggerPin, LOW);  //para generar 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;   //convertimos a distancia, en cm
   return distanceCm;
}

 

Sé el primero en comentar

Deja tu comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.