Es momento de calibrar y hacer funcionar correctamente nuestro sensor de color. A través de la página de programación de ClumSee podemos desarrollar facilmente con bloques el siguiente programa y con la conexión que desarrollamos en la lección anterior realizaremos la calibración de nuestro sensor de color.
Este es un paso muy importante, porque calibrar es la manera de decir que no todos los robots son iguales por dentro. Calibrar es el proceso para hacer que nuestro robot aprenda de una primera experiencia.
#include <TCS3200.h> // CS ( S2, S3, OUT, S0, S1, LED ) TCS3200 CS(8,9,10,11,12,13); void setup() { Serial.begin(9600); CS.begin(); CS.nSamples(40); CS.setRefreshTime(200); CS.setFrequency(TCS3200_FREQ_HI); CS.calibration(0); } void loop() { CS.read( true ); }
Cuando realizamos el método de calibración, necesitaremos guardar en la memoria EEPROM los valores de estos colores. La memoria EEPROM es una memoria que permanece en nuestro robot aunque lo desconectemos, así que almacenaremos los valores de referencia dentro de él para que en los próximos programas solamente tengamos que cargar y hacerlo funcionar.
Realmente el proceso consta de dos calibraciones.
El primer método sirve para calibrar el blanco y el negro. Y el segundo sirve para calibrar la tabla de colores.
Este proceso lo podemos realizar a través del puerto serie, introduciendo la letra Y para “YES” o la letra N para “NO” en cada una de las muestras leidas por el sensor.
Nuestro objetivo primero es obtener una referencia con respecto al blanco y el negro y estos primeros valores serán la referencia que se obtendra que dependerá de la distancia del sensor a la superficie de color.
Esto quiere decir, que si nuestro robot tiene un sensor mal ajustado y la distancia varia o se queda torcido con respecto al plano, estos valores cambiarán y podrán dar error. Entonces habrá que recalibrar.
Una vez hecho este paso, procederemos a calibrar los colores.
Como existe una amplia gama de colores, vamos a simplificar a una tabla de 8 colores que pueden ser facilmente identificables y que están integrados dentro de la programación de este sensor. Esto no quiere decir que no podamos reconocer más de 8, pero para nuestro objetivo y para obtener una respuesta fiable en un modelo de juego, utilizaremos estos 8 colores que se corresponden a un número con la siguiente lista ordenada.
- WHITE
- BLACK
- YELLOW
- ORANGE
- RED
- GREEN
- BLUE
- BROWN
Después de la calibración de blanco y negro; este método pregunta seguidamente si queremos calibrar los colores o cargar los valores almacenados en la EEPROM. *Si apretamos otra tecla distinta de Y o N cargará unos valores RGB estándar para reconocer los colores, pero no aseguramos que sean los correctos para una calibración inicial.
Hay que prestar atención a los colores negro y blanco; ya que al haber hecho la primera calibración de referencia con blanco y negro; las muestras para el blanco siempre han de salir 255, 255, 255 y para el negro siempre han de salir 0,0,0; pudiendo variar ligeramente. Si esto no se cumple, tendremos que recalibrar desde el principio.
Una vez hecho esto, nos podemos fijar en los valores obtenidos para el resto de colores. Estos valores no son exactos en el estándar de colores RGB, pero eso a nuestro robot le da igual. Solamente tiene que saber que el valor que tiene memorizado de rojo es similar a todos los rojos que se le pongan por delante.
*Podemos observar que el amarillo y el naranja varían muy poco uno del otro. Así que hay que elegir superficies facilmente diferenciables a estos colores. Por ello utilizamos un escalado máximo; como comenté en la lección anterior; estos números se mezclarían mucho para estos dos colores y nuestro robot se confundiría.
En este momento podremos leer los colores en el modelo RGB. Pero… aún no hemos terminado. Ahora que ya hemos calibrado y guardado esa tabla de valores de colores en su memoria; vamos a hacer funcionar estos colores sin necesidad de calibrar nuevamente.
#include <TCS3200.h> TCS3200 CS(8,9,10,11,12,13); void setup() { CS.begin(); CS.nSamples(40); CS.setRefreshTime(200); CS.setFrequency(TCS3200_FREQ_HI); Serial.begin(9600); CS.loadCal(0); } void loop() { CS.read( true ); Serial.println(CS._ct[ CS.checkColor( &CS._rgb) ].name); }
Para mejorar el código anterior, vamos a definir un paso adicional. Y es que puede ser un poco pesado que salgan todo el rato valores de color, además de que una vez que dejemos el robot moviéndose, solamente necesitaremos detectar el cambio de un estado de color a otro. Esto lo solucionaremos con un evento denominado onChangeColor().
#include <TCS3200.h> TCS3200 CS(8,9,10,11,12,13); void setup() { CS.begin(); CS.nSamples(40); CS.setRefreshTime(200); CS.setFrequency(TCS3200_FREQ_HI); Serial.begin(9600); CS.loadCal(0); } void loop() { if (CS.onChangeColor()) { Serial.println(CS._ct[ CS._lastColor ].name); } }
Podemos ver la salida por el monitor serie de la siguiente manera y con este último paso terminaremos este modo de programación con la librería TCS3200.
En la siguiente lección proseguiremos con la programación de dos sensores de color en una misma placa y así empezar a programar a Clumsee.