Sensor Ultrasónico HC-SR04: Guía Completa de Funcionamiento, Conexión y Código Arduino
El HC-SR04 es el sensor ultrasónico de distancia más popular en hobby y educación. Mide distancias de 2 cm a 400 cm con resolución de 0,3 cm (3 mm). Funciona emitiendo un pulso ultrasónico a 40 kHz y midiendo el tiempo que tarda el eco en volver. Alimentación: 5 V DC. Corriente: ~15 mA. Ángulo de haz: ~15°. Precisión típica: ±3 mm. Pines: VCC, Trig (Entrada disparo), Echo (Salida eco), GND. Compatible con Arduino, ESP32, ESP8266, STM32, PIC, etc. Ideal para robots evasores de obstáculos, medición de nivel de líquidos, estacionamiento asistido, detección de presencia, etc.
Pinout del HC-SR04
| Pin | Nombre | Función |
|---|---|---|
| 1 | VCC | Alimentación 5 V |
| 2 | Trig | Entrada disparo (pulso ≥ 10 µs HIGH) |
| 3 | Echo | Salida eco (pulso HIGH proporcional a distancia) |
| 4 | GND | Tierra |
Principio de Funcionamiento
- Pulso HIGH de ≥ 10 µs en pin Trig inicia medición.
- Módulo emite tren de 8 pulsos ultrasónicos a 40 kHz.
- Pin Echo pasa a HIGH al emitir y vuelve a LOW al recibir eco.
- Ancho del pulso Echo (µs) = tiempo de ida y vuelta del sonido.
- Distancia (cm) = (Ancho pulso Echo × 0,0343) / 2 = Ancho pulso / 58,8 ≈ Ancho pulso / 58.
Fórmula simplificada: distancia_cm = duracion_us / 58.
Conexión con Arduino
HC-SR04 Arduino Uno VCC ──────── 5V GND ──────── GND Trig ──────── D9 (o cualquier pin digital) Echo ──────── D10 (o cualquier pin digital)
Importante: El pin Echo entrega 5 V. Si tu MCU es 3,3 V (ESP32, ESP8266), usa divisor de tensión (1 kΩ + 2 kΩ) o level shifter.
Código Arduino Básico (sin librerías)
const int TRIG_PIN = 9;
const int ECHO_PIN = 10;
void setup() {
Serial.begin(9600);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
}
void loop() {
// Pulso de disparo ≥ 10 µs
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Medir ancho de pulso Echo (timeout 30 ms ≈ 4 m)
long duration = pulseIn(ECHO_PIN, HIGH, 30000);
if (duration == 0) {
Serial.println("Fuera de rango / Sin eco");
} else {
float distance_cm = duration / 58.0;
Serial.print("Distancia: ");
Serial.print(distance_cm);
Serial.println(" cm");
}
delay(500);
}
Usando Librería NewPing (Más Robusta)
Instala NewPing desde Gestor de Librerías.
#include
#define TRIG_PIN 9
#define ECHO_PIN 10
#define MAX_DISTANCE 400
NewPing sonar(TRIG_PIN, ECHO_PIN, MAX_DISTANCE);
void setup() {
Serial.begin(9600);
}
void loop() {
delay(500);
unsigned int uS = sonar.ping(); // microsegundos
float dist_cm = uS / US_ROUNDTRIP_CM; // constante 57.99 ≈ 58
Serial.print("Distancia: ");
Serial.print(dist_cm);
Serial.println(" cm");
}
NewPing maneja timeouts, medianas de múltiples lecturas y evita bloqueos.
Consideraciones Prácticas y Limitaciones
- Ángulo de haz ~15°: Detecta objetos en cono; superficies inclinadas pueden desviar eco.
- Superficies blandas/porosas (espuma, tela) absorben sonido → lecturas fallidas.
- Mínimo 2 cm: Zona muerta cerca del sensor.
- Temperatura/humedad afectan velocidad del sonido (0,6 m/s por °C). Para alta precisión, compensa con sensor de temperatura.
- Ruido acústico de otros ultrasónicos cercanos → separa sensores o sincroniza disparos.
- Alimentación estable: 5 V regulado; fluctuaciones causan lecturas erráticas.
Montaje Físico
- Evita vibraciones: fija con tornillos o pegamento caliente.
- Mantén transductor (bocinas) libre de obstrucciones.
- Para exterior: usa versión IP67 (JSN-SR04T) con sonda separada y cable largo.
Proyecto Ejemplo: Parking Assistant con Buzzer y LEDs
const int TRIG = 9, ECHO = 10;
const int BUZZER = 8;
const int LED_GREEN = 5, LED_YELLOW = 6, LED_RED = 7;
void setup() {
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
pinMode(BUZZER, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
pinMode(LED_YELLOW, OUTPUT);
pinMode(LED_RED, OUTPUT);
Serial.begin(9600);
}
void loop() {
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
long dur = pulseIn(ECHO, HIGH, 30000);
if (dur == 0) return;
float cm = dur / 58.0;
if (cm > 50) { // Lejos
digitalWrite(LED_GREEN, HIGH);
digitalWrite(LED_YELLOW, LOW);
digitalWrite(LED_RED, LOW);
noTone(BUZZER);
} else if (cm > 20) { // Medio
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_YELLOW, HIGH);
digitalWrite(LED_RED, LOW);
tone(BUZZER, 1000, 100);
} else { // Cerca
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_YELLOW, LOW);
digitalWrite(LED_RED, HIGH);
tone(BUZZER, 2000, 200);
}
delay(100);
}
Conclusión
El HC-SR04 es sensor ultrasónico barato, fácil de usar y versátil. Con Arduino y librería NewPing, obtienes mediciones fiables en proyectos de robótica, domótica, nivel de líquidos y más. Recuerda sus limitaciones (ángulo, superficies, temp.) y usa divisor de tensión si tu MCU es 3,3 V. ¡Experimenta y construye!
Tecnología Industrial
- Estrategia de Planificación de Capacidad: Guía Completa para Optimizar Recursos de Fabricación
- Dominando el corte por láser: Precisión, potencia y orientación práctica
- Dominar la Garantía de Calidad en Manufactura: Guía Completa
- Refrigeración de proceso explicada: Beneficios, métodos y aplicaciones industriales
- Fuentes de Alimentación Variables: Características, Aplicaciones y Mejores Modelos
- Interruptor Flotante DIY: Guía Completa para Construir e Instalar tu Propio Sensor de Nivel de Agua
- Resistores Flexibles Explicados: Guía Completa para Proyectos Electrónicos
- Linterna Faraday: Guía Completa para Construir y Usar una Luz Mecánica
- SCR Desmitificado: Cómo los Rectificadores Controlados de Silicio Impulsan la Electrónica Moderna
- Dominando Condensadores MFD: Claves y Aplicaciones
- Guía Completa del Contrachapado: Propiedades, Usos y Consejos de Selección