¿Cuanto mide la distancia entre tu mano y la mesa, ahora mismo, sin tocar nada? Esa es exactamente la pregunta que un robot necesita responder mil veces por segundo para no chocar con una pared, frenar antes de una escalera o medir el nivel de agua en un estanque. La respuesta cabe en un modulo azul de menos de cinco mil pesos: el HC SR04, el sensor ultrasonico con el que casi todos partimos en la robotica.

En esta guia vas a armar tu primer medidor de distancia con un Arduino Uno y un HC SR04. Al terminar vas a tener centimetros reales apareciendo en el monitor serial, vas a entender por que el sensor funciona como funciona (no solo copiar el cableado) y vas a saber detectar los errores tipicos cuando la lectura se vuelve loca. Es un proyecto de tarde, ideal para entender la base que despues vas a reutilizar en autos seguidores de linea, brazos roboticos y estaciones de medicion.

Modulo sensor ultrasonico HC SR04 visto de frente con sus dos capsulas

Como "ve" un sensor que en realidad escucha

El HC SR04 no usa luz: usa sonido, y ademas sonido que tu no escuchas. Trabaja a unos 40 kHz, muy por encima del limite humano (de ahi el nombre ultrasonico). La logica es la misma que usan los murcielagos y los sonares de los submarinos, y se resume en tres pasos:

  1. La capsula emisora (marcada T, de transmitter) dispara un tren corto de pulsos ultrasonicos.
  2. Esa onda viaja por el aire, choca contra el objeto que tenga adelante y rebota.
  3. La capsula receptora (marcada R, de receiver) capta el eco que vuelve.

El truco esta en el tiempo. El sensor no mide distancia directamente: mide cuanto demora el eco en regresar. Como el sonido viaja a una velocidad bastante estable en el aire (alrededor de 343 metros por segundo a temperatura ambiente), con el tiempo de ida y vuelta se calcula la distancia. Por eso el HC SR04 funciona solo en aire y necesita que el objeto sea capaz de reflejar el sonido: superficies duras y planas devuelven un eco limpio, mientras que esponjas, cortinas o telas absorben la onda y confunden la medicion.

Un detalle que casi nadie te cuenta al principio: el sensor no "mira" en una linea recta finita como un laser. Emite un cono de sonido. En la practica detecta mejor los objetos que estan dentro de un angulo de aproximadamente 30 grados frente a las capsulas, y rinde bien hasta varios metros de distancia. Si pones un objeto angosto muy de costado, puede que el eco se escape y el sensor no lo "vea".

Diagrama del cono de deteccion del HC SR04 mostrando el angulo de trabajo de unos 30 grados

Lo que vas a necesitar

El hardware es minimo y casi todo lo tienes si ya jugaste con Arduino:

  • Arduino Uno (o cualquier placa compatible). Es el cerebro que dispara el pulso y cronometra el eco.
  • Sensor ultrasonico HC SR04. El protagonista, con sus cuatro pines: Vcc, Trig, Echo y Gnd.
  • Cables Dupont macho a hembra. Cuatro cables alcanzan: los pines del HC SR04 son machos y van directo a los hembras del Arduino, asi que el macho hembra es el que calza sin protoboard.
  • Cable USB para alimentar el Arduino y abrir el monitor serial desde el computador.

No hace falta protoboard ni resistencias: el HC SR04 funciona a 5 V y se conecta de forma directa a los pines digitales.

El cableado: cuatro cables y listo

El HC SR04 tiene cuatro pines. Dos son alimentacion y dos son señal. Para este ejemplo vamos a usar el pin 7 para el Echo y el pin 8 para el Trig, que es justo lo que espera el codigo de mas abajo. Conectalos asi:

  • Vcc del sensor va al 5V del Arduino (alimentacion).
  • Gnd del sensor va al GND del Arduino (tierra comun, imprescindible).
  • Trig del sensor va al pin 8 (por aca el Arduino le ordena "dispara el pulso").
  • Echo del sensor va al pin 7 (por aca el sensor le avisa al Arduino "ya volvio el eco").

Diagrama de conexion del Arduino Uno con el sensor HC SR04: Vcc a 5V, Gnd a GND, Trig al pin 8 y Echo al pin 7

Un consejo de orden que ahorra dolores de cabeza: conecta primero la tierra (GND) y la alimentacion (5V), y recien despues las señales (Trig y Echo). Si energizas las señales antes que la tierra comun, en el peor caso podrias estresar el modulo. Revisa dos veces que Vcc no quede cruzado con GND: el HC SR04 es robusto, pero no le gusta la polaridad invertida.

El codigo, paso a paso

Carga este sketch en tu Arduino desde el IDE. Esta tal cual lo publico ElectroCrea, sin tocar una sola linea para que te calce con el cableado de arriba:

C++
/*ElectroCrea.com

Sensor de Ultrasónico     Arduino
---------------------------------
 VCC                      5V
 GND                      GND
 Echo                     7
 Trig                     8
*/

#define echoPin 7 // Echo Pin
#define trigPin 8 // Trigger Pin
#define LEDPin 13
int maximumRange = 200; // Maximo rango a detectar en cm
int minimumRange = 0; // Minimo rango a detectar en cm
long duration, distance; // Duración usada para calcular la distancia

////////////////////////////////////////////////////////////////////VOID SETUP
void setup() {
 Serial.begin (9600);
 pinMode(trigPin, OUTPUT);//Trig es la salida del ultrasonido
 pinMode(echoPin, INPUT);//Echo es la entrada de el sonido regresando al sensor.
 pinMode(LEDPin, OUTPUT);
}
////////////////////////////////////////////////////////////////////VOID LOOP
void loop() {
/*El siguiente ciclo de Trig y Echo es usado para determinar
la distancia del objeto mas cercano emitiendo sonidos
y calculando el tiempo que tardan en regresar*/
 digitalWrite(trigPin, LOW);
 delayMicroseconds(2);
 digitalWrite(trigPin, HIGH);
 delayMicroseconds(10);
 digitalWrite(trigPin, LOW);
 duration = pulseIn(echoPin, HIGH);
 distance = duration/58.2;

 if (distance >= maximumRange || distance <= minimumRange){
 /*Si la distancia medida es mayor que 200cm y menor que 0cm
 el monitor serial indicara que esta fuera de rango y encendera el led*/
 Serial.println("Fuera de Rango");
 digitalWrite(LEDPin, HIGH);
 }
 else {
 /*Por otro lado si el objeto se encuentra en el rango
 de medicion mostrara la distancia en el monitor serial*/
 Serial.print(distance);
 Serial.println(" CM");
 digitalWrite(LEDPin, LOW);
 }
 delay(50); //Restraso de 50ms entre lectura y lectura
}
//Mas información en ElectroCrea.com

Que hace cada parte (esto es lo que el tutorial original no explica en detalle)

La magia de medir esta concentrada en pocas lineas, y vale la pena entenderlas en vez de copiarlas a ciegas:

El disparo del pulso. El sensor se activa con un pulso de exactamente 10 microsegundos en el pin Trig. Por eso el codigo primero baja la señal (digitalWrite(trigPin, LOW)), espera 2 microsegundos para limpiar cualquier residuo, la sube por 10 microsegundos (HIGH + delayMicroseconds(10)) y la vuelve a bajar. Ese flanco es la "orden de fuego".

La medicion del eco. La instruccion clave es pulseIn(echoPin, HIGH). Esta funcion de Arduino cronometra cuantos microsegundos permanece el pin Echo en alto, que es exactamente el tiempo que tardo el sonido en ir y volver. Ese numero, guardado en duration, es el dato crudo.

El numero magico 58.2. La linea distance = duration/58.2; convierte microsegundos en centimetros. ¿De donde sale el 58.2? El sonido recorre un centimetro en aproximadamente 29.1 microsegundos. Como el eco hace el camino dos veces (ida hasta el objeto y vuelta al sensor), hay que dividir por el doble: 29.1 multiplicado por 2 da 58.2. Dividir el tiempo total por 58.2 te entrega directo la distancia en una sola via, en centimetros. Por eso ese valor aparece en casi todos los codigos de HC SR04 que vas a encontrar.

El filtro de rango. El if con maximumRange (200 cm) y minimumRange (0 cm) descarta lecturas absurdas. Si el objeto esta fuera de ese rango, el codigo escribe "Fuera de Rango" y enciende el LED del pin 13 (el LED que ya viene soldado en el Arduino) como aviso visual. Dentro del rango, imprime la distancia y apaga el LED. El delay(50) final deja respirar al sensor 50 milisegundos entre lectura y lectura, para que el eco de una medicion no contamine la siguiente.

Prueba: leyendo centimetros en pantalla

Con el codigo cargado, abre el Monitor Serial del IDE de Arduino (el icono de la lupa arriba a la derecha) y asegurate de que la velocidad este en 9600 baudios, igual que en Serial.begin(9600). Vas a ver una columna de numeros con el formato 25 CM, 24 CM, 12 CM, que cambian a medida que acercas o alejas la mano frente al sensor. Cuando no hay nada cerca o algo se sale del rango, aparece "Fuera de Rango" y se enciende el LED de la placa.

Si en cambio ves valores que saltan sin sentido o siempre marca cero, anda a la seccion de errores comunes mas abajo: casi siempre es un cable o el GND.

Variantes y mejoras

Cuando ya tengas el medidor andando, este mismo montaje es la base de proyectos mucho mas entretenidos. Algunas ideas para seguir, que no estan en el tutorial original:

  • Alarma de proximidad con buzzer. Agrega un buzzer activo a un pin digital y hazlo sonar mas rapido a medida que la distancia baja. Es el clasico sensor de estacionamiento casero: a 50 cm pita lento, a 10 cm pita seguido.
  • Auto que esquiva obstaculos. Monta el HC SR04 al frente de un robot con motores y, cuando la distancia baje de cierto umbral, haz que el auto retroceda y gire. Es el primer paso hacia la robotica autonoma.
  • Medidor de nivel para estanques. Apunta el sensor hacia abajo desde la tapa de un estanque de agua: la distancia hasta la superficie te dice cuanto liquido queda. Util para riego o para un acuario.
  • Sumale temperatura para mas precision. La velocidad del sonido cambia con la temperatura del aire. Si combinas el HC SR04 con un sensor DHT11 o DHT22, puedes corregir el calculo y ganar exactitud en mediciones finas.
  • Cambia los pines a tu gusto. Si necesitas el 7 y el 8 para otra cosa, edita los #define echoPin y #define trigPin al inicio del codigo y reconecta. El resto del programa no cambia.

Personalizacion para Chile

En Chile consigues todo lo necesario para este proyecto en MechatronicStore, con stock local y despacho a todo el pais:

Sensor ultrasonico HC SR04 del catalogo de MechatronicStore con sus pines Vcc, Trig, Echo y Gnd visibles

  • Sensor Ultrasonico HC SR04 (SKU G-413) por $3.290 CLP. Es exactamente el modulo de este tutorial, con los pines Vcc, Trig, Echo y Gnd rotulados en la placa.
  • Arduino Uno R3 (SKU X4-8) por $9.990 CLP. La placa compatible cumple la misma funcion que el Arduino del tutorial original a una fraccion del precio de la version SMD importada.
  • Cables macho hembra 30 cm (SKU C-418) por $1.990 CLP. Cuatro de estos cables Dupont te bastan para conectar el sensor directo al Arduino, sin protoboard.

Placa Arduino Uno R3 compatible del catalogo de MechatronicStore

Con esos tres productos armas el medidor completo por menos de quince mil pesos, y te quedan cables de sobra para tu proximo proyecto.

Recursos

  • Tutorial original: Sensor Ultrasonico, por Alberto Cardenas en ElectroCrea
  • Codigo del sketch (.ino): incluido completo mas arriba, tal como lo publico ElectroCrea.
  • Documentacion adicional: hoja de datos del HC SR04 (buscala como "HC SR04 datasheet") para los tiempos exactos de pulso y el rango de operacion.

Guia chilena basada en el tutorial de Alberto Cardenas (ElectroCrea), reescrita y ampliada con explicacion tecnica del calculo y errores comunes, con componentes en stock local en MechatronicStore.

Errores comunes y como solucionarlos

  • Siempre marca 0 o "Fuera de Rango". Casi siempre es el GND: revisa que la tierra del sensor llegue de verdad al GND del Arduino. Sin tierra comun, el pin Echo nunca recibe una señal valida.
  • Lecturas que saltan sin sentido. Suele ser un cable flojo en Trig o Echo, o que confundiste los pines 7 y 8. Recuerda: en este codigo Echo es el 7 y Trig es el 8. Si los inviertes, no mide.
  • Mide raro contra objetos blandos. Telas, esponjas y superficies muy inclinadas absorben o desvian el eco. Prueba contra una pared o un libro para confirmar que el sensor anda bien antes de culpar al codigo.
  • El monitor muestra simbolos raros. La velocidad del monitor serial no coincide con el Serial.begin(9600). Ponlo en 9600 baudios.