Sensor ultrasónico HC-SR04 y Arduino

El HC-SR04 es un sensor de distancia que funciona por ultrasonido. Básicamente lo que hace es enviar un pulso llamado trigger, inaudible para cualquier ser humano, rebotar en algún objeto y recibirlo (eco). Con este principio es posible medir distancias sabiendo que la velocidad del sonido es de 345 metros por segundos.

diagrama-hcsr04
Conexiones del sensor de distancia.

Para poder calcular la distancia simplemente utilizamos la siguiente fórmula:

formula_ping

Este módulo de bajo costo posee las siguientes características:

  • Tensión de trabajo: 5VDC
  • Corriente de reposo: menor a 2mA
  • Ángulo de lectura: menor a 15º
  • Distancia: 2 – 450cm
  • Resolución: 0,3cm

Con el sensor HC-SR04 y una placa Arduino podemos armar un medidor de distancia en menos de 5 minutos. Utilizando la librería Ultrasonic podemos medir distancias con muy poco código. Por defecto solo es posible medir hasta 51cm de distancia, pero con una sencilla modificación en el archivo ultrasonic.ccp podemos llegar hasta los 5m. Buscamos la siguiente línea y modificamos el valor de time_out:

Time_out=3000; // 30ms para 5 metros, 3ms para 50cm.

A continuación el ejemplo que viene con la librería. Funciona muy bien y es sencillo de implementar:

// Ultrasonic - Library for HR-SC04 Ultrasonic Ranging Module.
// Rev.4 (06/2012)
// J.Rodrigo ( www.jra.so )
// more info at www.ardublog.com

#include <Ultrasonic.h>
Ultrasonic ultrasonic(9,8); // (Trig PIN, Echo PIN)

void setup() {
  Serial.begin(9600); 
}

void loop() {
  Serial.print(ultrasonic.Ranging(CM)); // CM or INC
  Serial.println(" cm" );
  delay(100);
}

También se puede resolver el código sin utilizar librerías. Haciendo uso del comando pulseIn que nos brinda el entorno Arduino podemos hacer lo mismo con un poco más de trabajo. El ejemplo a continuación:

// HC-SR04 & ARDUINO -- AUTOMATISMOS MAR DEL PLATA

#define ECHO 8        // Pin para recibir el pulso de eco
#define TRIGGER 9     // Pin para enviar el pulso de disparo

unsigned int tiempo, distancia;

void setup() {
  Serial.begin(9600); 
  pinMode(ECHO, INPUT);
  pinMode(TRIGGER, OUTPUT);
}
  
void loop() {
  digitalWrite(TRIGGER, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIGGER, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGGER, LOW);

  // Calcula la distancia midiendo el tiempo del estado alto del pin ECHO
  tiempo = pulseIn(ECHO, HIGH);

  // La velocidad del sonido es de 340m/s o 29 microsegundos por centímetro
  distancia= tiempo/58;

  //manda la distancia al monitor serie
  Serial.print(distancia);
  Serial.println(" cm");
  delay(200);  
}

Por último les dejo algunas fotos del prototipo armado en un protoshield.

+ Descargar ejemplos, librerías, esquemas.

Más sobre sensores