Menú
Arduino6 min lectura

Sensor ultrasónico HC-SR04 y Arduino: medir distancia

WH

Wagner Herrera

Autor y Programador Freelance

La detección de obstáculos y la medición de distancias es un pilar fundamental en robótica autónoma y sistemas de seguridad. En mi experiencia desarrollando prototipos de robótica móvil en Ecuador, el sensor ultrasonico HC-SR04 arduino ha demostrado ser la herramienta más accesible y confiable para estas aplicaciones. Sin embargo, calcular la distancia con precisión milimétrica requiere entender la velocidad del sonido en el aire y la correcta temporización de señales de disparo. En este tutorial aprenderás a conectar el HC-SR04 y visualizar la medición en una pantalla LCD I2C.

Publicidad

Principio de funcionamiento del HC-SR04

El sensor HC-SR04 funciona bajo el principio físico del eco. Emite un pulso de sonido ultrasónico inaudible para el oído humano a una frecuencia de 40 kHz. Esta onda sonora viaja a través del aire hasta impactar con un objeto físico u obstáculo, rebotando y regresando en dirección al receptor del sensor. El tiempo transcurrido entre el envío del pulso y la recepción del eco de retorno es proporcional a la distancia del obstáculo.

Para iniciar una medición, debemos enviar un pulso en alto (5V) de al menos 10 microsegundos al pin Trigger del sensor. Esto provoca que el HC-SR04 transmita una ráfaga de 8 pulsos ultrasónicos. Automáticamente, el pin de salida Echo se pone en alto y se mantiene en este estado hasta que se reciba el eco de retorno. El ancho del pulso en alto medido en microsegundos es el tiempo de viaje de ida y vuelta de la onda sonora.

Especificaciones técnicas y rango de medición

El sensor HC-SR04 opera con un voltaje nominal de 5V DC y consume una corriente estática menor a 2mA durante el reposo, subiendo a 15mA en transmisión activa. Su rango de medición de distancia va desde los 2 cm hasta un máximo teórico de 400 cm, con una resolución de 0.3 cm. El ángulo de apertura del haz de medición es menor a 15 grados, lo que significa que el área de detección es cónica y enfocada.

En mi práctica técnica, sugiero no confiar en mediciones a más de 2.5 metros debido a la dispersión acústica y la atenuación del sonido. Asimismo, la superficie del obstáculo influye fuertemente: objetos suaves como telas o algodón absorben la onda ultrasónica impidiendo el rebote correcto de la señal, mientras que superficies anguladas pueden desviar el eco lejos del receptor, dando lecturas falsamente altas.

Esquema de conexión del sensor y la pantalla LCD I2C

Para este proyecto conectaremos tanto el sensor de distancia HC-SR04 como una pantalla LCD 16x2 controlada mediante el módulo de comunicación serie I2C, lo que nos permite ahorrar pines digitales en el microcontrolador. Primero, conecta la placa de Arduino a tu protoboard compartiendo las líneas de 5V y GND.

Para el HC-SR04: conecta VCC a 5V, GND a GND, el pin Trigger al pin digital 3 de Arduino y el pin Echo al pin digital 4. Para la pantalla LCD I2C: conecta su pin VCC a 5V, GND a GND, el pin SDA al pin analógico A4 (bus I2C de datos) y el pin SCL al pin analógico A5 (bus I2C de reloj). Es fundamental verificar que la pantalla LCD reciba energía suficiente, de lo contrario la luz de fondo parpadeará impidiendo visualizar el texto.

Instalación de la librería LiquidCrystal_I2C

Para controlar la pantalla LCD 16x2 a través de los pines I2C de Arduino, es indispensable descargar una librería de soporte que traduzca las señales lógicas al controlador HD44780 de la pantalla. La librería recomendada es 'LiquidCrystal_I2C' por Frank de Brabander.

Puedes instalarla abriendo el IDE de Arduino y yendo a Programa > Incluir Librería > Administrar Librerías. Escribe 'LiquidCrystal_I2C' en el buscador e instálala. Una vez instalada, asegúrate de conocer la dirección de bus I2C de tu adaptador (generalmente es 0x27 o 0x3F), ya que este parámetro se define en el constructor de la clase para inicializar el display correctamente.

Proyecto práctico: detector de obstáculos simple

Con las lecturas de distancia listas, podemos construir una lógica que emita una advertencia si un obstáculo se acerca demasiado, simulando el sensor de reversa de un automóvil. Definiremos una distancia de seguridad de 15 cm. Si el sensor mide un valor inferior a este límite, activaremos un LED rojo en el pin digital 5 para avisar del peligro inminente.

El código calculará la distancia usando la constante de la velocidad del sonido (aproximadamente 343 m/s a 20 °C, lo que equivale a 0.0343 cm por microsegundo). Dividiremos el tiempo medido para dos debido a que la onda viaja hasta el obstáculo y regresa, necesitando solo la mitad del recorrido total.

Código completo para Arduino

A continuación se detalla el código completo con la lógica de medición y la salida en la pantalla LCD:


// Incluimos las librerias para comunicacion I2C y control del LCD
#include 
#include 

// Definimos los pines de conexion del sensor HC-SR04
const int pinTrigger = 3;
const int pinEcho = 4;
const int pinAlerta = 5; // Pin para el LED de alerta

// Inicializamos la pantalla LCD I2C en la direccion 0x27, 16 columnas y 2 filas
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup() {
  // Configura los pines del sensor y del LED
  pinMode(pinTrigger, OUTPUT);
  pinMode(pinEcho, INPUT);
  pinMode(pinAlerta, OUTPUT);

  // Inicializamos la pantalla LCD
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Iniciando...");
  delay(1000);
  lcd.clear();
}

void loop() {
  // Limpiamos el pin Trigger enviando un pulso en bajo
  digitalWrite(pinTrigger, LOW);
  delayMicroseconds(2);

  // Enviamos un pulso en alto de 10 microsegundos para disparar el sensor
  digitalWrite(pinTrigger, HIGH);
  delayMicroseconds(10);
  digitalWrite(pinTrigger, LOW);

  // Medimos el tiempo que el pin Echo permanece en alto (en microsegundos)
  long duracion = pulseIn(pinEcho, HIGH);

  // Calculamos la distancia en centimetros: tiempo * velocidad / 2
  float distancia = duracion * 0.0343 / 2.0;

  // Mostramos la distancia en el display LCD
  lcd.setCursor(0, 0);
  lcd.print("Distancia: ");
  lcd.print(distancia, 1);
  lcd.print(" cm  ");

  // Logica de deteccion de obstaculos
  if (distancia < 15.0 && distancia > 0) {
    lcd.setCursor(0, 1);
    lcd.print("OBSTACULO DETECT!");
    digitalWrite(pinAlerta, HIGH);
  } else {
    lcd.setCursor(0, 1);
    lcd.print("Camino Libre     ");
    digitalWrite(pinAlerta, LOW);
  }

  // Esperamos 250ms antes de la siguiente medicion
  delay(250);
}
  

La función pulseIn() detiene la ejecución del microcontrolador hasta recibir la respuesta del pin digital, calculando el tiempo exacto con alta precisión.

Errores comunes y cómo solucionarlos

Un error muy común es que el sensor retorne constantemente lecturas de 0 cm o valores fijos fuera de rango. Esto ocurre habitualmente cuando el pin Echo está dañado o mal conectado, impidiendo que la placa Arduino reciba el pulso de respuesta. Revisa también que no estés usando cables excesivamente delgados que introduzcan caídas de voltaje críticas en el sensor.

Otro problema es la obtención de ruidos en la medición causados por rebotes acústicos. Si colocas el sensor muy cerca de una pared lateral o en una mesa rugosa, los ecos secundarios distorsionarán la señal del pin Echo. Asegúrate de apuntar el sensor a un área despejada y mantén el retraso de muestreo en un intervalo mínimo de 60ms para dar tiempo a que los ecos residuales en la habitación se disipen por completo.

Conclusión

El sensor HC-SR04 es el punto de partida indiscutible para robótica autónoma e integración de sensado espacial de corto alcance. Aunque no sirve para exteriores con lluvia o viento, su uso en interiores es preciso y sumamente confiable. Si estás listo para llevar esto al siguiente nivel, puedes revisar nuestro portafolio de proyectos.

¿Necesitas implementar esto en un proyecto real? Revisa mis servicios de desarrollo o contáctame directamente.

Wagner Herrera - Desarrollador de Software
Wagner Herrera

Desarrollador de software con experiencia en aplicaciones web y sistemas embebidos. Apasionado por convertir ideas en productos electrónicos y digitales funcionales.

GitHub · Sobre mí
Publicidad