Componente · Sensor

HC-SR04 Ultrasonic Sensor

El HC-SR04 mide distancias de 2 cm a 4 metros mediante pulsos de ultrasonido. Cómo calcular distancias por tiempo de vuelo, cableado y resolución de problemas.

Qué es

El HC-SR04 es un sensor de distancia por ultrasonidos: la placa pequeña con dos cilindros plateados que parecen ojos de robot. Mide la distancia igual que lo haría un murciélago o un submarino: emite una ráfaga de sonido demasiado agudo para oírlo, escucha el eco y cronometra cuánto tarda el viaje de ida y vuelta. Por unos pocos dólares le da a un robot la noción del espacio que tiene delante, que es la razón por la que es el sensor por defecto del primer robot esquivador de obstáculos que casi todo el mundo monta.

Los dos cilindros son un emisor y un receptor. Uno chirría, el otro escucha. Todo lo demás en la placa es circuitería de temporización que convierte ese eco en una señal que tu microcontrolador puede medir.

Diagrama de un HC-SR04 cableado a un microcontrolador: los cables VCC, Trigger, Echo y GND con códigos de color llegan a los cuatro pines del sensor; el sensor emite ondas ultrasónicas que se reflejan en un objeto, y la distancia equivale al tiempo del eco multiplicado por la velocidad del sonido, dividido por dos.
Lanza un pulso, cronometra cuánto tarda en volver el eco y conviértelo a distancia: los cuatro cables son alimentación, masa, trigger y eco. Descargar SVG

Cómo funciona

El sensor habla un lenguaje sencillo de dos hilos:

  1. Pones el pin Trigger en HIGH durante 10 microsegundos.
  2. El sensor dispara ocho pulsos ultrasónicos a 40 kHz y pone Echo en HIGH.
  3. Cuando vuelve el eco, vuelve a bajar Echo a LOW.
  4. Mides cuánto tiempo estuvo Echo en HIGH.

Esa anchura de pulso es el tiempo de ida y vuelta. El sonido viaja a unos 343 m/s en el aire, así que distancia = (eco × 343) / 2: la división entre dos es porque el sonido fue y volvió. La mayoría del código de Arduino envuelve esto en un pulseIn() y un poco de aritmética.

Como depende de la velocidad del sonido, la lectura se desvía ligeramente con la temperatura (el sonido viaja más rápido en aire caliente). Para un robot que esquiva muros ese error es despreciable; para medición precisa sí importa, y lo compensarías por temperatura.

Cuándo usarlo

Recurre a un HC-SR04 siempre que un robot necesite saber a groso modo a qué distancia está lo más cercano: esquivar obstáculos, seguir una pared, un guardia de «no te salgas de la mesa», o disparar un comportamiento cuando algo se acerca. Su haz ancho aquí resulta útil: es difícil no ver un obstáculo.

Mira en otro sitio cuando necesites una distancia precisa, un haz estrecho o actualizaciones rápidas. Un sensor de tiempo de vuelo usa luz en lugar de sonido y da una lectura ajustada, rápida y precisa hasta el milímetro, mejor para cartografiar o para un robot que tiene que juzgar un hueco concreto.

Cableado y errores comunes

  • Echo es un pin de 5 V. En una placa de 5 V como el Arduino Uno no hay problema. En una placa de 3,3 V como el ESP32, pon un divisor de tensión en Echo o corres riesgo de dañar el pin.
  • Cuidado con el punto ciego y el cono. Nada más cerca de unos 2 cm se registra, y el haz de ~15° significa que el sensor informa de la cosa más cercana dentro de un cono: una pata de mesa al lado puede dispararlo.
  • Los blancos blandos y angulos mienten. La espuma, la tela o una pared en ángulo muy cerrado dispersan el eco lejos del receptor, así que el sensor lee «lejos» o nada. Funciona mejor sobre superficies planas y duras que lo miren de frente.
  • No sondees demasiado rápido. Deja unos 60 ms entre lecturas para que el eco anterior se haya desvanecido; si sondeas antes, los ecos espurios dan lecturas falsas. Filtrar el flujo ayuda; mira cómo domar el ruido de sensores.

Patillaje

Pin Nombre Dirección Qué hace
1 VCC Entrada 5 V. La placa consume unos 15 mA, con picos al lanzar un ping
2 Trig Entrada Pulso en HIGH de 10 µs para iniciar una medición
3 Echo Salida Se pone HIGH cuando sale la ráfaga, LOW cuando vuelve. Salida de 5 V
4 GND — Masa

Los cuatro pines están siempre en este orden, y el módulo casi siempre va orientado con los pines hacia el lado contrario a los transductores, así que VCC queda a la izquierda cuando miras a los «ojos».

Cablearlo a un Arduino

HC-SR04 Arduino Uno ESP32
VCC 5 V 5 V (desde VIN, no del riel de 3.3 V)
Trig Cualquier pin digital Cualquier GPIO
Echo Cualquier pin digital A través de un divisor: mira abajo
GND GND GND

El problema de los 3,3 V

El pin Echo entrega 5 V completos, y un GPIO de ESP32 o Raspberry Pi está especificado para 3,3 V. Meterle 5 V está por encima de su máximo absoluto, y aunque a menudo aguanta un tiempo, está dañando el pin de verdad. Dos resistencias lo arreglan:

Echo ──┬── 1 kΩ ──┬── to 3.3 V GPIO
       │          │
       │        2 kΩ
       │          │
       └──────────┴── GND

Ese divisor da 5 V × 2/(1+2) = 3,33 V. Cualquier proporción cercana a 2:1 sirve: 1 kΩ y 2 kΩ, o 10 kΩ y 20 kΩ. No uses valores por encima de unos 20 kΩ, o la capacitancia de entrada del pin ralentiza el flanco lo suficiente como para distorsionar el tiempo que intentas medir.

La aritmética de la distancia, y dónde falla

distance = (echo_microseconds x speed_of_sound) / 2

El sonido viaja a 343 m/s a 20 °C, que es 0,0343 cm/µs. De ahí sale la constante que usa todo el mundo: divide el tiempo del eco por 58,2 para obtener centímetros.

La velocidad del sonido depende de la temperatura, aproximadamente:

speed (m/s) = 331.3 + 0.606 x temperature_celsius
Temperatura Velocidad del sonido Error si asumes 20 °C
0 °C 331 m/s Lee un 3,5 % más lejos
20 °C 343 m/s —
40 °C 356 m/s Lee un 3,7 % más cerca

A 2 m eso son unos 7 cm de diferencia entre un garaje en invierno y una habitación cálida. Para esquivar obstáculos es irrelevante. Para cualquier cosa que mida un hueco, compénsalo, y si tienes un MPU-6050 o casi cualquier sensor I²C en el robot, ya tienes una lectura de temperatura.

Código mínimo funcional

const int TRIG = 9, ECHO = 10;
const unsigned long TIMEOUT_US = 25000UL;   // ~4.3 m, past the sensor's range

void setup() {
  Serial.begin(115200);
  pinMode(TRIG, OUTPUT);
  pinMode(ECHO, INPUT);
}

// Returns centimetres, or -1 when nothing came back.
float pingCm() {
  digitalWrite(TRIG, LOW);  delayMicroseconds(2);
  digitalWrite(TRIG, HIGH); delayMicroseconds(10);
  digitalWrite(TRIG, LOW);

  unsigned long us = pulseIn(ECHO, HIGH, TIMEOUT_US);
  if (us == 0) return -1.0f;        // timeout: no echo, NOT "zero distance"
  return us / 58.2f;
}

// Median of three kills the occasional wild reading.
float pingMedianCm() {
  float a = pingCm(); delay(60);
  float b = pingCm(); delay(60);
  float c = pingCm();
  if (a > b) { float t = a; a = b; b = t; }
  if (b > c) { float t = b; b = c; c = t; }
  if (a > b) { float t = a; a = b; b = t; }
  return b;
}

void loop() {
  float cm = pingMedianCm();
  if (cm < 0) Serial.println("no echo");
  else        Serial.println(cm);
  delay(60);
}

Tres detalles de ahí son la diferencia entre un sensor que funciona y uno que no:

El timeout no es opcional. pulseIn sin timeout se bloquea hasta que llega un eco, y sobre una superficie blanda o en ángulo no llega nunca. El robot parece congelarse a intervalos aleatorios, y la causa no se parece en nada al sensor.

El cero no es una distancia. Un timeout significa «no volvió nada», que normalmente significa que lo más cercano está lejos o es invisible, justo lo contrario de cero. Un código que trata un timeout como 0 cm detendrá el robot de emergencia en una habitación vacía.

La mediana de tres descarta la lectura disparatada puntual que estos sensores producen con normalidad. Un solo valor espurio de 20 cm en espacio abierto basta para hacer que un robot se salte contra un muro.

Leer el patrón del haz con honestidad

La especificación dice 15°, que suena como el haz estrecho de una linterna. No lo es: ese es el semiángulo del lóbulo principal, y la consecuencia práctica es que a 1 m el sensor está escuchando un cono de unos 50 cm de diámetro.

Distancia Anchura aproximada del cono
20 cm ~10 cm
50 cm ~26 cm
1 m ~53 cm
2 m ~105 cm

El sensor informa de la cosa más cercana en cualquier parte de ese cono, y no te dice nada sobre dónde estaba dentro del cono. Por eso un HC-SR04 detecta un marco de puerta que no sabe localizar, y por eso una pata de mesa muy apartada dispara una parada.

Para recorrer una habitación eso es una ventaja: es muy difícil no ver un obstáculo. Para medir la distancia a una cosa concreta es descalificador, y lo que quieres es un VL53L0X.

Lo que no puede ver

Esto es física, no defectos, y diseñar en torno a ello es parte del trabajo:

Superficie Qué pasa Por qué
Pared a más de ~45° Lee lejos, o nada El sonido se refleja lejos del receptor, como la luz en un espejo
Cojines, cortinas, espuma No lee nada El material absorbe el pulso en lugar de reflejarlo
Objetos muy cercanos No lee nada por debajo de ~2 cm El receptor sigue sordo tras la ráfaga de emisión
Objetos finos (una pata de silla de canto) Se detecta pero se localiza mal El cono es ancho: el retorno es real pero la dirección no
Otro HC-SR04 cerca Lecturas disparatadas al azar Oye el chirrido del otro sensor: escalona sus tiempos

Un robot que dependa solo de ultrasonidos acabará empujando una cortina hasta que algo ceda. Por eso un interruptor de choque es la fiabilidad más barata de todo el robot.

Resolución de problemas

Síntoma Causa probable Solución
Siempre lee 0 Tratar un timeout como una distancia Devuelve un valor centinela y gestiona «sin eco» explícitamente
El robot se congela al azar pulseIn sin timeout Pasa un timeout: 25000 µs cubre todo el rango
Las lecturas saltan mucho Sondeo más rápido que ~60 ms Espera a que se apague el eco anterior
Constante pero con unos puntos de error Temperatura Compensa con la fórmula de la velocidad del sonido
Funciona en el banco, no en el robot Ruido de motores en el riel de 5 V Desacopla la alimentación del sensor; aleja sus cables de los del motor
Dos sensores se interfieren Ambos se oyen mutuamente Dispara los dos por turnos, nunca a la vez
Un pin del ESP32 dejó de responder Echo de 5 V hacia un GPIO de 3.3 V Añade el divisor y comprueba que el pin sigue funcionando
Detecta cosas que no tiene delante El cono de 15° Es lo esperado; reduce mecánicamente el ángulo útil o usa un sensor láser

¿HC-SR04 o VL53L0X?

HC-SR04 VL53L0X
Método Sonido a 40 kHz Láser de 940 nm por tiempo de vuelo
Rango 2 cm – 4 m 3 cm – 2 m (hasta 4 m en el mejor caso)
Haz ~15° de semiángulo: cono ancho ~25° de campo de visión, pero en la práctica un punto estrecho
Frecuencia de actualización ~16 Hz (ciclo de 60 ms) Hasta 50 Hz
Ciego a Superficies blandas y muy anguladas Superficies negras mates y espejos, sol brillante
Interfaz Dos pines, sin biblioteca I²C
Coste ~2 $ ~5 $

Fallan con materiales opuestos, que es lo que hace fácil la elección en cuanto conoces la habitación. El sonar ve una caja forrada de tela negra que el láser no ve; el láser ve una puerta de cristal en ángulo que el sonar no ve. En un robot que tiene que ser fiable, la respuesta honesta suele ser ambos, más un interruptor de choque para cuando los dos se equivocan.

Explora el grafo

Se usa en estos montajes

Proyectos, rutas de aprendizaje y simuladores que incluyen HC-SR04 Ultrasonic Sensor.

Comparar

Alternativas

Preguntas

Preguntas frecuentes sobre HC-SR04 Ultrasonic Sensor

¿Qué es el sensor ultrasónico HC-SR04?

El HC-SR04 es un sensor de distancia de bajo coste que mide a qué distancia está un objeto haciendo rebotar en él una ráfaga de ultrasonidos, el mismo principio que usan los murciélagos y el sonar. Es el sensor que usa la mayoría de los robots de iniciación para detectar y esquivar obstáculos.

¿Cómo funciona el HC-SR04?

Envías un pulso corto a su pin Trigger. El sensor emite ocho ráfagas ultrasónicas de 40 kHz y pone en alto su pin Echo hasta que vuelve el reflejo. Mides cuánto tiempo permanece Echo en alto y, como el sonido viaja a unos 343 m/s, la distancia es ese tiempo multiplicado por la velocidad del sonido y dividido entre dos por el viaje de ida y vuelta.

¿Cuál es el alcance máximo del HC-SR04?

El HC-SR04 mide aproximadamente de 2 cm a 4 m. Es más preciso en la franja de 5 cm a 2 m; cerca del límite de 4 m las lecturas dejan de ser fiables, y los objetos a menos de unos 2 cm caen dentro de su zona ciega y no se pueden medir.

¿Es preciso y fiable el HC-SR04?

Es lo bastante preciso para esquivar obstáculos: alrededor de 3 mm de resolución sobre un objetivo plano y duro colocado justo de frente. Le cuestan las superficies blandas o inclinadas (que dispersan el eco), le afecta la temperatura y tiene un haz ancho de ~15°, así que detecta un cono, no un punto.

¿Cómo se conecta un HC-SR04 a un Arduino?

Conecta VCC a 5 V, GND a masa, Trigger a cualquier pin de salida digital y Echo a un pin de entrada digital. Una advertencia: Echo saca 5 V, así que si usas una placa de 3.3 V como un ESP32, redúcelo con un divisor de tensión antes de leerlo.

HC-SR04 o US-100: ¿cuál es mejor?

El US-100 es un pariente cercano con un modo compensado en temperatura, la opción de una interfaz serie y funcionamiento a 3.3–5 V, lo que lo hace más preciso y más cómodo en placas de 3.3 V. El HC-SR04 es más barato y tiene más tutoriales. Para aprender, el HC-SR04 va bien; para precisión, el US-100 se lleva la ventaja.

¿Cómo compruebo si mi sensor ultrasónico funciona?

Imprime la distancia medida en el monitor serie y acerca y aleja la mano del sensor: la lectura debería seguirla con suavidad. Si se queda atascada en cero o en un valor máximo, revisa el cableado de Trigger y Echo, confirma que tiene una alimentación de 5 V estable y asegúrate de que el timeout es lo bastante largo para el alcance completo de 4 m.

Lecturas adicionales

Referencias