Medir valores RGB con Arduino y sensor de color TCS34725


¿Qué es un TCS34725?

El TCS34725 es un sensor de color digital que podemos emplear con un procesador como Arduino para obtener los medir los valores RGB del color de un objeto o luz.

El TCS34725 es un integrado completo que realiza un tratamiento digital de la medición de color, proporcionando los valores RGB y Clear (medición total sin filtrar). La comunicación con el sensor se realiza por I2C por lo que su lectura desde un procesador como Arduino es muy sencilla.

Incorpora un filtro de infrarrojos, lo que mejora su precisión ante el ruido del entorno. El tiempo de medición y la ganancia es ajustable por software. Dispone de una amplia sensibilidad y un amplio rango dinámico de 3.800.000:1, pudiendo funcionar incluso tras un cristal oscuro.

Podemos encontrarlo en módulos comerciales que incorporan un LED de luz neutra (4150°K) junto con un MOSFET integrado para su control, por lo que podemos controlar el encendido del LED desde el código.

Anuncio:

Además de la comunicación I2C, el TCS34725 incorpora un pin de interrupción junto con un umbral inferior y superior. Cuando el nivel de luz está fuera del rango de los umbrales, el TCS34725 genera una interrupción que permanece activa hasta que es reseteada por el controlador.

A diferencia de otros sensores de color como el popular TCS3200, que únicamente son capaces de detectar colores básicos, el TCS34725 es capaz de proporcionar una medición RGB relativamente precisa del color medido.

Por supuesto, como cualquier sensor el TCS34725 no es perfecto y tiene desviaciones típicas de cualquier sensor, por lo que no obtendréis una medida totalmente precisa. En general, es necesario calibrar el color.

El TCS34725 es un sensor relativamente moderno y uno de los mejor sensor de color disponibles en el sector doméstico (geek/maker).

Precio

Los TCS34725 son sensores baratos. Podemos encontrar módulos con el TCS34725 por unos 2,70€ en vendedores internacionales de eBay y AliExpress.

¿Cómo funciona un TCS34725?

El TCS34725 es un sensor óptico que incorpora una matriz de 3×4 fotodiodos, junto con 4 conversores analógico digital de 16bits (ADC) que realizan la medición de los fotodiodos.

La matriz de3x4 está formada por fotodiodos filtrados para rojo, verde, azul, y sin filtro (clear). Todos los sensores están filtrados para infrarrojos.

Los conversores ADC integran la medición de los fotodiodos, que es transferida a los registros internos del TCS347, que incorporan doble buffer para asegurar la integridad de os datos.

El estado del sensor y el estado de energía del sensor está controlado por una máquina de estados interna, que controla todas las funciones del TCS34725.

Esquema de montaje

La conexión de los módulos que integran el TCS34725 es sencilla, ya que la comunicación se realiza a través de I2C. La tensión de alimentación del TCS34725 es de 3.3V, pero normalmente los módulos comerciales integran una salida Vin que permite alimentar a 5V.

Por tanto, simplemente alimentamos el módulo desde Arduino mediante GND y Vin y conectamos el pin SDA y SCL de Arduino con los pines correspondientes del sensor.

El pin LED controla el encendido del LED de luz neutra integrado en el módulo. La conexión de este pin puede ser la siguiente:

  • Dejar sin conectar para mantenerlo encendido continuamente.
  • Conectar a GND para apagar continuamente.
  • Conectar a un pin digital, para controlar su encendido con digitalWrite().
  • Conectarlo al pin INT y controlar el encendido con setInterrupt() de la librería.

Vista desde Arduino, la conexión sería la siguiente,

Ejemplos de código

Para realizar la lectura del sensor TCS34725 usaremos la librería desarrollada por Adafruit, disponible en este enlace. La librería incorpora varios ejemplos de uso que conviene revisar

A continuación vamos a ver algunos ejemplos de uso del sensor TCS34725

Leer valores RGB

En este primer ejemplo, muy sencillo, leemos los valores del sensor y los mostramos por puerto serie para su visualización.

Clasificar colores

En el segundo ejemplo, vamos a leer los valores RGB e intentar determinar el color que estamos leyendo. Para que sea más sencillo convertimos los valores RGB a HSV con la librería ColorConverter.

Para determinar el color empleamos el Hue del color medido. Para un ajuste fino será necesario calibrar el sensor ensayando colores y ajustando los valores de los condicionales.

Clonar color en tira WS2812b

En el último ejemplo, vamos a usar una tira Led RGB WS2812b para “clonar” el color que leemos en el sensor de color.

El ejemplo es muy simple, por un lado leemos el color con el TCS34725. Por otro, usamos la librería Fastled para hacer un efecto estela en la tira WS2812b. La tabla de conversión gamma adapta los colores leídos a la percepción de color que tiene el ojo humano.

Este es el resultado

Si te ha gustado esta entrada y quieres leer más sobre Arduino puedes consultar la sección
Tutoriales de Arduino

Anuncio:

Previous Instalar sistema operativo en Raspberry Pi con Noobs
Next Como instalar un servidor Web con XAMPP

¡Deja un comentario!...

1000
newest oldest

Hola Luis.

Muy interesante este sensor, y sobre todo, el vídeo “clonando” los colores leídos en una tira RGB.

Muchos saludos.

Hola Luis, muy buena la información. ¿es posible obtener una imagen gráfica como la que muestras de respuesta del color a diferentes logitudes de onda?

Hola Luis. Veo que se puede cambiar el tiempo de integración y la ganancia del sensor , ¿cuál es el interés de cambiar estos parámetros , principalemente el tiempo de integración?

Hola, de mucha ayuda la información. Sabes cómo puedo incluir en el codigo para clasificación de colores, el blanco y negro?

En el ejemplo segundo escribes las siguientes lineas de código: tcs.setInterrupt(false); delay(60); // Cuesta 50ms capturar el color tcs.getRawData(&red, &green, &blue, &clear); tcs.setInterrupt(true); la primera linea , tcs.setInterrupt(false); , enciende el LED y después haces esperar al procesador 60ms , en ese tiempo el procesador no haría nada, supongo que el sensor al activar la interrupción empezará a medir . Mi duda surge cuando vas a la librería y vas al método getRawData, después de almacenar los valores en las variables correspondientes hace un delay ¿por qué?

Hola Luis, se pueden leer los impulsos de luz de los contadores electricos con este sensor? O hay otro mas adecuado? Gracias