Sensor ultrasónico con Arduino (HC-SR04): conexión y código paso a paso

¿Quieres que tu Arduino "vea" a qué distancia está un objeto, como hacen los sensores de parqueo de los carros? El sensor ultrasónico HC-SR04 con Arduino es la forma más fácil y económica de lograrlo. En esta guía para principiantes te explico cómo funciona, cómo conectar sus cuatro pines, un código completo listo para copiar y un segundo proyecto: una alarma de proximidad con LED y buzzer. No necesitas instalar librerías.

Qué es el sensor ultrasónico HC-SR04 y para qué sirve

El HC-SR04 es un módulo que mide distancias sin tocar el objeto. Tiene dos "parlantes" redondos: el marcado con T (transmisor) emite un sonido de 40 kHz, demasiado agudo para que lo escuchemos, y el marcado con R (receptor) escucha el eco que rebota en el objeto.

Algunos usos típicos del sensor ultrasónico con Arduino:

  • Robots que esquivan obstáculos.
  • Sensor de parqueo con pitidos que se aceleran al acercarse.
  • Medidor del nivel de agua de un tanque.
  • Caneca de basura que abre la tapa sola con un servomotor.

Cómo funciona: Trig, Echo y la velocidad del sonido

Diagrama de tiempos del sensor HC-SR04: pulso Trig de 10 µs, ráfaga de 8 pulsos a 40 kHz y pulso Echo cuya duración es el tiempo de ida y vuelta

Una medición tiene tres momentos:

  1. El Arduino pone el pin Trig en HIGH durante al menos 10 microsegundos (µs).
  2. El módulo emite una ráfaga de 8 pulsos de ultrasonido a 40 kHz y pone el pin Echo en HIGH.
  3. Cuando el eco regresa, Echo vuelve a LOW. El tiempo que Echo estuvo en HIGH es lo que tardó el sonido en ir hasta el objeto y volver.

Con ese tiempo aplicamos la fórmula de siempre: distancia = velocidad × tiempo. La velocidad del sonido en el aire, a unos 20 °C, es de aproximadamente 343 m/s, que equivale a 0,0343 cm por microsegundo. Como el sonido hizo el viaje de ida y de vuelta, dividimos entre 2:

distancia (cm) = tiempo (µs) × 0,0343 / 2

Ejemplo: si Echo dura 1.000 µs, la distancia es 1.000 × 0,0343 / 2 = 17,15 cm. Un atajo que trae la hoja de datos es dividir el tiempo entre 58: 1.000 / 58 ≈ 17 cm. La hoja de datos usa 340 m/s; la diferencia es menor al 1 %.

Características técnicas del HC-SR04

Estos son los datos de la hoja de datos del fabricante (ElecFreaks):

ParámetroValor
Voltaje de trabajo5 V DC
Corriente de trabajo15 mA
Frecuencia del ultrasonido40 kHz
Rango de medición2 cm a 400 cm
ResoluciónHasta 3 mm en condiciones ideales
Ángulo de medición15°
Señal de disparo (Trig)Pulso TTL de 10 µs
Señal de salida (Echo)Pulso TTL de duración proporcional a la distancia
Tiempo recomendado entre medicionesMás de 60 ms
Dimensiones45 × 20 × 15 mm

En la práctica, con objetos reales, espera una precisión de más o menos 1 cm.

Pines del HC-SR04 y conexión con Arduino Uno

Pin del HC-SR04FunciónSe conecta en el Arduino Uno a
VCCAlimentación de 5 V5V
TrigEntrada de disparoPin digital 9
EchoSalida del pulso de ecoPin digital 10
GNDTierraGND
Esquema de conexión del sensor ultrasónico HC-SR04 con Arduino Uno: VCC a 5V, Trig al pin 9, Echo al pin 10 y GND a GND

Paso a paso para conectarlo

  1. Desconecta el Arduino del USB antes de cablear.
  2. Inserta el HC-SR04 en la protoboard con los transductores mirando hacia afuera, sin nada delante. Si nunca has usado una, revisa primero cómo usar una protoboard paso a paso.
  3. Conecta un cable rojo de VCC al pin 5V del Arduino.
  4. Conecta un cable negro de GND a cualquier pin GND del Arduino.
  5. Conecta Trig al pin 9 y Echo al pin 10.
  6. Revisa dos veces que VCC y GND no estén invertidos y conecta el USB.

Código para el sensor ultrasónico con Arduino (sin librerías)

Copia este sketch en el IDE de Arduino, elige la placa Arduino Uno y el puerto correcto, y súbelo:

// Sensor ultrasónico HC-SR04 con Arduino Uno
// Trig -> pin 9 | Echo -> pin 10 | VCC -> 5V | GND -> GND

const int PIN_TRIG = 9;
const int PIN_ECHO = 10;

void setup() {
  Serial.begin(9600);
  pinMode(PIN_TRIG, OUTPUT);
  pinMode(PIN_ECHO, INPUT);
  digitalWrite(PIN_TRIG, LOW);
}

void loop() {
  // 1. Pulso de disparo de 10 us
  digitalWrite(PIN_TRIG, LOW);
  delayMicroseconds(2);
  digitalWrite(PIN_TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(PIN_TRIG, LOW);

  // 2. Medir cuánto tiempo queda Echo en HIGH (máximo 30 ms)
  unsigned long tiempo = pulseIn(PIN_ECHO, HIGH, 30000UL);

  // 3. Calcular y mostrar la distancia
  if (tiempo == 0) {
    Serial.println("Sin eco: fuera de rango");
  } else {
    float distancia = tiempo * 0.0343 / 2.0;   // en cm
    Serial.print("Tiempo: ");
    Serial.print(tiempo);
    Serial.print(" us  ->  Distancia: ");
    Serial.print(distancia, 1);
    Serial.println(" cm");
  }

  delay(100);   // más de 60 ms entre mediciones
}

Qué hace cada parte del código

  • Pulso de disparo: Trig en LOW 2 µs y luego en HIGH 10 µs.
  • pulseIn(): espera a que Echo suba y mide en microsegundos cuánto dura en HIGH. El tercer parámetro (30000) es un límite de 30 ms: si no llega eco, devuelve 0 y el programa no se bloquea.
  • delay(100): deja más de 60 ms entre mediciones, como recomienda el fabricante.

Ver las lecturas en el monitor serie

Monitor serie de Arduino mostrando el tiempo del pulso Echo y la distancia en centímetros medida con el HC-SR04

Abre Herramientas > Monitor serie y elige 9600 baudios. Acerca y aleja la mano o un cuaderno frente al sensor: verás cómo cambian el tiempo y la distancia. Compruébalo con una regla a 10, 20 y 30 cm.

¿Y la librería NewPing? Es una librería popular que simplifica el código (por ejemplo, con sonar.ping_cm()). Es opcional: este código funciona sin instalar nada.

Ejemplo 2: alarma de proximidad con LED y buzzer

Ahora haremos un sensor de parqueo: si algo se acerca a menos de 20 cm, se enciende un LED y suena un buzzer que pita más rápido cuanto más cerca esté el objeto.

Materiales y conexión adicional

  • El mismo HC-SR04 conectado como antes (Trig al 9 y Echo al 10).
  • Un LED rojo: el ánodo (pata larga) al pin 7 a través de una resistencia de 220 Ω, y el cátodo a GND. Si quieres saber por qué esa resistencia, mira los ejercicios resueltos de la ley de Ohm.
  • Un buzzer activo de 5 V (o un módulo de buzzer): positivo al pin 8 y negativo a GND. Si es un buzzer grande, conéctalo a través de un transistor.

Si es tu primer LED con Arduino, te sirve la guía de cómo encender un LED con Arduino Uno.

// Alarma de proximidad con HC-SR04, LED y buzzer activo
const int PIN_TRIG = 9;
const int PIN_ECHO = 10;
const int PIN_LED = 7;
const int PIN_BUZZER = 8;
const float DISTANCIA_ALARMA = 20.0;   // en cm

float medirDistancia() {
  digitalWrite(PIN_TRIG, LOW);
  delayMicroseconds(2);
  digitalWrite(PIN_TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(PIN_TRIG, LOW);
  unsigned long tiempo = pulseIn(PIN_ECHO, HIGH, 30000UL);
  if (tiempo == 0) return -1;          // no hubo eco
  return tiempo * 0.0343 / 2.0;
}

void setup() {
  pinMode(PIN_TRIG, OUTPUT);
  pinMode(PIN_ECHO, INPUT);
  pinMode(PIN_LED, OUTPUT);
  pinMode(PIN_BUZZER, OUTPUT);
}

void loop() {
  float d = medirDistancia();

  if (d > 0 && d < DISTANCIA_ALARMA) {
    digitalWrite(PIN_LED, HIGH);
    digitalWrite(PIN_BUZZER, HIGH);
    delay(50);
    digitalWrite(PIN_BUZZER, LOW);
    delay((unsigned long)(d * 10));    // más cerca = pitidos más rápidos
  } else {
    digitalWrite(PIN_LED, LOW);
    digitalWrite(PIN_BUZZER, LOW);
    delay(100);
  }
}

La función medirDistancia() agrupa el disparo y el cálculo para que el loop() quede corto. Cambia DISTANCIA_ALARMA según tu proyecto.

Errores comunes y cómo solucionarlos

SíntomaCausa probableSolución
Siempre dice "Sin eco" o 0 cmTrig y Echo invertidos, o pines distintos a los del códigoRevisa que Trig vaya al 9 y Echo al 10, o cambia las constantes
No mide nada en un ESP32 o una placa de 3,3 VEl HC-SR04 clásico necesita 5 VAliméntalo con 5 V y baja la señal de Echo con un divisor de voltaje (por ejemplo 1 kΩ y 2 kΩ), o usa la versión HC-SR04P
Valores que saltan muchoMediciones muy seguidas, cables flojos u objeto inclinadoDeja 60 ms o más entre lecturas y promedia varias mediciones
Mide la mesa o el piso en vez del objetoEl sensor "ve" un cono de unos 15°Súbelo un poco y apúntalo derecho al frente
No detecta ropa, espuma o un lápizSuperficies blandas o muy delgadas devuelven poco ecoPrueba con objetos planos y duros; la hoja de datos recomienda un área de al menos 0,5 m²
Lecturas erradas a menos de 2 cmZona ciega del sensorMantén el objeto a más de 2 cm

Preguntas frecuentes

¿Cuál es la distancia máxima del sensor ultrasónico HC-SR04?

Según la hoja de datos, 400 cm (4 m), y la mínima es de 2 cm. Más allá de 2 o 3 metros el eco se vuelve débil.

¿Se puede usar con Arduino Nano?

Sí. El Arduino Nano trabaja a 5 V igual que el Uno, así que la conexión es la misma (VCC a 5V, GND a GND, Trig y Echo a dos pines digitales) y el código funciona sin cambios.

¿Puedo simularlo en Tinkercad antes de armarlo?

Sí. Tinkercad Circuits incluye un sensor de distancia ultrasónico y un Arduino Uno virtual. Pega este código, inicia la simulación y mueve el objeto con el mouse.

¿Por qué se divide entre 2 en la fórmula?

Porque el pulso de Echo mide el viaje completo del sonido: de ida hasta el objeto y de vuelta al sensor. La distancia al objeto es solo la mitad de ese recorrido.

¿Afecta la temperatura a la medida?

Un poco. La velocidad del sonido aumenta con la temperatura (aproximadamente 331 + 0,6 × T m/s, con T en °C). Entre 20 °C y 30 °C cambia cerca de un 2 %, poco para un robot.

¿Puedo conectar varios HC-SR04 al mismo Arduino?

Sí, cada uno con su propio par de pines Trig y Echo. Hazlos medir por turnos, con unos 60 ms entre uno y otro, para que no se escuchen entre sí.

Conclusión

El sensor ultrasónico HC-SR04 es una excelente puerta de entrada a los sensores con Arduino: solo cuatro cables, una fórmula sencilla y resultados que se ven al instante en el monitor serie. Monta primero el ejemplo básico, luego la alarma, y después combínalo con motores para un robot que esquive obstáculos. ¡Manos a la obra!

No hay comentarios