Medir el color con Arduino y el colorímetro TCS3200


arduino-sensor-color-tcs3200

¿Qué es un sensor de color TCS3200?

EL TCS3200 es un sensor óptico que permite detectar el color de un objeto ubicado en frente de él. Podemos conectarlo este sensor con facilidad a un autómata o procesador como Arduino.

Internamente, el TCS3200 está formado por una matriz de fotodiodos de silicona junto con un conversor de frecuencia, en un único integrado CMOS.

La matriz dispone de 8 x 8 fotodiodos de 110 µm, de los cuales 16 tienen filtros azules, 16 verdes, 6 rojos, y 16 no tienen filtro. Los fotodiodos están distribuidos de forma que minimizan el efecto la incidencia no uniforme de la luz.

La salida del TCS3200 es una onda cuadrada del 50% duty, cuya frecuencia es proporcional a la intensidad luminosa. La tensión de alimentación del sensor es de 2.7V a 5.5V.

Anuncio:

arduino-sensor-color-tcs3200-funcionamiento

Frecuentemente el TCS3200 se distribuye en módulos que incorporan dos o cuatro LED de luz blanca y un protector de plástico. El objetivo de ambas medidas es minimizar los efectos de la iluminación ambiente en la medición.

Pese a sus especificaciones y elementos para eliminar la luz ambiente, el TCS3200 no es capaz de medir de forma precisa el color RGB de un objeto, o la temperatura de color de una fuente luminosa.

Sin embargo, podemos emplearlo para distinguir entre colores básicos. Por ejemplo, podemos emplearlo para reconocer el color de una tarjeta o un objeto, y guiar a un robot en un recorrido.

Si buscas un sensor de color deberías mirar el TCS34725, un sensor RGB más moderno y avanzado que el TCS3200. Más información en esta entrada.

Precio

El TCS3200 es un sensor medianamente barato. Podemos encontrar módulos sin el protector de plástico por 1.80€ y por unos 3€ con el protector, buscando en vendedores internacionales de eBay o AliExpress.

arduino-sensor-color-tcs3200-componente

Esquema de montaje

El TCS3200 tiene cuatro entradas digitales S0, S1, S2, y S3, y una salida digital Out. Para conectarlo a Arduino necesitaremos emplear al menos 3 pines digitales.

En primer lugar debemos alimentar el módulo conectando los pines Gnd y Vcc del TCS3200, respectivamente, a Gnd y Vcc de Arduino.

Los pines S0 y S1 controlan la frecuencia de la salida y la desactivación del módulo. Los conectamos a dos salidas digitales, o podemos conectarlas a 5V si no queremos poder apagar el módulo.

Power down2%20%100%
s0LLHH
s1LHLH

Por otra parte, los pines S2 y S3 seleccionan el color a medir. Deberemos conectarlos a dos salidas digitales de Arduino.

RedBlueClearGreen
s2LLHH
s3LHLH

Finalmente, conectamos la salida del sensor Out a una entrada digital de Arduino por lo que la conexión empleando los pines, sería la siguiente.

arduino-sensor-color-tcs3200-montaje

Mientras que la conexión, vista desde Arduino, sería la siguiente.

arduino-sensor-color-tcs3200-conexion

Ejemplos de código

En el siguiente ejemplo realizamos la lectura del TCS3200. Para ello empleamos la función PulseIn para determinar la duración del pulso recibido por el sensor.

Realizamos el proceso para cada color, y empleamos los valores obtenidos para clasificarlo como rojo, azul o verde.

//VCC——5V	
//GND——GND
//S0——D3	
//S1——D4
//S2——D5	
//S3——D6
//OUT——D2

const int s0 = 8;
const int s1 = 9;
const int s2 = 12;
const int s3 = 11;
const int out = 10;

byte countRed = 0;
byte countGreen = 0;
byte countBlue = 0;

void setup() {
	Serial.begin(9600);
	pinMode(s0, OUTPUT);
	pinMode(s1, OUTPUT);
	pinMode(s2, OUTPUT);
	pinMode(s3, OUTPUT);
	pinMode(out, INPUT);
	digitalWrite(s0, HIGH);
	digitalWrite(s1, HIGH);
}

void loop() {
	getColor();
	Serial.print("Red: ");
	Serial.print(countRed, DEC);
	Serial.print("Green: ");
	Serial.print(countGreen, DEC);
	Serial.print("Blue: ");
	Serial.print(countBlue, DEC);

	if (countRed < countBlue && countGreen > 100 && countRed < 80)
	{
		Serial.println(" - Red");
	}
	else if (countBlue < countRed && countBlue < countGreen)
	{
		Serial.println(" - Blue");
	}
	else if (countGreen < countRed && countGreen < countBlue)
	{
		Serial.println(" - Green");
	}
	else {
		Serial.println("-");
	}
	delay(300);
}

void getColor()
{
	digitalWrite(s2, LOW);
	digitalWrite(s3, LOW);
	countRed = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
	digitalWrite(s3, HIGH);
	countBlue = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
	digitalWrite(s2, HIGH);
	countGreen = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
}
Si te ha gustado esta entrada y quieres leer más sobre Arduino puedes consultar la sección Tutoriales de Arduino

Descarga el código

Todo el código de esta entrada está disponible para su descarga en Github.



4.5 8 votes
Article Rating

Anuncio:

Previous Detector de metales con Arduino y sensor inductivo
Next Medir cantidad de luxes con Arduino y el luxómetro BH1750
11 Comments
oldest
newest
Inline Feedbacks
View all comments
Javi
4 years ago

Hola Luis,
¿Tienes experiencia con otros sensores de color como el TCS3414CS, el TCS3472 o el TCS34725 con conexión I2C, y sobre la calibración de los mismos?
Un saludo
Javier

Carlos
4 years ago

Buenas
Tengo una duda,
Si quisiera hacer una barrera de deteccion, poniendo varios de estos detectores en fila…cuantos tendría que poner por centimetro???
O lo que es lo mismo que espacio puede detectar cada uno de estos dispositivos???

Un saludo.

Gonzalo
4 years ago

Que condición deberia poner para que detecte el amarillo amigo? gracias.

Eduardo Santiago
4 years ago

avrdude: stk500_recv(): programmer is not responding<– Tengo este error, me podrías mandar un esquema conectado a arduino UNO??

andy
4 years ago

buenas, como podría detectar el color negro?

Fran
3 years ago

Hola Luis,

en primer lugar gracias por toda la ayuda que nos das a la gente que estamos aprendiendo arduino. Quería ver si me podías explicar como funciona exactamente esta linea de código:

countRed = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);

Se que hace el pulseIn pero no entiendo los parametros.

Muchas gracias y un saludo.

alexadndro
3 years ago
Reply to  Fran

Hola Fran,

Por lo que se, el signo de pregunta es como una condición reducida, seria lo mismo decir:

if (digitalRead(out) ==HIGH){
countRed = pulseIn(out,LOW);
}else{
countRed = pulseIn(out,HIGH);
}

Espero haberte ayudado
Saludos

Enric Trill Masquef
3 years ago

Hola Sr. Llamas,

Me he iniciado en Arduino, intento poner en funcionamiento un sensor TSC3200, dispongo de un Arduino Mega, para probar he copiado su código y conexionado a los pins que propone, y no consigo que funcione, los cuatro leds se encienden pero todas las lecturas son “Red: 0Green: 0Blue: 0-“, le agradecería su ayuda.

También le agradecería un comentario sobre el funcionamiento de la sentencia void getColor(), que me parece que es un grupo de sentencias que son llamadas por getColor (); dentro del grupo void loop().

Muy agradecido por su dedicación.

Saludos,