HC-SR04 – Sensor de ultrasonidos con Arduino


El sensor de ultrasonidos HC-SR04 permite determinar la distancia que existe hasta un obstáculo. Gracias a este sensor, podemos dotar de «sentidos» a nuestros proyectos. En este artículo te explico el funcionamiento de los sensores de ultrasonidos y cómo usar el sensor HC-SR04 con Arduino.

Principio básico de un sensor de ultrasonidos

Seguro que alguna vez has “jugado” con tu eco. Es irresistible hablarse a si mismo cuando estamos en la cima de una montaña o en una gran sala donde escuchamos nuestra voz retarda. Esto es causado cuando el sonido rebota en una superficie y vuelve hasta su fuente de origen con un retardo de tiempo.

Sabiendo el tiempo que tarda desde que se emite un sonido hasta que se recibe en el mismo punto, podemos determinar que distancia hay entre esos dos puntos. Este es el principio básico de funcionamiento de los sensores ultrasonido. La emisión de un sonido en alta frecuencia y la recepción de su eco.

funcionamiento del eco

Funcionamiento del sensor HC-SR04

HC-SR04

Características técnicas:

  • Alimentación: 5 v
  • Rango de medición: 2 cm a 450 cm
  • Corriente de alimentación: 15 mA
  • Frecuencia del pulso: 40 KHz
  • Apertura del pulso ultrasónico: 15º
  • Ángulo efectivo: 30º
  • Señal de disparo: 10 μs
  • Dimensiones: 45x20x15 mm

El funcionamiento de este módulo es muy sencillo. Se debe alimentar con 5V y suministrar un pulso de 10µs a través del pin Trig para iniciar la medida. En ese momento, el sensor lanzará una ráfaga de pulsos de ultrasonidos a 40Khz y la salida Echo pasa a nivel alto. Cuando el sensor recibe un eco, la salida Echo volverá de nuevo a nivel bajo.

La salida Echo es un pulso cuyo ancho será proporcional a la distancia respecto a un objeto. Si no se detecta un objeto, la salida Echo pasará a nivel bajo después de 30ms.

Si el sonido a una temperatura ambiente de 20º y una humedad relativa de 50% se desplaza a 343 m/s, entonces:

formula velocidad del sonido

Es decir, el sonido tarda 29,2 microsegundos en recorrer un centímetro. Medida que es más apropiada para la distancia y tiempo con el que se trabaja en el circuito.

Teniendo en cuenta, que el tren de pulsos ultrasónicos debe recorrer dos veces el mismo camino hasta llegar de nuevo al sensor, podemos definir la siguiente fórmula para determinar la distancia a un objeto.

formula HC-SR04

Para un correcto funcionamiento del sensor, entre dos mediadas debe existir al menos 50ms de separación. Este es el tiempo estimado por el fabricante para asegurar que el tren de pulsos se ha dispersado totalmente y no pueda ocasionar medidas erróneas.

Gráfica de tiempos HC-SR04

Precio y dónde comprar

El HC-SR04 es un sensor muy comercializado y por eso su precio es muy asequible. Puede variar mucho dependiendo del país en el que lo compres, pero suele rondar entre 1€ – 2€ de valor medio. Aquí te dejo algunas opciones de compra que yo suelo emplear cuando necesito este sensor:

Montaje

Debes conectar el sensor a tu Arduino de la siguiente forma:

Esquema Gráfico hc-sr04
Esquema eléctrico Arduino UNO.
Esquema eléctrico hc-sr04
Esquema gráfico Arduino UNO.

Ejemplo de código

Sin librerías

El siguiente código muestra el funcionamiento básico del sensor sin el empleo de librerías:

const int EchoPin = 5;
const int TrigPin = 6;

void setup() {
  Serial.begin(9600); // Iniciamos el puerto serie
  pinMode(TrigPin, OUTPUT);
  pinMode(EchoPin, INPUT);
}

void loop() {
  int cm = ping(TrigPin, EchoPin);
  Serial.print("Distancia: ");
  Serial.print(cm);
  Serial.println("cm");
  delay(1000); // Esperamos 1 segundo
}

// Función para calcular la distancia:
int ping(int TrigPin, int EchoPin) {
  long duration, distance;

  // Generamos un pulso limpio de 10us en TrigPin:
  digitalWrite(TrigPin, LOW);
  delayMicroseconds(4);
  digitalWrite(TrigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(TrigPin, LOW);

  duration = pulseIn(EchoPin, HIGH); // Medimos el tiempo entre pulsos (us)

  distance = duration / (29.2 * 2); // Aplicamos la fórmula para pasar a distancia (cm)
  return distance;
}

Funcionamiento

Para iniciar el sensor, se aplica un pulso en el pin Trig de al menos 10us. Para generar este pulso de forma limpia, previamente se pone a nivel bajo durante 4us.

La función pulseIn() obtiene el valor del pulso generado por el pin Echo. Con esta duración, solo hay que aplicar la fórmula para determinar la distancia en cm.

Si abrimos el monitor serie, tiene que aparecer los valores de distancia a los cuales se encuentran los objetos del sensor.

Puerto serie HC-SR04 sin librería

Con la librería NewPig

Utilizar una librería facilita aun más el proceso de programación y optimización. En particular, la librería NewPing aporta una serie de mejoras y funciones adicionales que merece mucho la pena incluirla en los proyectos con sensores de ultrasonidos:

  • Funciona con muchos modelos diferentes de sensores ultrasónicos: HC-SR04, SRF05, SRF06, DYP-ME007, JSN-SR04T y Parallax PING.
  • Opción para interactuar con todos los modelos (menos el SRF06) usando solo un pin de Arduino.
  • No espera un segundo completo si no se recibe el eco del tren de pulsos como todas las demás bibliotecas de ultrasonidos.
  • Compatible con toda la gama Arduino.
  • Permite realizar medidas de forma consistente y fiable hasta 30 veces por segundo.
  • Una ejecución más rápida y un tamaño de código más pequeño.
  • Permite configurar una distancia máxima.
  • Funcionamiento con múltiples sensores de ultrasonidos a la vez (hasta 15 sensores).
  • Cálculo de distancia más preciso.
  • No usa la función pulseIn(), que es muy lenta y da resultados incorrectos con algunos modelos de sensores de ultrasonidos.

Tienes que hacer un pequeño cambio en el montaje del circuito anterior para poder usarlo con la librería NewPing. Se trata de puentear el pin Trig y Echo del del sensor y conectarlo a un pin digital de arduino. El circuito debe quedarte así:

Esquema gráfico hc-sr04 con libreria
Esquema eléctrico Arduino UNO para la librería NewPing.

La librería incluye varios ejemplos como el siguiente:

#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 mediciones (29ms como mínimo)
 Serial.print(sonar.ping_cm()); // Obtener la distancia en cm (0 = fuera de rango)
 Serial.println("cm");
}

Última actualización productos de Afiliados 2023-10-21 / Imágenes de la API para Afiliados


Deja un comentario