Autor: Agustin Gonzalez Redondo. M Rocío García de la Fuente.
Continuando con la línea de trabajo sobre Arduino, hoy presentamos un par de aplicaciones para leer la distancia con dos de los sensores de medida de distancia presentes en el mercado.
El primero de ellos es el HC-SR04 un sensor de ultrasonidos (figura 1), consta de un emisor y un receptor de ultrasonidos que trabajan a una frecuencia inaudible para las personas (40kHz). El sensor funciona como un sonar para determinar la distancia a un objeto, de forma similar a como lo hacen animales como los murciélagos o los delfines.
Su funcionamiento (figura 2) se inicia cuando el pin TRIGGER recibe un pulso de 5V durante 10µs, entonces el sensor transmite 8 ciclos de señal a 40KHz y espera por la señal reflejada, en ese instante el receptor genera un pulso de 5V en el pin ECHO cuya duración es proporcional a la distancia. Esta duración tiene que ver con el tiempo que tarda en recorre la distancia al objeto (ida y vuelta):
Presenta una resolución bastante buena (0,3 cm) cuando se trata de medir distancia a objetos de forma frontal (ángulo máximo 30º), en planos inclinados y rincones la medida no es del todo buena. Su rango oscila entre 2 y 400 cm según el fabricante, por lo que se emplea no sólo para detectar obstáculos, sino también para medir distancias a objetos:
- Velocidad del sonido: 343 m/s ó 0,0343 cm/µs
Espacio=velocidad·tiempo → (Espacio=0,0343·tiempo)
Espacio=2·distancia → distancia=0,0343·tiempo/2
Distancia[cm]=0,01715·tiempo[µs]
Considerando esta ecuación, y el esquema de conexiones de la figura 3, el crearemos un programa basado en funciones, para practicar de la misma forma que hemos hecho ya utilizando processing, basándonos en uno de los muchos programas que existen en la Web para su funcionamiento en la placa Arduino. Se crean para ello dos funciones, en sus respectivas pestañas:
- pin_Ultrasonic (figura 4): la primera de ellas toma como argumentos dos números enteros, y permite definir los pines de entrada (Trig) y de salida (Echo) de una forma genérica.
- distance_Ultrasonic (figura 5): devuelve un valor tipo «long» (número real), se ha realizado a modo de ejemplo, aunque podría ser «void» perfectamente y no devolver valores. Esta rutina se encarga de calcular la distancia conforme a las ecuaciones anteriores, así como de enviar los datos de la medida por el puerto serie para su visualización (figura 6).
De esta forma el programa principal desde el que se llama a la ejecución de las funciones queda muy reducido, prácticamente a las llamadas de las funciones (figura 7).
Además, se puede observar como es muy sencillo añadir otro sensor (o sensores), para ejecutarlos al mismo tiempo, sólo es necesario incluir en el programa principal 3 variables nuevas, la llamada a las dos funciones se realiza con los dos nuevos pines (figura 8).
Esto es un claro ejemplo de reutilización de código y de la utilidad de las funciones que os invitamos a probar (medida de dos distancia simultáneamente), de otra manera, incluir un nuevo sensor de la forma tradicional podría hacer que el programa duplicará su extensión, al ser necesario reescribir el código casi por completo.
Una vez visto el primero de los sensores, de manera análoga trabajaremos con el segundo, SHARP GP2Y0A21, figura 9, se trata de un sensor óptico con salida analógica, compuesto por un sensor de posición PSD (position sensitive detector), un diodo de emisión infrarroja IRED (infrared emitting diode) y un circuito de procesamiento de la señal.
El sensor emplea triangulación para determinar la distancia a los objetos que tiene enfrente, en primer lugar emite una luz pulsada, para minimizar la influencia de la luz ambiente y del color del objeto, y recibe la luz reflejada sobre pequeño sensor CCD (Charge Coupled Device) similar al de las cámaras digitales (figura 10). En función del lugar donde incide el rayo reflejado se genera una señal analógica cuyo valor en función de la distancia viene dado por el fabricante en la gráfica de la figura 11.
Considerando la anterior figura 11, en la que existen dos zonas bien diferenciadas, la relación entre la distancia y la señal analógica enviada por el sensor es la siguiente función exponencial válida para distancia mayores a 7cm:
Teniendo en cuenta todo lo anterior, y las características físicas del sensor que cuenta con 2 pines para la alimentación (Vcc y GND), y un tercero con la salida digital, y tras conectarlo a la placa Arduino (figura 12), procedemos a realizar un programa similar al del sensor HC-SR04 de ultrasonidos, trabajando funciones en distintas pestañas para lograr disponer de un código reutilizable. Así, en este caso, y dado que la entrada es analógica, no es necesario configurar ningún tipo de pin y sólo tendremos que crear una función:
- distancia (int n; int sensorPin) (figura 13): función que retorna un valor tipo “float” (número real), y que sirve para obtener la distancia sobre una media de 200 medidas realizadas, se utiliza un bucle “for” para cada medida a realizar. Tras hacer la media de las entradas tomadas se aplica la ecuación anterior para calcular la distancia.
Por su parte el programa principal (figura 14) realiza la llamada a la función y envía los datos a través del puerto serie, a diferencia del programa para el cálculo de la distancia del sensor HC-SR04 que enviaba los datos desde una función. De la misma manera que hacíamos con el primero de los sensores, la función está pensada para incluir otros captadores sin demasiada complicación, si bien en este caso la diferencia radica a la hora de enviar los datos. y el resultado final tras la ejecución del programa se muestra a continuación en la figura 15.
Para acabar, os dejamos como tarea, sencilla, repetir los mismos pasos que en el programa del HC-SR04 e intentar incluir nuevos sensores. ¿Cómo queda el código? ¿Cómo queda la parte dedicada a enviar los nuevos datos?
AUTORES: M. ROCÍO GARCÍA DE LA FUENTE Y AGUSTÍN GONZÁLEZ REDONDO