Hacklab ASU logo Hacklab ASUHacer, reparar, aprender juntos
Electrónica

Cómo medir distancia con Arduino y el sensor HC-SR04

Montaste el sensor, subiste el programa y el monitor serie muestra 0 cm, luego 1190 cm, luego 0 otra vez.

An Arduino Uno on a breadboard wired to an HC-SR04 ultrasonic sensor pointed at a cardboard box, with a measuring tape on the workbench

Montaste el sensor, subiste el programa y el monitor serie muestra 0 cm, luego 1190 cm, luego 0 otra vez. Es el problema más común cuando alguien intenta medir distancia con Arduino por primera vez, y casi nunca es culpa del sensor: suele ser un cable, un tiempo de espera mal puesto o una superficie que no devuelve el eco.

En esta guía armamos el circuito con el módulo HC-SR04, explicamos cómo funciona la medición y repasamos los errores que vemos cada mes en los talleres del hacklab.

Qué necesitas para medir distancia con Arduino

  • Un Arduino Uno, Nano o compatible.
  • Un módulo ultrasónico HC-SR04. Cuesta entre 1,50 y 3 euros en tiendas de electrónica.
  • Cuatro cables macho a hembra o una protoboard y cables macho a macho.
  • Un cable USB y el entorno de Arduino instalado.
  • Opcional: una regla o cinta métrica para calibrar.

Si nunca has usado una protoboard, revisa antes nuestra guía de cómo usar una protoboard paso a paso sin errores. Te ahorrará la mitad de los fallos de este montaje.

Cómo funciona el HC-SR04

El módulo tiene dos cilindros: uno emite un pulso de ultrasonido a 40 kHz y el otro escucha el eco. El funcionamiento es sencillo:

  1. El Arduino pone el pin Trig en alto durante 10 microsegundos.
  2. El módulo envía ocho pulsos de ultrasonido.
  3. El pin Echo se queda en alto el tiempo que tarda el sonido en ir y volver.
  4. El Arduino mide ese tiempo y calcula la distancia.

El sonido viaja a unos 343 metros por segundo a 20 grados, es decir, 0,0343 centímetros por microsegundo. Como el pulso recorre el camino dos veces, la fórmula es: distancia en cm = tiempo en microsegundos por 0,0343 dividido entre 2. En la práctica muchos usan dividir el tiempo entre 58, que da casi el mismo resultado.

El rango útil va de 2 cm a unos 400 cm, con una precisión cercana a 3 mm en condiciones buenas. Por debajo de 2 cm el sensor no distingue el eco del pulso que acaba de enviar.

Conexión paso a paso

Pin del HC-SR04Pin del Arduino
VCC5V
TrigPin digital 9
EchoPin digital 10
GNDGND

El HC-SR04 clásico necesita 5 voltios. Si usas una placa de 3,3 V como un ESP32, busca la versión HC-SR04P, que funciona entre 3 y 5,5 V, o pon un divisor de tensión en el pin Echo con una resistencia de 1 kΩ y otra de 2 kΩ. Para calcular resistencias sin dudas, nuestra guía sobre cómo calcular la resistencia para un LED explica la ley de Ohm con ejemplos reales.

El programa explicado línea a línea

El programa tiene cuatro partes. No hace falta ninguna librería.

  1. Configuración: en setup declara el pin 9 como salida con pinMode(9, OUTPUT), el pin 10 como entrada con pinMode(10, INPUT) e inicia el puerto serie con Serial.begin(9600).
  2. Disparo: en loop pon el pin 9 en bajo, espera 2 microsegundos con delayMicroseconds(2), ponlo en alto, espera 10 microsegundos y vuelve a ponerlo en bajo.
  3. Lectura: guarda el resultado de pulseIn(10, HIGH, 30000) en una variable de tipo long. El tercer número es el tiempo máximo de espera en microsegundos. Con 30000 el programa no se queda bloqueado si no hay eco.
  4. Cálculo y salida: divide el tiempo entre 58 para obtener centímetros, imprímelo con Serial.println y espera 60 milisegundos antes de la siguiente medida.

Esos 60 milisegundos importan. Si disparas el sensor más rápido, el eco de la medida anterior puede llegar tarde y confundir la nueva lectura.

Errores comunes y cómo arreglarlos

Siempre marca 0

Casi siempre es un cable suelto en Echo o los pines Trig y Echo intercambiados. Revisa la continuidad con un multímetro; si no sabes cómo, tenemos una guía para usar un multímetro por primera vez. Si pulseIn devuelve 0, también puede ser que el objeto esté fuera de rango y se haya agotado el tiempo de espera.

Lecturas que saltan sin motivo

Las superficies blandas como cortinas, ropa o espuma absorben el ultrasonido. Los objetos en ángulo de más de 15 grados desvían el eco. Prueba con una caja de cartón plana delante del sensor para confirmar que el circuito funciona.

Distancias un poco largas o cortas

La velocidad del sonido cambia con la temperatura, unos 0,6 metros por segundo por cada grado. A 35 grados en verano, la diferencia en un metro es de casi un centímetro. Si necesitas precisión, añade un sensor de temperatura y corrige la velocidad en el cálculo.

Por qué no siempre conviene promediar diez lecturas

En muchos foros se recomienda tomar diez lecturas y hacer la media para eliminar el ruido. No estamos de acuerdo como regla general. Si una de las diez lecturas es un 0 o un valor absurdo de 1190 cm, la media se estropea por completo. Además, diez lecturas a 60 ms cada una son 600 ms, demasiado lento para un robot que esquiva obstáculos.

Es mejor tomar cinco lecturas, ordenarlas y quedarse con la del medio, la mediana. Descarta los valores extremos automáticamente y solo tarda 300 ms. Para un medidor de nivel de un depósito, donde la velocidad no importa, puedes subir a siete u once lecturas con el mismo método.

Calibrar el sensor en cinco minutos

Antes de usar el sensor en un proyecto, comprueba sus lecturas con una cinta métrica. Coloca una caja plana a 10, 50, 100 y 200 cm y anota lo que muestra el monitor serie en cada punto. Si todas las lecturas se desvían en la misma proporción, por ejemplo un 2 por ciento de más, ajusta el divisor 58 hasta que coincidan. Si solo falla la lectura más lejana, el problema es el eco débil, no el cálculo, y conviene limitar el uso a distancias más cortas.

Ideas de proyectos con el sensor

  • Un sensor de aparcamiento para el garaje con un LED verde, amarillo y rojo.
  • Un medidor de nivel de agua para un depósito, montado en la tapa.
  • Un robot que gira al detectar una pared a menos de 20 cm.
  • Un contador de personas que pasan por una puerta.

Preguntas frecuentes

¿Qué distancia máxima mide el sensor HC-SR04?

El fabricante indica hasta 400 cm, pero en la práctica las lecturas fiables llegan a unos 250 o 300 cm con objetos planos y duros. Más lejos, el eco es débil y aparecen valores erráticos. La distancia mínima útil es de unos 2 cm.

¿Se puede usar el HC-SR04 con 3,3 voltios?

El modelo clásico necesita 5 V para funcionar bien. Existe una versión llamada HC-SR04P que acepta de 3 a 5,5 V. Si usas el clásico con una placa de 3,3 V, pon un divisor de tensión en el pin Echo para proteger la placa.

¿Por qué el sensor ultrasónico da lecturas de 0?

Un 0 suele indicar que el Arduino no recibió eco antes del tiempo de espera. Las causas más comunes son un cable suelto, los pines Trig y Echo cambiados o un objeto fuera de rango o que absorbe el sonido. Revisa las conexiones y prueba con una superficie plana.

LB
Lucía Benítez

Lucía empezó reparando radios viejas en la mesa de la cocina y hoy escribe sobre circuitos, Arduino y radiofrecuencia sin dar nada por sabido.

More posts by Lucía

More in Electrónica

01doorganico 084goad 3hot8 4465456 after5internprogram ahandfulofblessings ahmadpc ahomcybersecurity allodialresources annodex antiquesandperiodcollectibles aotc asianworldkashmir beedlectrics bloggertemplatefree bluefeatheragency bodyweightsolution campaign08blog carfixadvisor catstreetcollective cbstvsports cnfanspurchasing committeeof500yearsofdignityandresistance covertopsdjs cs-kaiyuangame cuestacomunicaciontotal cxoutlet dancebetgame deskgearhub destinyvillastay detectmagazine di33 diamondsteelbuildings donmo dyanadropship emarsysfinance emimattl escapechan eskitarih evautoplay everythingweddings-orlando farmzone feedviewerapp foxstudiosscratch gamevui123 gleasongrade greetingsday haskell iw-kaiyun jagoanproperti jilidskripsi joltbusinessfinance juegodepokergratis juegospucca kaeru-festival latestmehndidesigns lestanzediottaviano litemagazines localcommunityhero lustrsazan mariashebets menswheels newwebstechs1 nikkit ootheday oxigenvpn plurfitness prefetial probudgetcarpetcleaning psychicmrsmartin pyaten qvantor rejoignezlogis rexzbot riselayouts ruchin rwxqsgd5 sakaltime shibiaowang shop-bot skrtips strcoding tetapatrium topselller uneplanteartificielle vipertechcr webtech1223411 wo-kygaming yamaha-mekar yeknava yoybuysheets zenunwa yamaha-mekar jilidskripsi ankertoto ankertoto ankertoto ankertoto