medir-color-arduino-colorimetro-tcs3200

Medir el color con Arduino y el colorímetro 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.

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.

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);
}

Descarga el código

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