El sensor RGB que pensamos usar (TCS34725) no detecta el color cuando se le apunta con la luz del láser directamente. En estos casos se satura y los colores que devuelve son blanco o casi blanco, con las tres componentes al máximo. Este sensor no está preparado para recibir luz directa sino para ver una superficie de un color. El LED interno es para iluminar los objetos y verlos mejor.
La solución que pensamos es añadir un adaptador para que la luz no incida directamente sobre él y pueda verse reflejada.
De esta forma, creamos en OpenSCAD un adaptador de prueba para recibir la luz en ángulo recto, consistente en un tubo y un cilindro cortado a 45º.
Imprimimos estas piezas y nos quedan así:
La superficie del cilindro a 45º debería ser blanca, para no alterar el color de la luz detectada. Además debería ser lo más satinada posible para no reflejar la luz. Probamos con varios tipos de papel pero no parecen adecuados. Al final lo que mejor resultado da es pintarla con corrector ‘tipex’:
Y el conjunto construido , usando unos tornillos y tuercas M2.5:
Ahora vamos a probar el sensor, a ver si nos da un resultado satisfactorio. Lo conectamos a un Arduino UNO y desactivamos el LED interno, para no falsear la medida.
Preparamos el montaje, que nos queda de la siguiente manera:
Y el código que usamos es muy similar al del ejemplo que viene con la librería:
#include <Wire.h>
#include "Adafruit_TCS34725.h"
/* Example code for the Adafruit TCS34725 breakout library */
/* Connect SCL to analog 5
Connect SDA to analog 4
Connect VDD to 3.3V DC
Connect GROUND to common ground */
/* Initialise with default values (int time = 2.4ms, gain = 1x) */
// Adafruit_TCS34725 tcs = Adafruit_TCS34725();
/* Initialise with specific int time and gain values */
Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_700MS, TCS34725_GAIN_1X);
void setup(void) {
Serial.begin(9600);
if (tcs.begin()) {
Serial.println("Found sensor");
} else {
Serial.println("No TCS34725 found ... check your connections");
while (1);
}
}
void loop(void) {
uint16_t r, g, b, c, colorTemp, lux;
tcs.getRawData(&r, &g, &b, &c);
colorTemp = tcs.calculateColorTemperature_dn40(r, g, b, c);
lux = tcs.calculateLux(r, g, b);
Serial.print("Color Temp: "); Serial.print(colorTemp, DEC); Serial.print(" K - ");
Serial.print("Lux: "); Serial.print(lux, DEC); Serial.print(" - ");
Serial.print("R: "); Serial.print(r, DEC); Serial.print(" ");
Serial.print("G: "); Serial.print(g, DEC); Serial.print(" ");
Serial.print("B: "); Serial.print(b, DEC); Serial.print(" ");
Serial.print("C: "); Serial.print(c, DEC); Serial.print(" ");
Serial.println(" ");
if ((r>5000)&&(r>g)&&(r>b))
Serial.println("rojo");
if ((g>5000)&&(g>r)&&(g>b))
Serial.println("verde");
if ((b>5000)&&(b>r)&&(b>g))
Serial.println("azul");
}
Probamos con los laser de los tres colores y el resultado es satisfactorio. Los tres producen valores de su componente muy alta sin subir mucho las componentes de los otros colores.
Deja una respuesta