Medir distancias con Arduino (proyecto 2)

Hoy vamos a trabajar con uno de los componentes que viene con el pack de iniciación: el medidor de distancias por ultrasonido. Este componente es muy fácil de distinguir porque tiene esta pinta:

Cortocircuito
Cortocircuito (el hermano mayor del HC SR204)

El HC-SR04: medidor de distancias por ultrasonido

¿Cómo funciona este componente? Os pongo un ejemplo de la vida real para que lo entendáis:

Si alguna vez habéis caminado entre montañas o habéis estado en un recinto lo suficientemente amplio, habréis podido escuchar vuestro propio eco. Una manera de medir una distancia sería gritar muy fuerte y medir el tiempo hasta que escucháis el eco. Sabiendo la velocidad a la que viaja vuestra voz podríais calcular la distancia recorrida por vuestra voz, que será el doble de la distancia hasta la montaña o pared que está haciendo rebotar vuestra voz.

El HC-SR04 funciona de la misma manera: transmite ultrasonidos y luego detecta cuándo se recibe, y nosotros nos encargaremos de calcular la distancia a partir del tiempo que ha tardado en recibir el eco. Aquí tenéis el link a las especificaciones del HC-SR04.

Pines del MC-SR04

Este componente tiene 4 patillas:

"<yoastmark

  • Dos pines para alimentar el componente (necesita corriente para poder funcionar):
    • Vcc: pin de alimentación. Según el documento de especificaciones se alimenta con 5 voltios.
    • GND: el pin de retorno de la corriente de alimentación.
  • Dos pines para activar el envío y recibir la respuesta:
    • TRIGGER: en inglés significa “gatillo” o “disparador” y sirve para activar la transmisión del ultrasonido.
    • ECHO: como nos podemos imaginar es el pin por el que leer la detección del eco.

Conexión del HC-SR04 a la placa Arduino

Tenemos dos juegos de pines: los de alimentación, y los de envío y recepción de datos. Los vamos a conectar de la siguiente manera:

  • Para los pines de alimentación (Vcc y GND) vamos a localizar en nuestra placa Arduino la sección de pines marcada como “POWER”. Podremos encontrar entre ellos un pin marcado como GND y otro pin marcado con 5V, que conectaremos con los pines GND y Vcc del componente.
  • Para los pines de envío y recepción de datos, vamos a utilizar dos pines digitales cualquiera (en mi caso, el pin 9 y 10).

Cómo ver que un LED se encienda lo vimos en este post anterior. Además, en el circuito voy a incluir también un LED, de manera que cuando un objeto esté muy cerca el LED se encienda, como si fuera un detector de colisión. Por tanto, además de los pines anteriores también ocuparemos otro pin digital y podemos utilizar el mismo ping GND o el ping GND digital.

La conexión a la placa quedaría de esta manera:

Conexión HC SR04 (1)
Conexión HC SR04 (1)

Y la conexión con el HC-SR04 y el LED quedaría así:

Conexión HC SR04 (2)
Conexión HC SR04 (2)

Cálculos previos

Si vamos a la especificación, vemos que nuestro medidor de distancia hace lo siguiente:

Diagrama temporal detección de distancias por ultrasonidos
Diagrama temporal detección de distancias por ultrasonidos
  1. Nosotros activamos el pin TRIGGER al menos 10 microsegundos a nivel HIGH.
  2. Después, el dispositivo envía 8 pulsos a una frecuencia de 40KHz.
  3. Tras esto, recibiremos el pulso de retorno tras un retardo. La duración del pulso de retorno es equivalente al tiempo de retardo. La fórmula que nos proponen en las especificaciones para medir la distancia es:
distance=high level time * velocity (340m/s) / 2 = high level time (us) * 340 (m/s) / 2 = high level high (us) * 0,00017 m

Es decir, cada microsegundo de retardo equivale a 0,00017 metros, o 0,17 milímetros.

¿Qué debería hacer nuestro programa?

Antes de ponernos a escribir el código, es conveniente pensar y listar las operaciones que debemos ejecutar, aunque sea de manera descriptiva. Con todo lo que hemos visto hasta ahora, nuestro programa debería ejecutar la siguiente secuencia de operaciones:

  • Comenzamos definiendo las constantes y las variables que utilizaremos en el programa.
  • Inicializamos:
    • El puerto serie para poder escribir traza, tal y como explicamos en el post anterior: Logs y trazas en Arduino.
    • Los pines digitales que vamos a utilizar.
  • Una vez en el loop:
    • Desactivamos el pin TRIGGER por seguridad.
    • Activamos el TRIGGER y esperamos 10 microsegundos.
    • Escuchamos la respuesta del pin ECHO mediante la función PulseIn. Esta función devuelve el tiempo en microsegundos de un pulso.
    • Traceamos la duración del pulso.
    • Calculamos la distancia en milímetros.
    • Traceamos la distancia calculada.
    • Activamos o desactivamos el LED en función de la distancia calculada.
    • Desactivamos el pin TRIGGER.
    • Esperamos un segundo hasta el siguiente loop.

Codificando el medidor de distancia

Con todo lo que hemos explicado, el programa será el siguiente:

// Constants
int PIN_TRIGGER=9;
int PIN_ECHO=10;
int PIN_LED=12;
long MIN_DISTANCE=200; // in milimeters
int LOOP_DELAY=1000; // one second

// Vars
long distance;
long echoDurationTime;
String stringOutput;

void setup(){
 Serial.begin(9600);
 pinMode(PIN_TRIGGER, OUTPUT);
 pinMode(PIN_ECHO, INPUT);
 pinMode(PIN_LED,OUTPUT);
 
}

void loop(){
 Serial.println("---------------------------------");
 digitalWrite(PIN_TRIGGER,LOW); // Assure that we are LOW before we activate the trigger
 digitalWrite(PIN_TRIGGER, HIGH); // Activate the trigger
 delayMicroseconds(10);

echoDurationTime=pulseIn(PIN_ECHO, HIGH); // Read the echo signal
 // Trace delay
 Serial.print("Delay: ");
 Serial.print(echoDurationTime);
 Serial.println(" us");
 
 distance= 0.17*echoDurationTime; // Distance in milimeters
 // Trace distance
 Serial.print("Distance: ");
 Serial.print(distance);
 Serial.println(" mm");
 
 // Light the LED if objects are too close 
 if (distance<MIN_DISTANCE) {
  Serial.println("Activate LED: object too close!!!");
  digitalWrite(PIN_LED,HIGH);
 } else {
  Serial.println("Deactivate LED: objects are far...");
  digitalWrite(PIN_LED,LOW);
 }

// Wait till next loop
digitalWrite(PIN_TRIGGER,LOW);
delay(LOOP_DELAY);
}

Resultados

Si activamos el monitor del puerto serie veremos en traza algo como esto:

Medidor de distancia: traza
Medidor de distancia: traza

Podemos ver cómo al mover un objeto delante del medidor de ultrasonidos, el retardo cambia, la distancia calculada cambia y cuando está por debajo de la distancia mínima se activa el LED.

Como diría Coco:

  • Esto es lejos:
Detección de distancias: lejos
Detección de distancias: lejos
  • Esto es cerca:
Detección de distancias: cerca
Detección de distancias: cerca

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *