Los sensores de distancia por ultrasonidos de Arduino son muy usados en proyectos de robótica debido a su relativa simplicidad, suficiente precisión y bajo coste. Pueden utilizarse como medio para esquivar obstáculos, medir objetos, simular mapas de habitaciones y señalar la aproximación o alejamiento de objetos. El sensor ultrasónico de distancia más utilizado es el HC SR04. En este tutorial nos familiarizaremos con el funcionamiento de este medidor de distancia, consideraremos algunas variantes de conexión a Arduino, y veremos ejemplos de código para utilizarlo.
Sensor de distancia en proyectos Arduino
Principio de funcionamiento de los sensores de ultrasonidos
La capacidad de un sensor ultrasónico para medir la distancia a un objeto se basa en el principio sonar: al enviar un haz de ultrasonido y recibir su reflejo con retraso, el dispositivo determina la presencia de objetos y la distancia a ellos. Las señales ultrasónicas generadas por el receptor, reflejadas por el obstáculo, vuelven a él después de un cierto período de tiempo. Es este intervalo de tiempo el que se convierte en la característica que ayuda a determinar la distancia al objeto.
Atención: Como el principio de funcionamiento se basa en el ultrasonido, este sensor no es adecuado para determinar la distancia a los objetos que absorben el sonido. Los objetos con una superficie lisa son óptimos para la medición, mientras que los materiales porosos absorben más el sonido.
Descripción del sensor HC SR04
Este sensor proporciona una medición precisa y alta estabilidad. Su rango de medición es de 2 a 400 cm. No se ve afectado significativamente por la radiación electromagnética o la energía solar. El módulo arduino HC-SR04 también incluye un receptor y un transmisor.
El sensor ultrasónico HC SR04 tiene estos parámetros técnicos:
- Tensión de alimentación de 5V;
- Parámetro de funcionamiento de la fuerza ocular t – 15 mA;
- Corriente pasiva < 2 mA;
- Ángulo de visión general – 15°;
- Resolución táctil – 0,3 cm;
- Ángulo de medición – 30°;
- El ancho del pulso es de 10-6 s.
El sensor está equipado con cuatro pines:
- Contacto de potencia +5V DC;
- Trig – señal de entrada;
- Echo – señal de salida;
- GND es la salida «Tierra».
Esquema de interacción entre Arduino y HC SR04
El funcionamiento del sensor de ultrasonidos es el siguiente:
-
- El sensor esperará un pulso alto (HIGH) con una duración de pulso 10 μs (10 microsegundos) para comenzar su ciclo de detección a distancia.
- En el sensor ultrasónico hc sr04 conectado al arduino será convertido en 8 pulsos con una frecuencia de 40 kHz, que serán enviados a través del trigger (Trig);
- Cuando los pulsos emitidos llegan a un obstáculo, rebotan y vuelven, siendo recibidos por el receptor, el cual generará un pulso alto (HIGH) en la salida (pin Echo) de igual duración que el tiempo transcurrido entre la emisión y la recepción del pulso.
- En el lado del controlador, la señal recibida debe ser convertida a distancia utilizando fórmulas. Al dividir el ancho del pulso por 58.2, obtenemos los datos en centímetros, cuando se divide por 148 – en pulgadas.
Cómo conectar el sensor HC-SR04 a Arduino
Conectar un sensor de distancia ultrasónico a la placa Arduino es muy fácil. El diagrama de cableado se muestra en la figura.
Conectar el contacto de tierra al terminal GND de la placa Arduino, conectar la salida de potencia a 5V. Conectar las salidas Trig y Echo al arduino en los pines digitales. En el siguiente ejemplo se muestra la conexión con una placa de prototipado:
Librería NewPing para sensores ultrasónicos
Para facilitar el trabajo con el sensor de distancia HC SR04 en arduino se puede utilizar la librería NewPing. No tiene problemas con el acceso de ping y añade algunas características nuevas.
Las características de la librería son las siguientes:
- Capacidad para trabajar con varios sensores ultrasónicos;
- Puede trabajar con el sensor de distancia utilizando un solo pin;
- No hay retardo de 1 segundo en ausencia de eco de pulso;
- Para una fácil corrección de errores, hay un filtro digital incorporado;
- Máxima precisión en el cálculo de medición de distancias.
Puedes descargar la librería NewPing.h aquí
Precisión de medición de la distancia del sensor HC SR04
La precisión del sensor depende de varios factores:
- temperatura y humedad del aire;
- la distancia al objeto;
- ubicaciones relativas al sensor (según el diagrama de radiación);
- la calidad de los componentes del módulo de encóder.
El principio de funcionamiento de cualquier sensor ultrasónico se basa en el fenómeno de reflexión de las ondas acústicas que se propagan en el aire. Pero como se sabe por el curso de la física, la velocidad de propagación del sonido en el aire depende de las propiedades de este mismo aire (principalmente de la temperatura).
El sensor, sin embargo, al emitir ondas y medir el tiempo antes de su retorno, no tiene idea de en qué entorno se extenderán y toma un cierto valor promedio para los cálculos. En condiciones reales, debido al factor de temperatura del aire, el sensor HC-SR04 tiene un margen de error de 1 a 3-5 cm.
El factor de distancia es importante porque la probabilidad de reflexión de los objetos vecinos aumenta y la señal misma se desvanece con la distancia.
Además, para aumentar la precisión, el sensor debe estar correctamente alineado: el objeto debe estar dentro del cono del patrón direccional. En pocas palabras, los «ojos» del HC-SR04 deben mirar directamente al objeto.
Para reducir los errores de medición, normalmente se realizan los siguientes pasos:
- Calcular valores promedio (medir varias veces, quitar las ráfagas, luego encontrar el promedio);
- Utilizar sensores (por ejemplo, DHT11 o DHT22) para detectar la temperatura e introducir los factores de corrección;
- Montar el sensor en un servomotor, con la ayuda del cual lo vamos girando moviendo el patrón hacia la izquierda o hacia la derecha.
Ejemplos de uso de sensores de distancia
En nuestra sección de proyectos ya vimos un ejemplo de uso de este sensor. Veamos a continuación un ejemplo sencillo de su uso con una placa Arduino Uno y un sensor de distancia HC SR04. En el sketch obtendremos el valor de la distancia a los objetos y los mostraremos en el monitor del puerto en el entorno IDE de Arduino. Podrá cambiar fácilmente el croquis y el diagrama de cableado para que el sensor señale la proximidad o alejamiento de un objeto.
Conexión del sensor al arduino
Al escribir el código del programa, se utilizó la siguiente variante de conexión de sensor:
- VCC: +5V
- Trig: pin 12
- Eco: pin 11
- Tierra: (GND)
Ejemplos de Programación con el sensor ultrasónico HC SR04
Empecemos a trabajar con el sensor de inmediato con una variante relativamente compleja, sin utilizar bibliotecas externas.
En este programa, realizamos esta secuencia de acciones:
- El pulso corto (2-5 microsegundos) pone el sensor de distancia en modo de ecolocalización, enviando ondas ultrasónicas con una frecuencia de 40 kHz al espacio circundante.
- Esperar hasta que el sensor analice las señales reflejadas y determine la distancia por retardo.
- Obtener el valor de distancia. Para ello, espere hasta que HC SR04 emita un impulso proporcional a la distancia en la entrada de ECHO. Determinamos la duración del pulso mediante la función pulseIn, que devolverá el tiempo transcurrido antes de que cambie el nivel de señal (en nuestro caso, antes de que aparezca el borde del pulso).
- Una vez recibido el tiempo, lo traducimos a una distancia en centímetros dividiendo el valor por una constante (para el sensor SR04 es 29,1 para la señal de ida, y la misma cantidad para la señal de regreso, que en total dará 58,2).
Si el sensor de distancia no lee la señal, la conversión de la señal de salida nunca tomará un valor de pulso corto (LOW). Dado que algunos de los sensores tienen diferentes tiempos de retardo dependiendo del fabricante, se recomienda ajustar el tiempo de retardo manualmente cuando se utilizan los esquemas especificados (lo hacemos al principio del ciclo).
Si la distancia medida es superior a 3 metros y el HC SR04 empieza a funcionar mal, conviene ajustar el tiempo de retardo a más de 20 ms, se puede poner en 25 ó 30 ms.
#define PIN_TRIG 12 #define PIN_ECHO 11 long duration, cm; void setup() { Serial.begin (9600); // Inicializar la comunicación del puerto serie a 9600 pinMode(PIN_TRIG, OUTPUT); pinMode(PIN_ECHO, INPUT); } void loop() { // Primero, generar un pulso corto de 2-5 microsegundos. digitalWrite(PIN_TRIG, LOW); delayMicroseconds(5); digitalWrite(PIN_TRIG, HIGH); // Después de ajustar un nivel de señal alto, esperamos unos 10 microsegundos. En este punto el sensor enviará señales con una frecuencia de 40 kHz. delayMicroseconds(10); digitalWrite(PIN_TRIG, LOW); // Tiempo de retardo de la señal acústica en el sonar. duration = pulseIn(PIN_ECHO, HIGH); // Ahora es el momento de convertir el tiempo a distancia cm = (duration / 2) / 29.1; Serial.print("Distancia al objeto: "); Serial.print(cm); Serial.println(" см."); // Retraso entre mediciones para el correcto funcionamiento del ejemplo delay(250); }
Esquema utilizando la biblioteca NewPing
Ahora consideremos un sketch usando la librería NewPing. El código se simplificará enormemente ya que todas las acciones descritas anteriormente están ocultas dentro de la librería. Todo lo que tenemos que hacer es crear un objeto de la clase NewPing, especificando los pines con los que conectaremos el sensor de distancia y usaremos los métodos del objeto. En nuestro ejemplo necesitamos usar ping_cm() para obtener la distancia en centímetros.
#include <NewPing.h> #define PIN_TRIG 12 #define PIN_ECHO 11 #define MAX_DISTANCE 200 // Constante para determinar la distancia máxima, que consideraremos correcta. // Crear un objeto, cuyos métodos se utilizarán para medir la distancia. // Como parámetros pasamos el número de pines a los que están conectadas las salidas de los sensores ECHO y TRIG. NewPing sonar(PIN_TRIG, PIN_ECHO, MAX_DISTANCE); void setup() { // Inicializar la comunicación del puerto serie a 9600 Serial.begin(9600); } void loop() { // Se requiere un retardo de arranque para un funcionamiento correcto. delay(50); // Obtener el valor del sensor de distancia y almacenarlo en una variable unsigned int distance = sonar.ping_cm(); // Imprimir la distancia en el monitor del puerto Serial.print(distance); Serial.println("см"); }
Ejemplo de conexión de un telémetro ultrasónico HC SR04 con un pin
El HC-SR04 puede ser conectado al Arduino usando un solo pin. Esta opción es útil si está trabajando con un proyecto grande y no tiene suficientes pines libres. Para conectar, sólo necesitas instalar una resistencia de 2.2K entre los contactos TRIG y ECHO y conectar el contacto TRIG al Arduino.
#include <NewPing.h> #define PIN_PING 12 // Pin con Arduino conectado a los pines de disparo y eco en el sensor de distancia #define MAX_DISTANCE 200 // Distancia máxima que podemos controlar (400-500cm). NewPing sonar(PIN_PING, PIN_PING, MAX_DISTANCE); // Ajuste de los pines y distancia máxima void setup() { Serial.begin(9600); // Inicializar la comunicación del puerto serie a 9600 } void loop() { delay(50); // retardo de 50 ms entre las ondas generadas. 29 ms - valor mínimo permitido unsigned int distanceSm = sonar.ping(); // Crear una señal, obteniendo el parámetro de duración en μs (uS). Serial.print("Ping: "); Serial.print(distanceSm / US_ROUNDTRIP_CM); // Conversión del parámetro de tiempo en el valor de la distancia y salida del resultado (0 corresponde al límite permitido) Serial.println("cm"); }
Otros modelos de sensores ultrasonicos
Por último podemos agregar que si bien el modelo SR04 es el más difundido y utilizados de los sensores ultrasónicos, existen otros modelos de sensores para medir distancia. Algunos de ellos son los modelos SRF05, SRF06, DYP-ME007 y el sensor PING))) de Parallax.
En resumen
Los sensores de distancia por ultrasonidos son lo suficientemente versátiles y precisos como para ser utilizados en la mayoría de los proyectos. Este tutorial trata sobre el popular sensor HC SR04, que se conecta fácilmente a la placa del arduino (para este propósito, debe proporcionar dos pines libres a la vez, pero hay una opción para conectar con un sólo pin).
Hay varias librerías libres para trabajar con el sensor (en este tutorial sólo vemos una de ellas: NewPing), pero se puede prescindir de ellas – el algoritmo de interacción con el controlador interno del sensor es bastante simple.
Basándonos en nuestra propia experiencia, podemos decir que el sensor ultrasónico HC-SR04 muestra una precisión de un centímetro a distancias de 10 cm a 2 m. Las distancias más cortas y más largas pueden causar interferencias fuertes, que dependen en gran medida de los objetos circundantes y de cómo se utilizan. Pero en la mayoría de los casos el sensor trabaja muy bien.
Existen muchos sensores para usar con Arduino, puedes comprar los mejores sensores en nuestra tienda online o ver mas tutoriales con ejemplos de uso de algunos de ellos: