El sensor de distancia

Objetivos

    • Sensor ultrasónico de distancia.
    • Medir el tiempo, el método delayMicroseconds().
    • Más funciones disponibles: pulseIn().

HC-SR04

 Material requerido.

 arduino  Arduino Uno o similar.
 Img_3_4 Una Protoboard.
 HC-SR04 Sensor de distancia HC-SR04
 RedLed_ Un diodo LED
Img_3_5 Una resistencia de 330 Ω
Img_3_6-300x185 Cables

Como funciona un sensor de distancia

La ecolocación  o ecolocalización, a veces también llamada biosonar, es la capacidad de algunos animales de conocer su entorno por medio de la emisión de sonidos y la interpretación del eco que los objetos a su alrededor producen debido a ellos.

El concepto básico, es siempre el mismo, sabiendo a qué velocidad viaja el sonido, si emitimos un pulso sónico corto y escuchamos cuanto tiempo tarda en regresar el eco podemos calcular la distancia a la que se encuentra el objeto en el que ha rebotado la señal.

Lo que haremos será utilizar un sensor de distancia sencillo HC-SR04, que nos permite enviar estos pulsos ultrasónicos y escuchar el eco de retorno. Midiendo este tiempo, podemos calcular la distancia hasta el obstáculo.

  •  El oído humano no percibe sonidos por encima de 20kHz. Por eso, a las ondas de mayor frecuencia las llamamos ultrasonidos ( mas allá del sonido).  Los sensores de ultrasonidos funcionan sobre los 40 kHz.
  • No son perfectos, les influye la temperatura ambiente, la humedad y los materiales en los que reflejan, lo que genera una cierta incertidumbre. Pero a cambio son baratos y efectivos hasta un poco más de 3 metros en condiciones normales si la precisión no es un problema determinante

El esquema.

Veamos como conectar uno de esto detectores a nuestros Arduinos. Pondremos un led rojo para encenderlo en caso de detección:

hc-sr04_02

El Programa

Vamos con el programa, empezamos definiendo algunos valores:

#define trigPin 13
#define echoPin 12
#define led 2

Hasta ahora habíamos visto que podíamos definir una variable como int, por ejemplo, y también como una constante (const int pin).  Vamos a probar otro método, el #define que es una directiva para el compilador.

Esto solo significa que el compilador cambiará todas las ocurrencias (apariciones) de estos #define en nuestro programa por su valor, antes de compilar. Esta es la forma clásica de C de hacer esto y tiene la virtud de que no ocupa memoria definiendo una variable .

void setup()
   {    
       Serial.begin(9600);
       pinMode(trigPin,OUTPUT);
       pinMode(echoPin,INPUT);
       pinMode(led,OUTPUT);
   }

Tenemos otra función delayMicroseconds(µs) que simplemente congela Arduino el número especificado de microsegundos.

Para dar un pulso ultrasónico lo que hacemos es activar el pin Trigger durante unos microsegundos y para ello lo ponemos en HIGH, antes de escuchar el eco:

digitalWrite(trigPin,LOW);//trigger desactivado
delayMicroseconds(2); //Para estar seguros

digitalWrite(trigPin,HIGH);//Activamos pulso
delayMicroseconds(10); // Esperamos 10µs

digitalWrite(trigPin,LOW); // Cortamos el pulso

Para escuchar el pulso vamos a usar otra función  pulseIn().

Básicamente lo que hace es escuchar el pin que le pasamos, buscando una señal que pase de LOW a HIGH ( si le pasamos HIGH como parámetro) y cuenta el tiempo que tarda en volver a bajar desde que sube.

long duracion, distancia ;
duracion = pulseIn(echoPin,HIGH);

Ahora ya sabemos el tiempo que tarda en volver el eco en µs. Como la velocidad del sonido es de 343 metros/segundo, necesitamos 1/343 = 0,00291 segundos para recorrer un metro.

Para usar una medida más cómoda podemos pasar esto  a microsegundos por centímetro: 29.1 µs/cm.

El factor de conversión será la mitad (ir y volver) de: 1/29.1 = 0.017

El programa

#define trigPin 13
#define echoPin 12
#define led 2

void setup(){

Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(led, OUTPUT);

}

void loop(){  

int limite=200;

long duracion, distancia ;

digitalWrite(trigPin, LOW);        // trigger desactivado
delayMicroseconds(2);             

digitalWrite(trigPin, HIGH);       // Activamos el pulso
delayMicroseconds(10);             // Esperamos 10µs.
digitalWrite(trigPin, LOW);        // Cortamos el pulso

duracion = pulseIn(echoPin, HIGH) ;
distancia = duracion * 0.017 ;
Serial.println(String(distancia) + » cm.») ;

if ( distancia < limite)
          digitalWrite ( led , HIGH) ;
     else
         digitalWrite( led , LOW) ;
delay (500) ;    // Para limitar el número de mediciones

}

Para convertir esto en un detector de movimiento se ha creado  una variable un poco menor de la medida que el sensor recibe en vacío (en este caso unos 200 cm). Si la distancia medida cae por debajo de este valor es que algo se ha interpuesto y por tanto encendemos una alarma, en nuestro caso un  LED.