viernes, 3 de abril de 2015

MODIFICACION LIBRERIA "QTR SENSORS" PARA MEJOR SENSADO - Parte I

Modificacion de librería"QTR SENSORS" para un mejor sensado

En este post  voy a presentar algunas de las modificaciones que hice al a librería "QTRSensors" para  el uso con los sensores "qtr 8rc" y "qtr 8a"  para lecturas en  linea blanca. 


En la libreria  QTRSensors se tiene la opcion de cambiar el tipo de linea que queramos sensar, cambiando desde la funcion de lectura de linea o mejor dicho:
qtrrc.readLine(sensorValues, QTR_EMITTERS_ON, 0);

En las indicaciones nos dice que si queremos sensar lineas blancas, entonces debemos colocar en el ultimo parámetro de la funcion un "1" en ves del 0 que esta por defecto para las  lineas negras. 

Hasta aqui todo esta bien, pues solo hay que cambiar un parametro y listo, deberia funcionar bien para lineas blancas. Pero aqui viene  lo  frustrante del caso, o almenos ocurrió en el mio:

Yo utilizaba los sensores "qtr-8rc" en un robot velocista que debia competir para  una pista  que estaba impresa  en un baner que tenia lineas blancas y el fondo era negro, y me di con la sorpresa que el robot no seguía las lineas. tras varios test que hacia al robot y cuestionamientos, chekar infinidad de veces la programación , no llegaba a ver cual era la razón por la que no funcionaba bien el robot. 
Me puse  a indagar en internet y foros acerca del tema pero, nadie daba con la respuesta, Asi que me llene de valor y  decidí a  resolver este misterio.  Busque los datasheets de cada componente, estudie  a profundidad el esquema electronico del arreglo de los sensores, y no encontre  nada de malo, por lo que la unica solucion podria hallarse en el algoritmo de sensado de la libreria, asique no me quedo de otra que tratar de entender a la libria QTRsensors  para buscar la solucion.
Pues, asi fue, le dedique su  tiempo a eso y logre entender el funcionamiento de la libreria y puedo decir  que encontre la solucion :D.  Ahora les explicare:


MODIFICACION DE LA FUNCION DE LECTURA DE LINEA
Puedes descargar la libreria modificada:" https://mega.nz/#!CkMkiZhA!FMK4eJQVmOGZK9GZzfqSKRgEPOijTSkMmbNDUwbf5C0"

La instalacion es como cualquier otra libreria convencional de arduino, por lo que eso pasos los ignorare, o sino puedes guiarte del post donde hablo de eso : Utilizando la libreria QTR SENSORS


Como veran ahora en la modificacion que hice aparecen  3 nuevos parámetros: flanco_color, en_linea, ruido.

         qtrrc.readLine(sensorValues, QTR_EMITTERS_ON, 1, flanco_color, en_linea, ruido);

flanco_color: Este parametro sirve para aumentar  o disminuir valores de lectura. Como sabemos cada  sensor lee valores desde 0 ( mínima reflactancia) hasta 1000 (maxima reflactancia). pero    segun los testeos que hice, no se llega a obtener un valor adecuado, por eso  cree una variable que aumentara o disminuyera esos valores forzosamente para asi obtener valores decentes que sean medibles. el valor por defecto es 0

en_linea: Con este parámetro podemos variar la forma en que la libreria  tomara los valores de los sensores y los considerara "si esta o no en una linea", luego la libreria tomara los valores de cada sensor y los  promediara para asi obtener un valor de posicion con respecto a esa linea. su valor por defecto es de 200.

ruido: Con este parametro se podra variar  desde que valores  de reflactancia es  considerados como ruido, el valor por defecto es de 50.


EN ACCION!

Unos valores que probe en linea blanca  que funcionan, y podria decir que hasta mejor que antes,  son estos :

             position = qtrrc.readLine(sensorValues,QTR_EMITTERS_ON, 1 , 0 , 400 , 30);
             position = qtrrc.readLine(sensorValues,QTR_EMITTERS_ON, 1 , 500 , 400 , 50);
             position = qtrrc.readLine(sensorValues,QTR_EMITTERS_ON, 1 , 500 , 500 , 50);
             position = qtrrc.readLine(sensorValues,QTR_EMITTERS_ON, 1 , 300 , 500 , 100);

Valores para linea negra:
 position = qtrrc.readLine(sensorValues,QTR_EMITTERS_ON, 0 , 0 , 400 , 30);
position = qtrrc.readLine(sensorValues,QTR_EMITTERS_ON, 0 , 0 , 300 , 50);
position = qtrrc.readLine(sensorValues,QTR_EMITTERS_ON, 0 , -200 , 200 , 100);

pueden  probar con estos  valores, y  ver que tal les va. Cada valor dependera del tipo de superficie, por lo que los resultados variaran, asi que si no te resulta estos valores trata de buscar tus valores adecuados testeando los con el ejemplo y te sacas la duda de como funcionan en verdad cada paramtro ;) :

Nota: esta modificacion es valida tambien para sensores QTRA (todavia no he  probado en estos sensores , pero en teoria deberian funcionar, si lo pruban porfavor aganmelo saber si les funciono o no  para seguir mejorandolo :D). Si lo quieres utilizar para estos sensores solo debes  escoger el ejemplo que dice QTRAExample y cambia lo mismo como lo indicado arriba.


4 comentarios:

Te felicito por resolver tu problema por si mismo asi es que nacen los verdaderos programadores

buenas una consulta
se aplica también en un sensor qtr8rc (chino)???

me gustaría saber tambien

No encuentro las lineas que modificastes, puedes describrir en que parte de los archivos se encuentran, me interesa modificar para el qtr8a.

Publicar un comentario