Sensor ultrasónico HC-SR04 con Arduino: pinout y por qué mide mal
Privacidad y medición
Esta tienda usa medición anónima para entender cómo se navega su catálogo. GA4 y Clarity requieren tu permiso; Meta y TikTok solo se activan si aceptas publicidad.
Cargando contenido editorial
sensores-modulos
Sensor ultrasónico HC-SR04 con Arduino: pinout y por qué mide mal
Cómo conectar y programar el HC-SR04 para medir distancia, y por qué a veces devuelve cero, mil doscientos, o un número distinto en cada lectura.
13 min de lectura
El robot se detiene a medio corredor. El monitor serie imprime 0 cm, después 1234 cm, después otra vez 0. El HC-SR04 parpadea el LED de power, el cable del ECHO está bien “al tacto”, y igual el código miente. En un colegio o en un taller de cualquier ciudad, esa escena se repite cada semana: el ultrasónico no “falla de fábrica”; falla por timing, superficie, alimentación o niveles de voltaje que el tutorial de cinco minutos no menciona.
El sensor lanza un pulso, escucha el eco y con ese tiempo calcula la distancia
Esta guía te lleva por la con calma de taller: el clásico de cuatro pines (HC-SR04) y los módulos impermeables de la misma lógica de pulso (AJ-SR04M / JSN-SR04T). El protocolo es el mismo; el envase y el montaje no. Vas a salir con pinout claro, código con y timeout, una checklist de errores, y criterio para elegir ultrasónico frente a IR o radar.
Compartir este artículo
Escrito por
Tecnoelite Colombia
Componentes electrónicos y semiconductores en Colombia
Componentes electrónicos, semiconductores, Arduino, medición, audio, herramientas y repuestos con envíos a todo Colombia.
1. Qué mide un ultrasónico SR04 y qué no te va a dar
Un módulo tipo HC-SR04 / AJ-SR04M emite un tren ultrasónico (alrededor de 40 kHz), espera el eco y convierte el tiempo de ida y vuelta en distancia. Con velocidad del sonido en aire seco cercana a 340 m/s a ~20 °C (valor típico de taller, no de laboratorio metrológico):
distancia (cm) ≈ (tiempo_µs × 0,0343) / 2
El ÷ 2 existe porque el sonido va y vuelve. Si olvidas el divisor, el serial te va a “ver” el doble de lo real y vas a calibrar basura.
Sirve bien para:
Distancia a un blanco opaco y relativamente plano (caja, pared, objeto rígido).
Nivel de tanque o bidón si el sensor está sellado y el eco vuelve del espejo de agua (mejor con carcasa IP).
Obstáculo frontal en robot lento/medio, con filtrado en software.
Tope de máquina casera o maqueta de estacionamiento donde un error de 1 o 2 cm no tiene consecuencias.
No sirve (o sirve mal) cuando:
La superficie es tela, espuma, algodón, pelo, hierba densa: absorben o dispersan el eco.
El ángulo es muy oblicuo: el eco se va a otro lado y pulseIn se va a timeout.
Hay vapor, lluvia fuerte o gradientes de temperatura grandes (cambia la velocidad del sonido y el SNR).
quieres “presencia humana a través de una pared”: eso no es ultrasonido de 40 kHz en aire; mira radar o PIR según el caso.
Idea clave: el HC-SR04 de protoboard y el AJ-SR04M impermeable no son el mismo envase, pero si respetas TRIG ≥ 10 µs y mides el ancho de ECHO, el sketch de Arduino es casi intercambiable. Lo que cambia es montaje, IP, alimentación limpia y si el sensor vive a la intemperie.
En el catálogo de Tecnoelite vas a encontrar sobre todo la familia sellada de campo: AJ-SR04M IP66 y JSN-SR04T / AJ-SR04M con base atornillable. Si en el lab usas un HC-SR04 abierto de kit, el sketch casi no cambia: lo que cambia es el envase y si el sensor va a vivir a la intemperie.
2. Lo que necesitas en la mesa
Superficie blanda absorbe el eco y superficie dura lo devuelve
prefiere 10–15 cm; cables de 40 cm suman ruido y caídas
Fuente 5 V estable
Alimentación
USB del PC vale para prueba en aire; robot → regulador aparte
Multímetro
Diagnóstico
5 V en VCC, continuidad GND, y que TRIG/ECHO no estén cruzados
Condensador ~100 µF (opcional)
Desacople
Cerca de VCC del módulo si hay motores en la misma fuente
Opcional útil: LED o buzzer para feedback sin mirar el serial, y un “blanco de prueba” (cartón rígido) a distancia conocida con regla.
Si comparas tecnologías de presencia (movimiento humano, pared, exterior), el post RCWL-0516 vs PIR te deja claro cuándo no forzar ultrasonido.
3. Pinout y cableado: la tabla que evita el 80 % de “no anda”
HC-SR04 clásico (laboratorio)
Pin módulo
Señal
A Arduino 5 V (ej. D9/D10)
Regla
VCC
+5 V
5V
No 12 V / 24 V de fuente industrial
GND
Tierra
GND
GND común con la placa sí o sí
TRIG
Disparo (salida MCU)
D9 OUTPUT
Pulso HIGH ≥ 10 µs
ECHO
Eco (entrada MCU)
D10 INPUT
Ancho HIGH = tiempo de vuelo
Variantes impermeables (AJ-SR04M / JSN-SR04T)
Suelen compartir la idea VCC / GND / TRIG / ECHO. Algunos módulos ofrecen modo UART y entonces la serigrafía puede decir RX/TX: no copies un diagrama de cuatro pines a ciegas. Lee la cara del módulo que tienes en la mano. Si el vendedor te mandó un “modo serial por jumper”, el código de pulseIn ya no aplica igual.
Esquema mental Arduino 5 V
VCC del sensor → 5 V de la placa o de un regulador compartiendo GND.
GND → GND.
TRIG → pin digital OUTPUT.
ECHO → pin digital INPUT.
ESP32 y placas 3,3 V: el daño diferido
Muchos ESP32 son 3,3 V en GPIO. El ECHO del HC-SR04 clásico suele salir cerca de 5 V. Meter 5 V en un pin de 3,3 V es una forma elegante de matar el MCU… a veces no al primer día.
Soluciones de taller:
Divisor resistivo en ECHO (típico 1 kΩ / 2 kΩ o 2k2 / 3k3: el GPIO ve ~1/3 del 5 V).
Módulo level shifter.
O prototipar en Arduino 5 V y dejar el ESP para WiFi cuando el sensor ya esté validado.
Alimenta el ultrasónico a 5 V si el datasheet/módulo lo pide; no asumas que “todo a 3,3 V” porque el ESP “anda a 3,3”.
4. Temporización y código con pulseIn (sin librería mágica)
Protocolo mínimo que sí funciona:
TRIG en LOW unos microsegundos (limpieza).
TRIG HIGH ≥ 10 µs.
TRIG LOW.
Medir con pulseIn el tiempo que ECHO está en HIGH.
Convertir a cm.
Esperar un tiempo muerto (30–60 ms típico) antes del siguiente disparo para no saturar de ecos fantasma.
cpp
// HC-SR04 / familia SR04 — medición con timeout// Arduino 5 V: TRIG=9, ECHO=10. En ESP32, baja ECHO con divisor.const int PIN_TRIG = 9;const int PIN_ECHO = 10;// Timeout en µs: ~30 ms ≈ ~5 m de ida/vuelta (orden de magnitud)// Si no hay eco, pulseIn devuelve 0 en vez de colgarse para siempre.const unsigned long ECHO_TIMEOUT_US = 30000UL;void setup() { Serial.begin(115200); pinMode(PIN_TRIG, OUTPUT); pinMode(PIN_ECHO, INPUT); digitalWrite(PIN_TRIG, LOW); delay(50);}float medirDistanciaCm() { digitalWrite(PIN_TRIG, LOW); delayMicroseconds(2); digitalWrite(PIN_TRIG, HIGH); delayMicroseconds(10); digitalWrite(PIN_TRIG, LOW); unsigned long duracion = pulseIn(PIN_ECHO, HIGH, ECHO_TIMEOUT_US); if (duracion == 0) { return -1.0f; // sin eco / fuera de rango / cable ECHO } // v_sonido ~ 0.0343 cm/µs a ~20 °C (típico); ida y vuelta → /2 float cm = (duracion * 0.0343f) / 2.0f; return cm;}void loop() { float d = medirDistanciaCm(); if (d < 0) { Serial.println(F("Sin eco (timeout)")); } else { Serial.print(F("Distancia: ")); Serial.print(d, 1); Serial.println(F(" cm")); } delay(50); // tiempo muerto entre disparos}
Por qué el timeout importa: sin el tercer argumento, pulseIn puede bloquear hasta el default del core (orden de un segundo en algunos entornos). En un robot, un segundo colgado es chocar contra la pared con estilo.
Filtro simple de taller (media de 3 lecturas válidas): si una de tres da timeout, descartala; no promedies −1 con 42 cm. Para nivel de tanque, un promedio móvil de 5–10 muestras válidas reduce el “salto” por ondas en el agua.
5. Superficies, ángulos y falsas lecturas (física de banco, no marketing)
Situación
Qué suele pasar en serial
Qué hacer
Cartón plano a 90°
Lectura estable ±1–2 cm
Calibra tu “regla de oro” con cinta métrica
Tela / espuma
Timeout o valores locos
Cambia de sensor o pon un reflector rígido
Ángulo > ~30–40°
Eco se pierde
Apunta de frente; no “dispares de costado”
Dos sensores a la vez
Crosstalk (uno oye al otro)
Alterna disparos + tiempo muerto mayor, o separa en el tiempo
Motores en la misma 5 V
Lecturas que “bailan”
Cap cerca del sensor, GND estrella, fuente aparte
Distancia < ~2 cm
Zona ciega típica
No uses SR04 para “tocar con el dedo” a 5 mm
Crosstalk multi-sensor: en un robot con sensor frontal + lateral, si disparas los dos en el mismo milisegundo, un eco ajeno ensucia la medida. Dispara en serie: frontal → espera → lateral → espera.
Compensación de temperatura (opcional, avanzado): la velocidad del sonido sube con la temperatura (~0,6 m/s por °C, orden de magnitud típico). Para un robot de feria no hace falta. Para un tanque al sol en el patio, un DHT al lado y una fórmula v = 331 + 0.6*T mejora el sesgo… después de que el hardware ya mida estable.
6. Errores que “queman” el proyecto (y a veces el módulo)
TRIG y ECHO intercambiados. Compila, imprime basura o ceros, el módulo no se funde: solo te enloquece. Verifica serigrafía con lupa.
Sin GND común entre sensor y Arduino. El “5 V” del USB y el “5 V” del buck no son magia si las tierras no se tocan.
12 V al VCC porque “el robot es de 12 V”. El módulo es de lógica 5 V. Regula.
ECHO 5 V directo a ESP32. Daño diferido. Divisor.
Disparar cada 1 ms “para más resolución”. Saturas de ecos y de CPU; 20 Hz de muestreo suele sobrar.
Cables de 1 m sin par trenzado / sin GND en un chasis metálico con PWM de motores. Ruido.
Asumir pinout idéntico en un AJ-SR04M en modo UART. Lee el modo.
Calibrar con un soft target (almohada) y después culpar al código.
Alimentación limpia: un LM2596 bien regulado a 5 V (mide antes de conectar el sensor) saca del juego muchas lecturas locas cuando el motor arranca. Si vas a bajar de 12 V de batería, el módulo LM2596 step-down es el hermano de banco del boost MT3608; no mezcles polaridad ni ajustes a ciegas — ver también cómo regular el MT3608 sin quemarlo por el hábito de medir antes de la carga.
7. Ultrasónico vs infrarrojo vs radar: cuándo elegir cada uno
Tecnología
Qué “ve”
Fortaleza
Debilidad típica
Ultrasónico SR04
Distancia por eco acústico
Barato, rango útil decenas de cm a ~3–4 m típicos de módulo
Superficies blandas, ángulo, viento/vapor
IR de proximidad / ToF barato
Reflexión IR
Rápido, compacto
Color/reflectividad del blanco, sol fuerte
PIR
Cambio de IR térmico de cuerpos
Presencia humana en habitación
No da distancia métrica; ciegos a objetos fríos
Radar RCWL-0516
Microondas, movimiento
Atraviesa plásticos finos; menos “color”
Falsos por ventiladores/ruido RF; no es ruleta de distancia fina
Regla práctica de taller:
¿Necesito centímetros a un obstáculo rígido? Ultrasónico o ToF.
¿Solo “hay alguien en la sala”? PIR (interior) o RCWL si el montaje lo pide.
¿Pared de yeso / no quiero ventana óptica? No es trabajo del HC-SR04.
Para el detalle de falsos positivos de movimiento, usa el artículo hermano radar RCWL vs PIR.
8. Proyecto mínimo de validación (30 minutos de banco)
Cablea solo sensor + Arduino, sin motores.
Sube el sketch de la sección 4.
Pon un cartón a 20 cm medidos con regla; anota el serial.
Repite a 50 cm y 100 cm.
Si a 20 cm lees ~40 cm, olvidaste el /2 o tienes la constante mal.
Si siempre timeout: cable ECHO, VCC, o el sensor apunta al techo.
Recién ahí montas el sensor en el chasis del robot.
Cuando pases a tanque de agua, cambió el envase: prefiere el AJ-SR04M IP66 o el módulo con base atornillable, sella el cable, y no sumerjas lo que el IP no autoriza (IP66 es chorro/polvo, no “sumergible a 2 m” por magia de marketing).
9. Del serial al robot: filtrado mínimo que sí cambia la vida
Cuando el sensor ya mide bien a cartón fijo, el chasis en movimiento mete vibración, ángulo y eco de suelo. Tres trucos que no requieren librería:
Descartar fuera de banda: si esperas 10–120 cm en un pasillo, cualquier cosa < 5 cm o > 200 cm es basura de esa muestra.
Mediana de 3: ordena tres lecturas válidas y quédate con la del medio; resiste mejor un outlier que el promedio.
No gires y dispares a la vez: en un servo-radar, espera 50–80 ms tras mover el servo antes del TRIG; el eco anterior y la vibración ensucian.
cpp
// Mediana de 3 lecturas válidas (usa medirDistanciaCm() de la sección 4)float mediana3() { float a = medirDistanciaCm(); delay(40); float b = medirDistanciaCm(); delay(40); float c = medirDistanciaCm(); // Si alguna es timeout (-1), devolve la primera válida o -1 if (a < 0 && b < 0 && c < 0) return -1; // Ordenamiento burdo de tres 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; // mediana}
Eso no compite con un filtro de Kalman de tesis; compite con el robot que se detiene por un 0 fantasma.
10. Checklist final antes de culpar al código
VCC ~5 V medido en el módulo, no solo en la salida del USB.
GND común.
TRIG = OUTPUT, ECHO = INPUT, no al revés.
Pulso ≥ 10 µs.
pulseIn con timeout.
Dead-time ≥ 30 ms entre disparos.
Blanco de prueba rígido y de frente.
En ESP32: divisor en ECHO.
Motores apagados en la primera prueba.
Si pasas todas las casillas y sigue mal, recién ahí sospecha módulo dañado o modo UART distinto.
Preguntas frecuentes
¿El HC-SR04 y el AJ-SR04M usan el mismo código?
En la mayoría de los casos de modo trigger/echo, sí: mismo TRIG ≥ 10 µs y misma conversión de ancho de ECHO. Cambia el hardware (sellado, conector, a veces modos extra). Si tu unidad está en UART, el sketch de pulseIn no aplica.
¿Cuál es el rango real útil?
Los módulos de esta familia suelen publicitar del orden de ~2 cm a ~3–4 m en aire con buen blanco (valores típicos de ficha, no metrología). En la práctica de robot escolar, trabaja cómodo entre 10 cm y 150 cm y filtra outliers.
¿Puedo alimentar el sensor desde el pin 5V del Arduino?
Para un sensor solo, sí en la mayoría de clones decentes. Si sumas servos, tiras LED o motores al mismo USB, el 5 V se cae y el ultrasónico “enloquece”. Separa potencias.
¿Por qué a veces leo 0 cm y a veces un número gigante?
0 de pulseIn con timeout = sin eco. Números enormes = eco tarde, rebote raro, o constante mal aplicada. Mira la superficie reflectante y el tiempo muerto antes de reescribir todo el programa.
¿Hace falta librería NewPing?
No es obligatoria. NewPing aporta timers y multi-sensor más limpios; el sketch mínimo de arriba enseña el protocolo. Si tu proyecto crece a varios sensores, evalúa una librería o timers por hardware.
¿Ultrasónico o IR para un robot evitador de obstáculos?
Si el suelo es irregular y hay objetos de colores raros, el ultrasónico suele ser más predecible en distancia. Si necesitas muy corto alcance y respuesta rápida, un IR/ToF puede complementar. Muchos robots serios combinan; un estudiante puede empezar solo con SR04 bien montado de frente.
En resumen: el ultrasónico de la familia SR04 es un instrumento de tiempo de vuelo acústico, no un oráculo. Respeta pinout, timeout, tiempo muerto y el blanco. Cuando el proyecto salga del escritorio al tanque o a la intemperie, pasa al módulo IP66 o al JSN-SR04T / AJ-SR04M atornillable y deja de improvisar con PCB abierta junto al agua.