Aprender

Measure distance with an HC-SR04 ultrasonic sensor

Intermedio

O mira todas las lecciones.

  • 503componentes en el banco de trabajo
  • 44placas funcionando ahora
  • 1.00xtiempo real, en todas las placas
Arduino Uno: sensor de estacionamientolive0.000 s 0.00x
Haz clic para abrirlo en el editor
El ejemplo parking: un HC-SR04 en los pines 7 y 6, un buzzer en el 9 y una lámpara en el 8. Ábrelo en el editor y arrastra el deslizador del sensor para mover la pared.

El HC-SR04 es el sensor con el que empieza cualquier clase, porque no tiene nada escondido: ni bus, ni dirección, ni una biblioteca en la que tengas que confiar. Le mandas un pulso, te regresa un pulso, y la duración del segundo es la distancia. El circuito de arriba conecta uno a un Arduino Uno y convierte la lectura en un sensor de estacionamiento, con un buzzer que pita más rápido conforme se acerca la pared y una lámpara roja cuando pasas la línea de alto.

Ábrelo en el editor y arrastra el deslizador del sensor para mover la pared. El monitor serie imprime la distancia en centímetros y el tiempo entre pitidos.

What you need

  • Un Arduino Uno
  • Un sensor ultrasónico HC-SR04
  • Un buzzer
  • Un LED rojo y una resistencia de 220 ohm
  • Una protoboard y cables jumper

Wiring

Componente y pinVa aNota
VCC del HC-SR045 VEl módulo necesita 4.5 V o más
GND del HC-SR04GND
TRIG del HC-SR04Pin 7La placa lanza un pulso por este pin
ECHO del HC-SR04Pin 6En alto mientras el sonido tarda en regresar
BuzzerPin 9La otra pata a GND
LED rojo, con 220 ohmPin 8Se enciende al pasar la línea de alto

Cómo mide el sensor

Mantén TRIG en alto durante al menos diez microsegundos y el módulo envía una ráfaga corta de sonido de 40 kHz, y luego pone ECHO en alto exactamente durante el tiempo que tarda el sonido en llegar al objeto y regresar. El sonido viaja a unos 343 metros por segundo a temperatura ambiente, que son 0.0343 centímetros por microsegundo, y hace el viaje dos veces. Así que la distancia en centímetros es el tiempo del eco en microsegundos dividido entre unos 58, el número entre el que divide cualquier sketch del HC-SR04.

El componente de Mokxi respeta los tiempos de la hoja de datos: ECHO sube 460 microsegundos después del disparo, se queda en alto 58 microsegundos por centímetro, y si no hay nada en rango se queda en alto durante todo el tiempo límite de 38 milisegundos. La velocidad del sonido sale de una temperatura del aire que puedes ajustar en el componente, así que un sketch que divide entre 58 lee una pared a un metro como 104 centímetros a temperatura de congelación, que es lo que también hace un módulo real.

El código, explicado

El ejemplo lee el sensor con una pequeña función auxiliar que hace el disparo, mide el eco y regresa milímetros, o cero cuando no regresó nada. Escrita a mano con pulseIn(), como lo hacen casi todos los tutoriales, la medición son cinco líneas.

El comportamiento del sensor de estacionamiento es una sola función. A menos de 15 centímetros mantiene una nota larga y enciende el LED. Entre ahí y dos metros, el tiempo entre pitidos crece en línea recta de 90 milisegundos a 900. Más allá de dos metros se queda callado. Cada ciclo termina con una espera de 60 milisegundos, y ese número importa: la hoja de datos pide 60 milisegundos entre pulsos, porque el eco del anterior todavía anda rebotando por el cuarto.

La medición, como la escriben casi todos los tutoriales
const int TRIG = 7;
const int ECHO = 6;

long readCm() {
  digitalWrite(TRIG, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG, LOW);
  long us = pulseIn(ECHO, HIGH, 38000);
  return us / 58;
}

Pruébalo en el editor

Abre el circuito en el editor y selecciona el sensor. Su propiedad temperature es la temperatura del aire, 20 grados de forma predeterminada. Ponla en 0 y la misma pared se lee unos centímetros más lejos, porque el sonido es más lento en el aire frío; ponla en 40 y se lee más cerca. El sketch no cambió, y tampoco cambiaría uno real.

Después, cambia el delay(60) al final de cada rama de loop() por delay(20). Muchos de los pulsos se quedan sin respuesta, porque el módulo todavía está esperando a que se apague el último eco e ignora un disparo que llega demasiado pronto, así que el monitor serie empieza a mezclar mensajes de nada en rango con distancias reales. Regrésalo a 60 y cada lectura vuelve a ser real.

Para otro proyecto con las mismas conexiones, quita el código del buzzer e imprime la distancia en el graficador serie, y tendrás un medidor de distancia sencillo.

Common mistakes

Lanzar pulsos más seguido que cada 60 milisegundos. La primera lectura regresa y las demás se ignoran, porque el módulo se niega a disparar mientras sigue escuchando. El componente simulado hace lo mismo, así que el error aparece aquí antes de que aparezca en tu mesa.

Intercambiar TRIG y ECHO. Nada se rompe, pero la placa espera un pulso que nunca llega, y cada lectura es cero o el tiempo límite completo.

Olvidar el tiempo límite. Sin nada en rango, el eco dura 38 milisegundos, y pulseIn() sin tiempo límite espera un segundo completo antes de rendirse, lo que hace que el resto del sketch parezca atorado.

Confiar en el último milímetro. Un HC-SR04 real tiene, en el mejor caso, una precisión de unos cuantos milímetros, y se confunde con superficies blandas o inclinadas. La lectura simulada es exacta, lo cual sirve para aprender el código, pero es más amable que la vida real.

Conectar ECHO directo a una placa de 3.3 volts. El módulo maneja ECHO a 5 volts. En un Uno no hay problema; en un ESP32 o un Pico, un circuito real necesita un divisor de resistencias en esa línea.

Preguntas

¿Cuál es el rango del HC-SR04?

Más o menos de 2 centímetros a 4 metros. El componente simulado reporta cualquier cosa a menos de 20 milímetros o a más de 4000 como nada en rango.

¿Por qué dividir entre 58?

El sonido tarda unos 29 microsegundos en recorrer un centímetro a temperatura ambiente, y el eco recorre la distancia dos veces, de ida y de vuelta. 29 por 2 es 58.

¿Puedo usar el HC-SR04 con un ESP32?

Sí, con el mismo código. En hardware real, los pines del ESP32 no toleran 5 volts, así que pon un divisor en ECHO, por ejemplo de 1 k y 2 k, para bajarlo a unos 3.3 volts.

¿El simulador modela el sonido en sí?

No. No hay ángulo de haz ni reflejos en un entorno. El componente es un cronómetro que mantiene ECHO en alto durante el viaje de ida y vuelta a la velocidad del sonido, con la distancia ajustada en un deslizador. Eso basta para escribir y depurar el código exactamente como corre en hardware.

Ármalo en la vida real

Abre el editor, cambia un valor y mira cómo el número cambia con él. Nada que instalar y sin necesidad de cuenta.