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!