Saltar al contenido
Contenido de Arduino

Lección 1.3: Sensor ultrasónico

El HC-SR04 mide la distancia a un obstáculo como un murciélago: emite un sonido que no oímos y escucha cuánto tarda en volver. Es la base de robots que esquivan objetos, sensores de aparcamiento y medidores de nivel.

Material

Cómo funciona

Un pulso de 10 µs en Trig hace que el módulo emita una ráfaga de ocho ciclos a 40 kHz. Cuando sale, Echo se pone en HIGH, y vuelve a LOW al recibir el eco: la duración de ese pulso es el tiempo de ida y vuelta.

El sonido viaja a unos 343 m/s a 20 °C, es decir, 0,0343 cm por microsegundo. Como el pulso mide la ida y la vuelta, la distancia es la mitad: distancia (cm) = duración (µs) × 0,0343 / 2. Para 10 cm, el eco tarda unos 583 µs.

pulseIn() mide la duración del pulso. Su tercer argumento es un tiempo límite: si no vuelve eco —no hay nada delante o está fuera de alcance— devuelve 0 en vez de bloquear el programa un segundo entero.

Datos técnicos

Alcance
2 cm – 4 m
Frecuencia
40 kHz
Ángulo de detección
unos 15°
Alimentación
5 V

Conexiones

ComponenteSe conecta aNota
HC-SR04, VCC5V
HC-SR04, TrigPin 12
HC-SR04, EchoPin 11
HC-SR04, GNDGND

Código

// Mide la distancia con el HC-SR04 cinco veces por segundo.
const int TRIG_PIN = 12;
const int ECHO_PIN = 11;

void setup() {
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
  Serial.begin(9600);
}

void loop() {
  // Pulso de disparo de 10 microsegundos.
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);

  // Duración del eco, con un límite de 30 ms.
  unsigned long duration = pulseIn(ECHO_PIN, HIGH, 30000UL);

  if (duration == 0) {
    Serial.println("Sin eco");
  } else {
    float cm = duration * 0.0343 / 2;
    Serial.print(cm);
    Serial.println(" cm");
  }

  delay(200);
}

Qué hace el código

  • El LOW de 2 µs antes del disparo asegura que el pulso empieza limpio.
  • pulseIn(ECHO_PIN, HIGH, 30000UL) espera a que Echo suba y mide cuánto dura en HIGH, con un máximo de 30 ms: lo que corresponde a unos 5 m.
  • El cálculo usa float para no perder los decimales; Serial.print() escribe dos por defecto.

Paso a paso

  1. Conecta el módulo según la tabla. Con cables hembra-macho no hace falta protoboard.
  2. Sube el código y abre el monitor serie a 9600 baudios.
  3. Apunta el sensor a una pared y acércalo y aléjalo despacio.

Resultado

El monitor serie muestra la distancia en centímetros cinco veces por segundo, y «Sin eco» cuando no hay nada al alcance.

Si no funciona

  • Si siempre lee «Sin eco», comprueba que Trig y Echo no estén intercambiados.
  • Las superficies blandas o inclinadas absorben o desvían el sonido: prueba contra una pared lisa.
  • Por debajo de 2 cm la lectura no es fiable: el eco vuelve antes de que el módulo termine de emitir.