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
| Componente | Se conecta a | Nota |
|---|---|---|
| HC-SR04, VCC | 5V | |
| HC-SR04, Trig | Pin 12 | |
| HC-SR04, Echo | Pin 11 | |
| HC-SR04, GND | GND |
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
- Conecta el módulo según la tabla. Con cables hembra-macho no hace falta protoboard.
- Sube el código y abre el monitor serie a 9600 baudios.
- 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.