08/06/2023
¿Alguna vez te has preguntado cómo funcionan los sensores ultrasónicos en Arduino y cómo puedes integrarlos en tus propios proyectos? Estos pequeños pero potentes dispositivos son fundamentales para la detección de distancia, la evitación de obstáculos y una infinidad de aplicaciones en robótica y automatización. En este artículo, desglosaremos todo lo que necesitas saber para programar un sensor ultrasónico en tu placa Arduino de forma sencilla y efectiva, tanto utilizando librerías que facilitan el trabajo como escribiendo el código desde cero para un control total.

- ¿Qué es un Sensor Ultrasónico y Cómo Funciona?
- Configuración del Sensor Ultrasónico HC-SR04 en Arduino
- Programación del Sensor Ultrasónico en Arduino
- Consideraciones y Limitaciones de los Sensores Ultrasónicos
- Tabla Comparativa: Programación con Librería vs. Sin Librería
- Aplicaciones Comunes del Sensor Ultrasónico
- Preguntas Frecuentes (FAQ)
- Conclusión
¿Qué es un Sensor Ultrasónico y Cómo Funciona?
Antes de sumergirnos en la programación, es crucial comprender el principio detrás de los sensores ultrasónicos. Un sensor ultrasónico es un dispositivo que mide la distancia a un objeto utilizando ondas de sonido de alta frecuencia, inaudibles para el oído humano. El modelo más común y ampliamente utilizado en proyectos de Arduino es el HC-SR04.
El funcionamiento es bastante ingenioso y se basa en el eco. El sensor emite un pulso de sonido ultrasónico. Este pulso viaja a través del aire, rebota en cualquier objeto que encuentre en su camino y regresa al sensor. El sensor mide el tiempo total que tarda la onda en ir y volver. Conociendo la velocidad del sonido en el aire, podemos calcular la distancia al objeto.
El Principio de Medición: Velocidad del Sonido
La velocidad del sonido en el aire es de aproximadamente 343 metros por segundo a 20°C, con un 50% de humedad y a nivel del mar. Para nuestros cálculos en Arduino, es más práctico trabajar con centímetros y microsegundos. Si transformamos las unidades, obtenemos que el sonido recorre 0.0343 cm cada microsegundo, o lo que es lo mismo, tarda aproximadamente 29.2 microsegundos en recorrer un centímetro. Esta constante es clave.
La fórmula para calcular la distancia es la siguiente:
Distancia = (Velocidad del Sonido * Tiempo Transcurrido) / 2
Dividimos por dos porque el tiempo medido es el que tarda el sonido en ir hasta el objeto y volver al sensor (un viaje de ida y vuelta). Por ejemplo, si el sensor detecta que el pulso tardó 200 microsegundos en regresar, la distancia sería: (200 µs * 0.0343 cm/µs) / 2 = 3.43 cm.
Configuración del Sensor Ultrasónico HC-SR04 en Arduino
Para empezar a trabajar con el sensor HC-SR04, necesitarás unos pocos materiales:
- Placa Arduino (cualquier modelo, como Uno, Nano, Mega).
- Sensor Ultrasónico HC-SR04.
- Cables de conexión (jumpers macho-hembra o macho-macho, según tu protoboard).
- Una protoboard (opcional, pero recomendada para facilitar las conexiones).
Pines del Sensor HC-SR04
El sensor HC-SR04 tiene 4 pines:
- VCC: Alimentación de 5V. Conectar al pin de 5V de Arduino.
- GND: Tierra o masa del circuito. Conectar al pin GND de Arduino.
- Trig (Trigger): Pin de emisión de señal. Aquí es donde Arduino enviará el pulso para activar el sensor.
- Echo: Pin de recepción de señal. Aquí es donde el sensor enviará el pulso de regreso cuando detecte el eco.
Esquema de Conexión
Asegúrate de conectar el sensor ultrasónico a los pines correspondientes de tu placa Arduino. Una conexión típica y recomendada es la siguiente:
Tabla de Conexión HC-SR04 a Arduino Uno
| Pin HC-SR04 | Pin Arduino Uno | Descripción |
|---|---|---|
| VCC | 5V | Alimentación del sensor |
| GND | GND | Tierra del circuito |
| Trig | Digital Pin 12 | Salida para activar el sensor |
| Echo | Digital Pin 11 | Entrada para leer el eco |
Una vez conectado, podemos proceder a la programación.

Programación del Sensor Ultrasónico en Arduino
Existen dos enfoques principales para programar el sensor HC-SR04 en Arduino: utilizando una librería externa que simplifica el proceso o escribiendo el código manualmente sin librerías adicionales. Ambos métodos son válidos y cada uno tiene sus ventajas.
Opción 1: Programación con la Librería NewPing
La librería NewPing es una excelente opción que simplifica enormemente la interacción con sensores ultrasónicos. Ofrece funciones optimizadas, mayor precisión en ciertas condiciones y la capacidad de gestionar múltiples sensores. El primer paso es descargar e instalar la librería desde el gestor de librerías del IDE de Arduino (Sketch > Incluir Librería > Administrar Librerías... y buscar 'NewPing').
Ventajas de NewPing:
- Facilita la lectura de datos con funciones predefinidas.
- Mejora el rendimiento y la estabilidad.
- Permite el filtrado de datos (por ejemplo, filtro de mediana) para reducir el ruido.
- Admite el uso de un solo pin para Trig y Echo (ahorrando pines).
Código de Ejemplo con NewPing:
A continuación, se muestra un ejemplo de código básico para el sensor HC-SR04 utilizando la librería NewPing:
#include <NewPing.h> // Incluimos la librería NewPing #define TRIGGER_PIN 12 // Pin del Arduino conectado al pin Trig del sensor #define ECHO_PIN 11 // Pin del Arduino conectado al pin Echo del sensor #define MAX_DISTANCE 200 // Distancia máxima a detectar en cm (opcional, mejora el rendimiento) // Crear el objeto de la clase NewPing // Parámetros: pin Trig, pin Echo, distancia máxima NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); void setup() { Serial.begin(9600); // Inicializamos la comunicación serial a 9600 baudios } void loop() { delay(50); // Esperar 50ms entre pings (mínimo 29ms para evitar ecos) // Obtener la distancia en centímetros // sonar.ping_cm() devuelve 0 si el objeto está fuera del rango MAX_DISTANCE unsigned int distance = sonar.ping_cm(); // Imprimir la distancia en el monitor serial Serial.print("Distancia: "); Serial.print(distance); Serial.println(" cm"); } Este código es bastante sencillo. Primero, se incluye la librería. Luego, se definen los pines para Trig y Echo y una distancia máxima. Se crea una instancia del objeto NewPing. En setup(), se inicializa la comunicación serial. En loop(), se realiza una pequeña pausa y luego se llama a sonar.ping_cm() para obtener la distancia en centímetros, la cual se imprime en el monitor serial.
Opción 2: Programación sin Librerías (Manual)
Si prefieres tener un control más granular o quieres entender a fondo cómo funciona el sensor a bajo nivel, puedes programar el HC-SR04 sin depender de librerías externas. Este método implica manejar directamente los pulsos en los pines de Arduino.
Proceso Manual:
- Generar el Pulso Trigger: Se envía un pulso de 10 microsegundos (µs) al pin Trig del sensor. Antes, se recomienda poner el pin a LOW por un breve periodo (por ejemplo, 4 µs) para asegurar un 'disparo limpio'.
- Medir el Pulso Echo: Se utiliza la función
pulseIn()de Arduino para medir la duración del pul pulso HIGH que el sensor envía de regreso por el pin Echo. Esta función espera a que el pin pase a HIGH, mide el tiempo que permanece en HIGH, y luego espera a que pase a LOW para finalizar la medición. - Calcular la Distancia: Con la duración del pulso Echo, se aplica la fórmula de la Velocidad del Sonido para obtener la distancia.
Código de Ejemplo sin Librería:
Aquí te presentamos el código completo para programar el sensor HC-SR04 de forma manual:
const int EchoPin = 11; // Pin Echo del sensor conectado al pin digital 11 de Arduino const int TriggerPin = 12; // Pin Trig del sensor conectado al pin digital 12 de Arduino void setup() { Serial.begin(9600); // Inicializamos la comunicación serial pinMode(TriggerPin, OUTPUT); // Configuramos el pin Trigger como salida pinMode(EchoPin, INPUT); // Configuramos el pin Echo como entrada } void loop() { int cm = ping(TriggerPin, EchoPin); // Llamamos a la función ping para obtener la distancia Serial.print("Distancia: "); // Imprimimos la etiqueta Serial.println(cm); // Imprimimos la distancia en cm delay(1000); // Esperamos 1 segundo antes de la siguiente lectura } // Función para medir la distancia utilizando el sensor ultrasónico int ping(int TriggerPin, int EchoPin) { long duracion, distanciaCm; // Variables para almacenar la duración del pulso y la distancia // Paso 1: Generar un pulso limpio en el pin Trigger digitalWrite(TriggerPin, LOW); // Ponemos el Trigger en LOW delayMicroseconds(4); // Esperamos 4 microsegundos digitalWrite(TriggerPin, HIGH); // Activamos el Trigger con un pulso HIGH delayMicroseconds(10); // Mantenemos el pulso HIGH por 10 microsegundos digitalWrite(TriggerPin, LOW); // Ponemos el Trigger en LOW de nuevo para finalizar el pulso // Paso 2: Medir el tiempo que tarda el pulso en regresar (Echo) // pulseIn() espera a que el pin Echo se ponga en HIGH y mide su duración hasta que vuelve a LOW duracion = pulseIn(EchoPin, HIGH); // Paso 3: Calcular la distancia en centímetros // La velocidad del sonido es aproximadamente 343 m/s o 0.0343 cm/µs // Convertimos µs a cm: duracion * (0.0343 / 2) = duracion / (29.2 / 2) = duracion / 58.4 // Para evitar números flotantes: duracion * 10 / 584 (o duracion * 10 / 292 / 2) distanciaCm = duracion * 10 / 292 / 2; // Asegurarse de que la distancia no sea negativa o irrealmente alta si no hay eco if (distanciaCm == 0 || distanciaCm > 400) { return 0; // Fuera de rango o error, devuelve 0 para indicar esto } return distanciaCm; // Devolvemos la distancia calculada } En este código, la función ping() encapsula la lógica de interacción con el sensor. Es llamada repetidamente desde loop(). Se utilizan digitalWrite() y delayMicroseconds() para generar el pulso Trigger, y pulseIn() para capturar el pulso Echo. La conversión a centímetros se realiza mediante la fórmula derivada de la velocidad del sonido.
Consideraciones y Limitaciones de los Sensores Ultrasónicos
Aunque los sensores ultrasónicos son herramientas muy útiles y económicas, es importante conocer sus limitaciones para utilizarlos de manera efectiva:
- Precisión Limitada: La resolución típica del HC-SR04 es de 0.3 cm, pero la precisión real puede verse afectada por factores como la temperatura, la humedad y la composición del aire, que influyen en la velocidad del sonido.
- Superficies de los Objetos: La orientación y la textura de la superficie del objeto a medir pueden provocar que la onda se refleje en una dirección diferente, falseando la medición o impidiendo que el eco regrese al sensor. Las superficies blandas o irregulares absorben más sonido.
- Entornos con Múltiples Objetos: En entornos con muchos objetos o espacios confinados, el sonido puede rebotar en múltiples superficies, generando ecos y falsas mediciones.
- Rango de Medición: El rango teórico del HC-SR04 es de 2 cm a 400 cm. Sin embargo, en la práctica, el rango efectivo y fiable suele ser más limitado, generalmente entre 20 cm y 2 metros. Distancias muy cortas o muy largas pueden ser difíciles de medir con precisión.
- Uso en Exteriores: No son ideales para funcionamiento en exteriores debido a la presencia de corrientes de aire, ruido ambiental y variaciones de temperatura que afectan la propagación del sonido.
Para aplicaciones que requieren una precisión superior o un funcionamiento robusto en exteriores, a menudo se combinan los sensores ultrasónicos con otros tipos de sensores de distancia, como medidores por infrarrojos o sensores ópticos (LIDAR).

Tabla Comparativa: Programación con Librería vs. Sin Librería
Ambos métodos para programar el sensor HC-SR04 son válidos, pero tienen diferencias clave que pueden influir en tu elección:
| Característica | Con Librería (NewPing) | Sin Librería (Manual) |
|---|---|---|
| Facilidad de Uso | Muy alta, funciones predefinidas. | Moderada, requiere más lógica manual. |
| Código | Más conciso y legible. | Más extenso y detallado. |
| Control | Menor control de bajo nivel. | Mayor control sobre cada paso del proceso. |
| Funcionalidades Adicionales | Filtrado de ruido, múltiples sensores, etc. | Deben implementarse manualmente. |
| Tamaño del Sketch | Puede ser ligeramente mayor por la librería. | Generalmente más pequeño si se optimiza bien. |
| Curva de Aprendizaje | Más rápida para principiantes. | Más pronunciada, ideal para entender el hardware. |
Aplicaciones Comunes del Sensor Ultrasónico
A pesar de sus limitaciones, los sensores ultrasónicos son ampliamente utilizados debido a su simplicidad y bajo costo. Algunas de sus aplicaciones más comunes incluyen:
- Robótica: Detección de obstáculos para robots móviles, navegación y mapeo de entornos sencillos.
- Sistemas de Detección de Presencia: Para activar luces, alarmas o puertas automáticas cuando se detecta un objeto o persona.
- Medición de Nivel: En tanques o depósitos para medir el nivel de líquidos o sólidos.
- Sistemas de Estacionamiento: Ayuda a los conductores a determinar la distancia a otros vehículos u objetos al estacionar.
- Proyectos de Domótica: Para automatizar tareas basadas en la proximidad.
Preguntas Frecuentes (FAQ)
¿Por qué la distancia se divide por 2 en la fórmula?
La distancia se divide por 2 porque el tiempo que mide el sensor (el valor de duracion o tiempo) es el tiempo total que tarda el pulso ultrasónico en viajar desde el sensor hasta el objeto y luego regresar al sensor. Por lo tanto, para obtener la distancia unidireccional al objeto, debemos dividir el tiempo total recorrido por dos.
¿Qué es el delayMicroseconds() y por qué se usa?
delayMicroseconds() es una función de Arduino que pausa la ejecución del programa por el número de microsegundos especificado. Se utiliza en la programación manual del sensor ultrasónico para generar pulsos precisos de corta duración (como el pulso de 10 µs en el pin Trigger) y para asegurar un 'disparo limpio' poniendo el pin en LOW por unos microsegundos antes de activar el pulso HIGH.
¿Cuál es el rango de medición real del HC-SR04?
Aunque el fabricante especifica un rango teórico de 2 cm a 400 cm, el rango práctico y fiable del HC-SR04 suele estar entre 20 cm y 2 metros. Las mediciones fuera de este rango pueden ser inconsistentes o imprecisas debido a la absorción del sonido, la dispersión o la dificultad para captar el eco.
¿Qué sucede si el sensor no detecta un objeto?
Si el sensor no detecta un objeto dentro de su rango máximo (o si el eco no regresa), la función pulseIn() (en el método manual) esperará un tiempo máximo (generalmente 1 segundo en Arduino) y luego devolverá 0. Con la librería NewPing, la función ping_cm() devolverá 0 si el objeto está fuera del rango máximo configurado o si no se recibe un eco válido.
¿Puedo usar cualquier pin digital de Arduino para Trig y Echo?
Sí, generalmente puedes usar la mayoría de los pines digitales de Arduino para los pines Trig y Echo. Sin embargo, es buena práctica evitar los pines 0 y 1 (RX y TX) ya que se utilizan para la comunicación serial y podrían interferir con la carga del programa o la visualización en el monitor serial. Asegúrate de definir correctamente los pines en tu código.
Conclusión
Programar un sensor ultrasónico en Arduino es una habilidad fundamental para cualquier entusiasta de la electrónica, la robótica o la automatización. Ya sea que elijas la facilidad y las características adicionales que ofrecen librerías como NewPing, o prefieras la comprensión profunda y el control total que proporciona la programación manual, el sensor HC-SR04 es una puerta de entrada accesible y versátil a proyectos interactivos. Con los materiales adecuados y el conocimiento de los principios de funcionamiento, podrás incorporar esta tecnología a tus proyectos de forma efectiva, abriendo un mundo de posibilidades para medir distancias y dar vida a tus ideas. ¡No dudes en experimentar y explorar nuevas formas de utilizar esta fascinante tecnología!
Si quieres conocer otros artículos parecidos a Domina la Programación de Sensores Ultrasónicos en Arduino puedes visitar la categoría Librerías.
