lunes, 12 de octubre de 2015

Cálculo de distancias por ultrasonidos

Cálculo de distancias por ultrasonidos


Hola de nuevo. Vamos a ver en esta entrada cómo calcular distancias con un Arduino y un sensor de ultrasonidos tipo el HC-SR04, o similar. Este tipo de montajes tiene diferentes utilidades, pero el denominador común al calculo de distancias.

Yo lo utilizo para evitar las colisiones en los robots domésticos, o bajar velocidades en otras aplicaciones cuando me aproximo al sujeto.  En cualquier caso la precisión decae cuando el obstáculo no está perfectamente perpendicular al sensor, por lo que se debe mejorar el sistema, en caso de aplicaciones críticas.

Pero veamos primero en que basa su funcionamiento este sistema.

Este sensor, usa dos transductores, un emisor y un receptor que trabajan en la frecuencia de los ultrasonidos, inaudible para el ser humano. El emisor emite un pulso que rebota en el obstáculo, permitiendo que el receptor capte el eco de ese pulso. Gráficamente sería algo como esto:



Necesitaremos un poquito de mates y física básica, para poder modelar este comportamiento con nuestro Arduino. Nos interesa conocer la distancia del objeto, por lo que emplearemos la fórmula que relaciona las variables, velocidad, espacio (distancia) y tiempo.

            v=d/t

Despejando la distancia que, que es lo que nos interesa, obtenemos que :

            d=v·t


La velocidad del sonido la conocemos, en el aire a 20ºC es de 343 m/s.

El tiempo, es lo que calcularemos con nuestro Arduino. ¿Cómo? Calculando el tiempo que pasa entre que el traductor emite el sonido, y el receptor lo capta. Para eso necesitaremos presentar una función nueva, pulseIn

Esta funcion sirve para medir pulsos, es decir, el intervalo que pasa entre que una señal pasa de un nivel bajo a un nivel alto o viceversa. La medición la realiza en microsegundos.

La sintaxis de esta función es:


pulseIn(pin, value, timeout)


Donde:
  • pin, es el conector donde conectaremos el receptor de la señal, v
  • value, que debe ser HIGH o LOW, según si queremos detectar un flanco de subida o de bajada, para el caso que nos ocupa, HIGH.
  • timeput, es opcional, y sirve para delimitar el tiempo que queremos que nuestro Arduino esté "escuchando" en espera de un cambio. Si el tiempo de espera supera los 3 minutos dará un error de timeout ( devuelve un 0).
Este valor, es más importante de lo que parece, pues es el que nos dará fluidez en el programa. Por un lado limitará el tiempo de escucha agilizándolo. También es razonable que si el sensor no puede medir más de 6 metros , la escucha sea de 3 minutos, es decir detectar un objeto a más de                ¡¡¡30 kilómetros !!!


Por último, es importante tener en cuenta que las ondas realizan un trayecto de ida y vuelta. Es decir, se emiten, van al objeto, rebotan y vuelven. ¿ Lo has adivinado? Pues sí, la distancia que calculamos, la tenemos que vivir entre dos para obtener lo que andábamos buscando.

Bueno, después de la introducción teórica, vamos a ver el montaje, que en esta ocasión , es bien sencillo:



Y el sketch, que quedaría de la siguiente manera. 

long distancia; 
long tiempo;
int trigger=9;// pin trigger del SR04
int echo=8;// pin echo del SR04

void setup (){
  Serial.begin(9600);// preparamos el port serial para ver lecturas
  pinMode(trigger,OUTPUT); // definimos trigger  como salida
  pinMode(echo,INPUT); // y echo como entrada
}

void loop (){
  digitalWrite(trigger,LOW);  // Aseguramos que esta 0
  delayMicroseconds(5);       //Retraso para asegurar respuesta
  digitalWrite(trigger,HIGH); // Lanzamos el pulso
  delayMicroseconds(10);//
  tiempo=pulseIn(echo,HIGH,2945);  // MEdimos el tiempo del rebote
  // timeout calculado para 50cm
  distancia = (0.0343*(tiempo/2));//Usamos las unidades apropiadas, en 
  // este casola velocidad del sonido en cm/microsegundos
  // Y lo dividimos entre 2 para mostrar distancia "solo ida"
  Serial.println("Distancia");//mostramos resultados 
  Serial.println(distancia);  //en el monitor serial
  Serial.print("cm"); // en cm
  
}


Quedaría explicar  el valor del timeout.

Imaginad que quereis ignorar, distancias superiores a 50cm. Por tanto deberemos calcular que tardaría la onda de sonido en recorrer 50cm, ida y vuelta. Despejando el tiempo de la fórmula anterior:


                                                                        t=e/v

Usando las unidades apropiadas, cm y cm/us, (recordar multiplicar la distancia x 2 )nos daría un tiempo de,

                t=e/v= 100/0,0343 = 2915 microsegundos

Haced vosotros la cuentas de la cantidad de cosas que puede hacer nuestro Arduino con el tiempo que    se ahorra limitando el tiempo de escucha. Borrando el valor, el limitante será la capacidad del sensor que usemos.


Y como función?

Como ya explicamos en una entrada anterior, ésta, sería interesante generar una función para que fuese más sencillo introducirlo en un programa más complejo, como por ejemplo un robot de suelo, o similar, de manera que se pudiese llamar en cualquier momento. Esta parte os la dejo a vosotros, pero no dudes en plantear cualquier duda.

Nos vemos!

Os dejo con un video del experimento. Como vereis la precisión es mejorable, pero es un buen mecanismo de aproximación y anticolisiones.








No hay comentarios:

Publicar un comentario