Dale a tu próximo proyecto Arduino bati-poderes con el sensor de distancia ultrasónico HC-SR04 que puede informar el rango de objetos a una distancia de hasta 4 metros. Es bueno saber esto cuando intentas evitar que tu robot golpee una pared.

Son de bajo consumo (adecuados para dispositivos que funcionan con batería), asequibles, fáciles de interconectar y extremadamente populares entre los aficionados.

¿Qué es el ultrasonido?

El ultrasonido es una onda de sonido de tono alto cuya frecuencia excede el rango audible del oído humano.

Los humanos pueden escuchar ondas de sonido que vibran en un rango de aproximadamente 20 veces por segundo (un ruido sordo profundo) a 20,000 veces por segundo (un silbido agudo). Sin embargo, el ultrasonido tiene una frecuencia de más de 20 000 Hz y, por lo tanto, es inaudible para los humanos.

Descripción general del hardware HC-SR04

Un sensor de distancia ultrasónico HC-SR04 en realidad consta de dos transductores ultrasónicos.

Uno actúa como un transmisor que convierte la señal eléctrica en pulsos de sonido ultrasónico de 40 KHz. El otro actúa como receptor y escucha los pulsos transmitidos.

Cuando el receptor recibe estos pulsos, produce un pulso de salida cuyo ancho es proporcional a la distancia del objeto en frente.

Este sensor proporciona una excelente detección de rango sin contacto entre 2 cm y 400 cm (~13 pies) con una precisión de 3 mm.

Como funciona con 5 volts, se puede conectar directamente a un Arduino o cualquier otro microcontrolador lógico de 5V.

Especificaciones técnicas

Aquí están las especificaciones:

Asignación de pines del sensor ultrasónico HC-SR04

Echemos un vistazo a su pinout.

VCC suministra energía al sensor ultrasónico HC-SR04. Puedes conectarlo a la salida de 5V de tu Arduino.

Trig (disparador)pin se utiliza para disparar pulsos de sonido ultrasónico. Al configurar este pin en ALTO durante 10 µs, el sensor inicia una ráfaga ultrasónica.

Echo pin ALTO cuando se transmite la ráfaga ultrasónica y permanece ALTO hasta que el sensor recibe un eco, después de lo cual baja. Al medir el tiempo que el pin Echo permanece alto, se puede calcular la distancia.

GND es el pin de tierra. Conéctalo a tierra del Arduino.

¿Cómo funciona el sensor de distancia ultrasónico HC-SR04?

Todo comienza cuando el pin del disparador se establece en ALTO durante 10 µs. En respuesta, el sensor transmite una ráfaga ultrasónica de ocho pulsos a 40 kHz. Este patrón de 8 pulsos está especialmente diseñado para que el receptor pueda distinguir los pulsos transmitidos del ruido ultrasónico ambiental.

Estos ocho pulsos ultrasónicos viajan por el aire alejándose del transmisor. Mientras tanto, el pin de eco pasa a ALTO para iniciar la señal de eco.

Si esos pulsos no se reflejan, la señal de eco se agota y baja después de 38 ms (38 milisegundos). Por lo tanto, un pulso de 38 ms indica que no hay obstrucción dentro del rango del sensor.

Si esos pulsos se reflejan de vuelta, el pin de eco baja tan pronto como se recibe la señal. Esto genera un pulso en el pin de eco cuyo ancho varía de 150 µs a 25 ms dependiendo del tiempo que se tarde en recibir la señal.

Cálculo de la distancia

El ancho del pulso recibido se usa para calcular la distancia desde el objeto reflejado. Esto se puede resolver usando la ecuación simple de distancia-velocidad-tiempo que aprendimos en la escuela. Una manera fácil de recordar la ecuación es poner las letras en un triángulo.

Pongamos un ejemplo para que quede más claro. Supongamos que tenemos un objeto frente al sensor a una distancia desconocida y recibimos un pulso de 500 µs de ancho en el pin de eco. Ahora calculemos qué tan lejos está el objeto del sensor. Para ello utilizaremos la siguiente ecuación.

Distancia = Velocidad x Tiempo

Aquí tenemos el valor del tiempo, es decir, 500 µs y conocemos la velocidad. ¡Por supuesto que es la velocidad del sonido! es de 340 m/s. Para calcular la distancia necesitamos convertir la velocidad del sonido en cm/µs. Es 0,034 cm/μs. ¡Con esa información ahora podemos calcular la distancia!

Distancia = 0,034 cm/µs x 500 µs

¡Pero aún no hemos terminado! Recuerde que el pulso de eco indica el tiempo que tarda la señal en enviarse y reflejarse. Entonces, para obtener la distancia, debes dividir el resultado por dos.

Distancia = (0,034 cm/µs x 500 µs) / 2

Distancia = 8,5 cm

Ahora sabemos que el objeto está a 8,5 cm del sensor.

Cableado de un sensor HC-SR04 a un Arduino

Ahora que tenemos una comprensión completa de cómo funciona el sensor ultrasónico HC-SR04, ¡podemos comenzar a conectarlo a nuestro Arduino!

Conectar el HC-SR04 a Arduino es muy fácil. Comienza colocando el sensor en tu protoboard. Conecta el pin VCC al pin de 5V en el Arduino y el pin GND al pin de tierra. Ahora conecta los pines trig y echo a los pines digitales #9 y #10 respectivamente.

Cuando hayas terminado, debería tener algo similar a la ilustración que se muestra a continuación.

Instalación de la biblioteca

Activar el sensor ultrasónico y medir manualmente el ancho del pulso de la señal recibida es mucho trabajo, pero afortunadamente hay muchas bibliotecas disponibles para nosotros. Una de las bibliotecas populares es la biblioteca NewPing. Esta es la biblioteca que usaremos en nuestros ejemplos.

La biblioteca NewPing es bastante avanzada. Admite hasta 15 sensores ultrasónicos a la vez y puede emitir directamente en centímetros, pulgadas o períodos de tiempo.

Esta biblioteca no está incluida en el IDE de Arduino, por lo que deberás instalarla primero.

Para instalar la biblioteca, ve a Sketch > Incluir bibliotecas > Administrar bibliotecas… Espera a que el Administrador de bibliotecas descargue el índice de la biblioteca y actualice la lista de bibliotecas instaladas.

Filtra tu búsqueda escribiendo ‘nuevo’. Haz clic en la primera entrada y luego selecciona Instalar.

Instalación de la biblioteca newping

Código de ejemplo de Arduino

// Include NewPing Library
#include "NewPing.h"

// Hook up HC-SR04 with Trig to Arduino Pin 9, Echo to Arduino pin 10
#define TRIGGER_PIN 9
#define ECHO_PIN 10

// Maximum distance we want to ping for (in centimeters).
#define MAX_DISTANCE 400	

// NewPing setup of pins and maximum distance.
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);

void setup() {
	Serial.begin(9600);
}

void loop() {
	Serial.print("Distance = ");
	Serial.print(sonar.ping_cm());
	Serial.println(" cm");
	delay(500);

Aquí hay un sketch simple que usa el monitor serie para mostrar una distancia medida en centímetros. Prueba este sketch antes de comenzar un análisis detallado del mismo.

Una vez que se cargue el programa, abre tu monitor serie, configura la velocidad de transmisión en 9600 bps. Intenta apuntar el sensor a los objetos que se encuentran a tu alrededor. Deberías ver que la distancia medida comienza a transmitirse.

Explicación del código

#include "NewPing.h"

El sketch comienza al incluir la biblioteca NewPing recién instalada.

#define TRIGGER_PIN 9
#define ECHO_PIN 10
#define MAX_DISTANCE 400

Primero se definen los pines de Arduino a los que se conectan los pines Trig y Echo del HC-SR04. También hemos definido una constante llamada MAX_DISTANCE. Establecerá una distancia máxima donde los pings más allá de esa distancia se leerán como ningún ping “claro”. MAX_DISTANCE actualmente está establecido en 400 [predeterminado = 500 cm].

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);

Después de esto, se crea una instancia de la biblioteca NewPing sonar.

void setup() {
	Serial.begin(9600);
}

En la configuración, inicializamos la comunicación serial con la PC.

En el bucle, simplemente llamamos a la función ping_cm() e imprimimos el resultado en el monitor serie. Esta función envía un ping y devuelve la distancia en centímetros.

void loop() {
	Serial.print("Distance = ");
	Serial.print(sonar.ping_cm());
	Serial.println(" cm");
	delay(500);
}

Otras funciones útiles en NewPing Library

Hay algunas funciones útiles que puede usar con el objeto NewPing.

El programa anterior devuelve la distancia en centímetros. Si deseas que el resultado esté en pulgadas, usa la función sonar.ping_in().

Serial.print(sonar.ping_in());

El sketch de arriba solo tiene una resolución de un centímetro. Si deseas obtener el resultado en forma decimal, puedes usar NewPing en modo de duración en lugar de modo de distancia. Necesitas cambiar esta línea:

Serial.print(sonar.ping_cm());

con la línea de abajo

Serial.print((sonar.ping() / 2) * 0.0343);

Hay un método llamado ping_median(iterations) en la biblioteca NewPing para mejorar la precisión de tu HC-SR04. Este método toma varias medidas en lugar de una sola, descarta las lecturas fuera de rango y luego promedia las lecturas restantes. De manera predeterminada, solo toma 5 lecturas, pero puede especificar tantas como desees.

int iterations = 5;
Serial.print((sonar.ping_median(iterations) / 2) * 0.0343);

Proyecto Arduino – Buscador de distancia sin contacto

Vamos a crear un proyecto rápido para demostrar cómo un simple sensor ultrasónico se puede convertir en un buscador sofisticado de distancia sin contacto. En este proyecto, utilizaremos una pantalla LCD de 16 × 2 caracteres que muestra una barra horizontal para representar la distancia desde el objeto.

Cableado

A continuación, debemos realizar la conexión a la pantalla LCD como se muestra a continuación.

Instalación de la biblioteca

Antes de cargar el código y comenzar a jugar con el sensor, debemos instalar una biblioteca llamada LCDBarGraph. Esta biblioteca ayudará a dibujar una barra horizontal en la pantalla LCD, donde la longitud de la barra representará la distancia al objeto.

Para instalar la biblioteca, ve a Sketch > Incluir bibliotecas > Administrar bibliotecas… Espera a que el Administrador de bibliotecas descargue el índice de la biblioteca y actualice la lista de bibliotecas instaladas. Filtra su búsqueda escribiendo ‘lcdbargraph’. Haz clic en la primera entrada y luego selecciona Instalar.

Código arduino

// includes the LiquidCrystal Library
#include <LiquidCrystal.h> 

// includes the LcdBarGraph Library
#include <LcdBarGraph.h>

// Maximum distance we want to ping for (in centimeters).
#define max_distance 200

Una vez que hayas instalado la biblioteca, prueba el siguiente sketch.

// Creates an LCD object. Parameters: (rs, enable, d4, d5, d6, d7)
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); 
LcdBarGraph lbg(&lcd, 16, 0, 1); // Creates an LCD Bargraph object.
const int trigPin = 9;
const int echoPin = 10;
long duration;
int distance;

void setup() 
{
	lcd.begin(16,2); // Initializes the interface to the LCD screen
	
	pinMode(trigPin, OUTPUT);
	pinMode(echoPin, INPUT);
}
void loop() 
{
	// Write a pulse to the HC-SR04 Trigger Pin
	digitalWrite(trigPin, LOW);
	delayMicroseconds(2);
	digitalWrite(trigPin, HIGH);
	delayMicroseconds(10);
	digitalWrite(trigPin, LOW);
// Measure the response from the HC-SR04 Echo Pin
	duration = pulseIn(echoPin, HIGH);
	
	// Determine distance from duration
	// Use 343 metres per second as speed of sound
	distance= duration*0.034/2;
	
	// Prints "Distance: <value>" on the first line of the LCD
	lcd.setCursor(0,0);
	lcd.print("Distance: "); 
	lcd.print(distance);
	lcd.print(" cm");

  // Draws bargraph on the second line of the LCD
	lcd.setCursor(0,1);
	lbg.drawValue(distance, max_distance);
	delay(500);
}

 La salida se ve así.

Explicación del código:

En primer lugar, debes configurar la Biblioteca de cristal líquido como de costumbre. A continuación, crea una instancia de LcdBarGraph con la instancia de LiquidCrystal que acabas de crear. Debes hacer referencia a LiquidCrystal al constructor de LcdBarGraph.

// creating bargraph instance
LcdBarGraph lbg(&lcd, 16, 0, 1);

El constructor de LcdBarGraph toma tres parámetros más. El segundo es el número de la columna Carácter en la pantalla LCD (en nuestro caso es 16). Los dos últimos parámetros son opcionales y permiten un posicionamiento personalizado de la barra.

Después de calcular la distancia desde el sensor, usamos la función drawValue(value, maxValue) para mostrar el gráfico de barras. Dibuja una barra gráfica con un valor entre 0 y maxValue.

//display bargraph
lbg.drawValue(distance, max_distance);

Interfaz HC-SR04 con modo de 3 hilos

Cuando tienes un número limitado de pines de E/S digitales en tu Arduino, puedes aprovechar el modo de 3 pines. Normalmente, cuando conectas el sensor HC-SR04 a Arduino, necesita dos pines de E/S. Sin embargo, en el modo de 3 cables, solo necesita un pin de E/S en lugar de dos.

En este modo, se utiliza un único pin de E/S como entrada y salida. Esto es posible porque tanto Trig como Echo no se usan al mismo tiempo.

Así es como puedes conectar el sensor HC-SR04 a Arduino usando el modo de 3 hilos.

#define TRIGGER_PIN 9 // Trigger and Echo both on pin 9
#define ECHO_PIN 9

Todo lo que tienes que hacer es conectar los pines TRIG y ECHO al pin digital #9 y definir el pin 9 para ambos valores de pin en el código. El resto del código es el mismo.

¿Cuáles son las limitaciones?

El sensor ultrasónico HC-SR04 es realmente bueno en términos de precisión y usabilidad general, especialmente en comparación con otros sensores ultrasónicos de bajo costo. Esto no significa que el sensor HC-SR04 funcionará todo el tiempo. Las siguientes imágenes muestran algunas de las limitaciones del HC-SR04:

  • La distancia entre el sensor y el objeto/obstáculo es mayor a 4 metros (13 pies).
  • El objeto tiene su superficie reflectante en un ángulo poco profundo para que el sonido no se refleje en el sensor.
  • El objeto es demasiado pequeño para reflejar suficiente sonido de regreso al sensor. Además, si tu sensor HC-SR04 está montado en la parte baja de tu dispositivo, es probable que el sonido se refleje en el suelo.
  • Algunos objetos con superficies blandas e irregulares (como animales de peluche) absorben el sonido en lugar de reflejarlo, por lo que el sensor HC-SR04 puede tener dificultades para detectar dichos objetos.

How HC-SR04 Ultrasonic sensor works & interface it with Arduino. Last Minutes Engineers. https://lastminuteengineers.com/arduino-sr04-ultrasonic-sensor-tutorial/