Mostrando entradas con la etiqueta SHARP. Mostrar todas las entradas
Mostrando entradas con la etiqueta SHARP. Mostrar todas las entradas

domingo, 13 de septiembre de 2015

Sensor de distancia infrarrojo GP2Y0A21YK0F - Sketch




En entradas anteriores ya hemos presentado las características más relevantes del sensor de distancia infrarrojo GP2Y0A21YK0F, sus limitaciones y cómo podemos conectarlo a nuestra placa Arduino.


Hoy vamos a ver como escribir un sketch sencillo para empezar a obtener datos rápidamente.


Pero antes, volvamos al principio, volvamos al datasheet the SHARP y la recomendación qu identificamos cuando estuvimos haciendo la presentación del mismo.

Sin entrar en detallar el valor de los condensadores entre las líneas de alimentación y el valor de los condensadores para filtrar los ruidos electrónicos (que no son más que falsas perturbaciones en la señal que puede ser interpretada como información y no lo son), podemos decir que para este sensor de distancia de SHARP, lo recomendable no solo es ponerle el condensador electrolítico de 10 microfaradios sino además ponerle uno cerámico de 100 nanofaradios, entre la alimentación y el GND, además de una pequeña resistencia de 10 ohms (tal como aconseja el fabricante bq).

Es posible que si no los ponemos, no tengamos mayores problemas, si nuestro Arduino no tiene muchos más sensores o motores montados, pero podría ser que no fuera ese nuestro caso y el sensor empiece a comportarse de forma extraña.

Por ello y como no va a hacer ningún mal al dispositivo, si tenéis algo a mano, lo recomendable es montarlo. En otra entrada intentaremos caracterizar el impacto de esta mejora de forma cuantitativa.

Dicho esto,  a continuación hemos incluido la versión más simplificada del código que podéis usar para detectar obstáculos con este sensor. Viendo el tipo de datos que suministra que da, no nos resultará complicado implementar algunos comportamientos a nuestro robot.

Pero si lo que vais persiguiendo no es solo detectar obstáculos sino medir a las distancias a las que se encuentran, la tarea es un poco más complicada, por dos razones:

  1. Como vimos en la introducción, el comportamiento de la señal no es lineal, por lo que tendremos que empezar primero calibrando la respuesta en todo el rango de medidas, una vez hecho esto, tendremos nuestro "traductor" personal
  1. Como las medidas pueden estar sujetas a ruidos electrónicos que provoquen resultados erróneos, tendremos que implementar un sistema de corrección en el sketch por un procedimiento de medidas medias, esto hará que consumamos un poco más de los recursos iniciales previstos (aunque muy probablemente ni lo notemos)


Así que en la próxima y última entrada, presentaremos el procedimiento de calibración y ajuste de las medidas.

Y ya sabéis, si tenéis alguna sugerencia o duda, no tenéis más que mandarnos un correo a


e intentaremos responder a vuestra pregunta lo antes que podamos.



/*
 
 Sensor de distancia infrarrojo Sharp GP2Y0A21
 
 VCC conectado a Arduino 5v 
 GND conectado a Arduino GND
 Salida analogica conectada al pin analogico de Arduino A0 
 
 Creado el 13 de septiembre de 2015
 por M.Dominguez 
 
*/


// Vamos a empezar definiendo las variables que vamos a usar en nuestro Sketch


int salida = 0; // Es el PIN analogico que vamos a usar para detectar


// Ahora configuramos el bloque setup 
// que es la parte del sketch donde decimos que pines vamos a usar
// y si son analogicos (ANALOG) o digitales (DIGITAL)
// si son de recepcion (INPUT) o (OUTPUT)
// si vamos a comunicarnos por el puerto serie o no
// (y asi poder ver leer por el monitor los resultados)
// etc


void setup(){
  Serial.begin(9600);
  
  // Gracias al puerto serie, podemos leer lo que Arduino recibe por sus canales 
  // Abre un puerto de comunicacion serie 
  // y espera a que se abra
  // y le estable la velocidad de transmision 
  // de esta informacion en baudios
  // un baudio es un bit por segundo 
  // En este caso a 9600 baudios
}

// Configuramos el bloque loop
// Es la parte principal de nuestro programa pues en el tendremos 
// que poner el código para que el microcontrolador lo ejecute las ordenes
// que le demos lo ejecute de manera repetitiva, 
// mientras la placa Arduino tenga energía

void loop(){
  int val = analogRead(salida); // aqui lo que hacemos es definir la variable
  // local, esto es que solo se utilizan en esta parte del codigo
  // y le dice al microcontrolador que tanto la 
  // duracion como la distancia, van a ser numeros enteros (INT)
  Serial.println(val); //pintamos en el monitor serie el valor que obtenemos
  delay(100); // y con objeto de que no vaya demasiado rapido, hacemos que se 
  // pausando  100 milisegundos antes de comenzar otra lectura

}







Sensor de distancia infrarrojo GP2Y0A21YK0F - Conexionado


Tras la introducción que hicimos en nuestra entrada anterior, vamos a ver ahora cómo deberíamos conectar nuestro sensor GP2YA021YK0F a la placa Arduino y qué clase de código deberíamos emplear para obtener resultados de visibles a través de nuestro monitor serie.

Lo primero es echarle un vistazo de nuevo al datasheet del sensor a ver si podemos identificar cuál es el pin-out del mismo.

En la segunda página de la hoja de características del sensor (datasheet en inglés) no solo podemos encontrar las dimensiones del mismo, sino que además vemos que se detalla qué clase de conector trae montado (del tipo PH del fabricante JST) y además define la función de cada uno de los pines.


poco después declara el tipo de alimentación (supply voltage en inglés) que recomienda. La tensión de alimentación debe encontrarse en el rango desde 4,5 voltios a 5,5 voltios.

Lo cual hace de este sensor un candidato fantástico para nuestra placa Arduino. Dado que es capaz de suministrar 5 voltios por medio de nuestras salidas digitales (aunque si quisiéramos usar una fuente externa parece ser que el mismo podría regular la tensión de algún modo gracias al propio regulador que el mismo sensor tiene embebido. Esto lo podemos ver en su diagrama de bloques, ver imagen a continuación. El diagrama de bloques básicamente es un descripción esquemática de todas las funcionalidades individuales que se han implementado en el diseño del dispositivo).

Aunque esta opción siempre es preferible dejarla como última alternativa, no creemos que pueda regular mucho más allá de un par de voltios por encima de los 5 requerido, y si la fuente que vamos a usar tampoco está regulada podríamos acabar por destruir nuestro sensor.

Pues bien, visto esto, ahora solo queda lo más sencillo, el cableado:

  1. conectaremos el cable Vcc a un PIN de 5voltios, 
  2. conectaremos el pin GND a un PIN GND de la placa y por último 
  3. conectaremos el pin 1, el dedicado a la señal analógica que genera, a un PIN analógico de los que tengamos en nuestra placa, nosotros hemos seleccionado el PIN A0.


En la próxima entrada propondremos un sketch simple que nos permitirá evaluar los resultados que podemos obtener con este tipo de sensores. 

Y ya sabéis, si tenéis alguna sugerencia o duda, no tenéis más que mandarnos un correo a
e intentaremos responder a vuestra pregunta lo antes que podamos.

Sensor de distancia infrarrojo GP2Y0A21YK0F - Introducción






Hace ya algún tiempo que estuvimos presentando como funcionaba el sensor ultrasónico HC-SR04 y un sketch que podríamos usar para verlo en acción.  Con este sensor ultrasónico, podíamos medir un rango de distancias sensible entre 3cm y 3m con una precisión de 3mm.

Y como ya explicamos en su momento, funciona del mismo modo que lo hacen los murciélagos, esto es, enviando un ultrasonido (inaudible para el oído humano por su alta frecuencia) a través de uno de la pareja de cilindros que compone el sensor (un transductor) y espera a que dicho sonido rebote sobre un objeto y vuelva, retorno captado por el otro cilindro. 

Pues bien hay situaciones en las que nos podría interesar no tanto medir la distancia real a la que estamos de un obstáculo sino más bien si hay alguno lejos, cerca o muy cerca, y en función de los resultados tomar decisiones sobre la marcha de nuestro robot. Este tipo de enfoques no permitiría un procesado más rápido de la señal, y menos recursos computacionales de los datos. Debemos de tener en cuenta que para calcular la distancia a la que se encuentra un obstáculo usando el sensor ultrasónico, debemos emitir un pulso sónico, esperar el eco, y luego con sabiendo que la velocidad del sonido en el aire es de valor 340 m/s, o 0,034 cm/microseg (ya que trabajaremos con centímetros y microsegundos) y que la formula de la velocidad es


Tendremos el espacio de ida y vuelta recorrido por nuestro pulso ultrasónico, 



ahora tendremos que dividirlo entre dos para saber la distancia a la que se encuentra (recordemos que el pulso va y viene, por lo que la distancia del obstáculo es la mitad de la recorrida por nuestro pulso de ida-detección-vuelta-notificación)

Además, como el pulso se genera siempre a una frecuencia dada, imaginaros si tenemos tres o cuatro sensores ultrasónicos a la vez, cada uno mirando a un lado de nuestro robot, sin duda alguna correremos el riesgo de que ciertos ecos de un sensor se reciban por otro sensor y los interprete como propios, por lo que adicionalmente a los recursos que nuestro Arduino debe emplear para el cálculo de la distancia, tendremos que implementar otros filtros a nivel de programación para identificar los falsos ecos y descartarlos.

Por todo ello, a veces solo queremos saber si hay o no hay un obstáculo y hacerlo muy deprisa. Por ejemplo si estamos diseñando un seca manos que necesita ver si un cliente tiene las manos en el rango de trabajo del secador.

Para ello podríamos pensar en buscar algún sensor que funcionara con luz en lugar de con sonido. Todos sabemos que la velocidad de la luz es casi un millón de veces más rápida que la del sonido (es la razón de que vemos primero el relámpago y luego escuchamos el trueno). 

Pues bien, la empresa SHARP tiene diseñado una serie concreta para rangos de trabajo diferentes. Tres ejemplos de ellos los mostramos a continuación
  1. De 4 a 30 cm, el GP2Y0A41SK0F
  2. De 20 a 150 cm, el GP2YA02YKF
  3. De 10 a 80 cm, el GP2YA021YK0F
Y hemos presentado estos tres por que son los tres que vienen con terminación en conectores de la serie PH del fabricante JST, 




que nos permitiría implementar el mismo tipo de conexionado independientemente del rango de distancias y sensor que vayamos a usar. Todos ellos tienen el mismo configuración de los pines (lo que se conoce por el pin-out).

Adicionalmente y con objeto de que lo podamos usar en distintas configuraciones el propio POLULU ha diseñado diferentes escuadras para poder anclarlo en la forma que más nos apetezca


de este modo, podríamos situarlos como vemos a continuación, 




O mejor, si lo colocamos encima de un servomotor, podremos con un solo sensor de infrarrojos mapear todos los obstáculos que se encuentren a nuestro alrededor.



Visto la parte mecánica, ahora echemos un vistazo a la parte eléctrica. De estos tres modelos que hemos presentado, nos vamos a centrar en el rango intermedio de 10 a 80 centímetros ofrecidos por POLULU:  GP2YA021YK0F.

Las características más relevantes del mismo son:

Parámetros
Valor
Rango de distancia
10 – 80 cm
Velocidad de muestreo
26 Hz
Rango de tensión de trabajo
5.5 – 4.5 voltios
Consumo de corriente
30 mA
Tipo de salida
Analógica
Diferencia de tensión entre extremos
1,9 voltios (80 cm contra 10 cm)

Lo primero que nos salta a la vista es el consumo del sensor 30 mA. Si recordamos lo que vimos en entrada en la que estuvimos viendo las limitaciones de potencia eléctrica, aunque no debemos sobrepasar 40 mA en los pines digitales, lo recomendable es mantenerse en el orden de los 20 mA. Es por ello, por lo que el propio SHARP en previsión de que pueda haber algún tipo de problemas con el suministro, aconseja que se coloque un condensador de 10 µF o mayor, entre el pin de alimentación y de tierra para estabilizar la línea.



Lo segundo que vemos es que la salida es analógica, y no digital como hubiéramos esperado para este tipo de sensores. Por lo que podríamos creer que son una formula parecida a la que usamos para nuestro sensor de ultrasonido, podríamos no solo detectar el obstáculo, sino también calcular la distancia a la que se encuentra.

Como podemos ver en la gráfica que mostramos a continuación, la respuesta del sensor no es lineal más allá de los primeros centímetros, 



por lo que dejaremos para otra entrada, como calcular la fórmula y hacer los ajustes necesarios para calibrar los resultados de forma adecuada.


En la próxima entrada veremos los esquemas de conexión que debemos usar y un sketch simple que nos permitirá evaluar los resultados que podemos obtener con este tipo de sensores. 

Y ya sabéis, si tenéis alguna sugerencia o duda, no tenéis más que mandarnos un correo a



e intentaremos responder a vuestra pregunta lo antes que podamos.