Neste post vamos mostrar como utilizar o Arduino para montar um sistema de reconhecimento de cores usando o sensor de cor TCS230 / TCS3200.

Esse módulo usa o sensor TCS230 (datasheet), que é composto por 64 fotodiodos. Desses 64 fotodiodos, 16 tem filtros para a cor vermelha, 16 para a cor verde, 16 para a cor azul e 16 não tem filtro.
Distribuídos uniformemente sobre o sensor, esses sensores captam a luminosidade, filtrando as cores, e geram na saída um sinal de onda quadrada com as informações sobre a intensidade das cores vermelho (R = Red), verde (G = Green) e Azul (B = Blue).
Como no módulo mostrado acima, o sensor TCS230 geralmente vem montado em conjunto com quatro leds brancos para iluminação, e oito pinos para conexão.
Conexão do sensor de cor TCS230 no Arduino
O módulo aceita alimentação de 3 à 5 volts e são utilizados 5 pinos para conexão ao Arduino: os pinos de controle S0, S1, S2, S3, e o pino OUT, que é o responsável pelo envio das informações.
O pino OE (Output Enable, ou saída habilitada/ativada) deve ser ligado ao GND, já que o módulo vai enviar informações continuamente ao Arduino.
No circuito adicionei 3 leds nas cores correspondentes, para que acendam quando determinada cor for reconhecida pelo sensor. Apesar de trabalhar nesse experimento apenas com as 3 cores primárias, nada impede que outras combinações sejam usadas no programa, de acordo com os níveis do sinal RGB.
No programa, os pinos S0 e S1 são colocados em nível alto e então são alternados os estados dos pinos S2 e S3, que determinam qual fotodiodo será ativado. Veja na tabela abaixo as combinações que determinam o tipo de frequência de saída e também o padrão de ativação dos fotodiodos:
// Programa : Detector de cores usando modulo TCS230
// Alteracoes e comentarios : Arduino e Cia
//
// Baseado no programa original de Martin Mason
//Pinos de conexao do modulo TCS230
const int s0 = 8;
const int s1 = 9;
const int s2 = 12;
const int s3 = 11;
const int out = 10;
//Pinos dos leds
int pinoledverm = 2;
int pinoledverd = 3;
int pinoledazul = 4;
//Variaveis que armazenam o valor das cores
int red = 0;
int green = 0;
int blue = 0;
void setup()
{
pinMode(s0, OUTPUT);
pinMode(s1, OUTPUT);
pinMode(s2, OUTPUT);
pinMode(s3, OUTPUT);
pinMode(out, INPUT);
pinMode(pinoledverm, OUTPUT);
pinMode(pinoledverd, OUTPUT);
pinMode(pinoledazul, OUTPUT);
Serial.begin(9600);
digitalWrite(s0, HIGH);
digitalWrite(s1, LOW);
}
void loop()
{
color(); //Chama a rotina que le as cores
//Mostra no serial monitor os valores detectados
Serial.print("Vermelho :");
Serial.print(red, DEC);
Serial.print(" Verde : ");
Serial.print(green, DEC);
Serial.print(" Azul : ");
Serial.print(blue, DEC);
Serial.println();
//Verifica se a cor vermelha foi detectada
if (red < blue && red < green && red < 100)
{
Serial.println("Vermelho");
digitalWrite(pinoledverm, HIGH); //Acende o led vermelho
digitalWrite(pinoledverd, LOW);
digitalWrite(pinoledazul, LOW);
}
//Verifica se a cor azul foi detectada
else if (blue < red && blue < green)
{
Serial.println("Azul");
digitalWrite(pinoledverm, LOW);
digitalWrite(pinoledverd, LOW);
digitalWrite(pinoledazul, HIGH); //Acende o led azul
}
//Verifica se a cor verde foi detectada
else if (green < red && green < blue)
{
Serial.println("Verde");
digitalWrite(pinoledverm, LOW);
digitalWrite(pinoledverd, HIGH); //Acende o led verde
digitalWrite(pinoledazul, LOW);
}
Serial.println();
//Aguarda 2 segundos, apaga os leds e reinicia o processo
delay(2000);
digitalWrite(pinoledverm, LOW);
digitalWrite(pinoledverd, LOW);
digitalWrite(pinoledazul, LOW);
}
void color()
{
//Rotina que le o valor das cores
digitalWrite(s2, LOW);
digitalWrite(s3, LOW);
//count OUT, pRed, RED
red = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
digitalWrite(s3, HIGH);
//count OUT, pBLUE, BLUE
blue = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
digitalWrite(s2, HIGH);
//count OUT, pGreen, GREEN
green = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
}
Carregue o programa e aproxime objetos de diferentes cores ao sensor e o led correspondente irá acender. Também é gerada uma saída como essa no serial monitor, onde você pode ver exatamente os níveis de sinal das cores detectadas:
Abaixo você confere o vídeo do projeto em funcionamento:
Gostou? Confira outros posts com sensores aqui mesmo no Arduino e Cia!