Identifique cores com o Sensor de Cor TCS3200 e Arduino

Identifique cores com o Sensor de Cor TCS3200 e Arduino

Utilize o sensor de cor TCS3200 e um led RGB para montar facilmente um sistema de reconhecimento de cores com Arduino.

Sensor de cor TCS3200

O sensor de cor TCS3200 (datasheet) utiliza o chip TCS3200 para detectar o nível de cor RGB (Red, Green e Blue, ou Vermelho, Verde e Azul) do objeto que for colocado em frente ao sensor.

O chip TCS3200 tem 64 fotodiodos: 16 com filtro para a cor vermelha, 16 para a verde, 16 para a azul e 16 sem filtro. Esses fotodiodos captam a intensidade da luz, filtrando as cores e gerando a informação correspondente no pino OUT, que vai enviar os dados para o microcontrolador.

O sensor de cor TCS3200

O sensor de cor TCS3200 tem duas fileiras de 5 pinos, onde encontramos os pinos de controle (S0, S1, S2, S3), saída (OUT), controle do Led (LED) e alimentação (VCC e GND). Os pinos Vcc e GND estão em duplicidade, e você pode usar qualquer um deles para alimentar o módulo.

Sensor TCS3200Os pinos S0 e S1 determinam a frequência de saída, e os pinos S2 e S3 determinam qual nível de cor será detectado no momento, segundo a tabela abaixo:

Tabela Sinais

O pino LED serve para ligar (nível 0 – LOW) ou desligar (nível 1 – HIGH), os leds brancos em volta do sensor.

Circuito Arduino e Sensor TCS3200

No nosso circuito, vamos utilizar um Arduino Uno, um sensor de cor TCS3200 e um led RGB difuso 5mm, que vai acender nas cores vermelho, verde ou azul conforme a cor do objeto que for colocado em frente ao sensor:

Circuito detector de cor

O led RGB é do tipo anodo comum, com o esquema de ligação abaixo:

LED RGB

Você pode fazer a ligação com 3 resistores, conforme a imagem acima, ou utilizar, para efeitos de testes, apenas um resistor no anodo (pino maior). No nosso circuito utilizamos apenas um resistor de 10K.

Programa sensor de cor TCS3200

A princípio o sensor de cor TCS3200 não usa nenhuma biblioteca específica, já que vamos acionar os pinos S0, S1, S2 e S3 pelos pinos digitais, e ler o valor da saída OUT também por um pino digital.

A cada ciclo do loop é efetuada uma leitura das cores, e os valores lidos são mostrados no serial monitor. Esses valores também são utilizados para determinar qual das três cores do led serão acesas.

//Programa: Sensor TCS3200 e led RGB
//Autor: FILIPEFLOP

//Pinos de conexao do modulo
const int s0 = 8;
const int s1 = 9;
const int s2 = 12;
const int s3 = 11;
const int out = 10;

//Pinos do led RGB
int pinoledverm = 2;
int pinoledverd = 3;
int pinoledazul = 4;

//Variaveis 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()
{
  //Detecta a cor
  color();
  //Mostra valores no serial monitor
  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, LOW); //Acende o led vermelho
    digitalWrite(pinoledverd, HIGH);
    digitalWrite(pinoledazul, HIGH);
  }

  //Verifica se a cor azul foi detectada
  else if (blue < red && blue < green && blue < 1000)
  {
    Serial.println("Azul");
    digitalWrite(pinoledverm, HIGH);
    digitalWrite(pinoledverd, HIGH);
    digitalWrite(pinoledazul, LOW); //Acende o led azul
  }

  //Verifica se a cor verde foi detectada
  else if (green < red && green < blue)
  {
    Serial.println("Verde");
    digitalWrite(pinoledverm, HIGH);
    digitalWrite(pinoledverd, LOW); //Acende o led verde
    digitalWrite(pinoledazul, HIGH);
  }
  Serial.println();

  //Delay para apagar os leds e reiniciar o processo
  delay(50);
  digitalWrite(pinoledverm, HIGH);
  digitalWrite(pinoledverd, HIGH);
  digitalWrite(pinoledazul, HIGH);
}

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

O programa lê as cores primárias (RGB), mas você pode configurar o programa para detectar outras cores. Nas imagens abaixo, temos o sensor detectando a cor azul….

Detectando cor azul

e também a verde….

Detectando cor verde

Gostou ? Ajude-nos a melhorar o blog atribuindo uma nota a este tutorial (estrelas no final do artigo), comente e visite nossa loja FILIPEFLOP!

1
Identifique cores com o Sensor de Cor TCS3200 e Arduino
29 votos, 4.66 classificação média (93% pontuação)

Formado em Ciência da Computação pela Universidade de Mogi das Cruzes, atualmente responsável pelo departamento técnico da FILIPEFLOP.

Compartilhe este Post

18 Comentários

  1. victor - 13 de junho de 2017

    É preciso configurar o timer pra pegar o pulso da frequencia no caso de utilizar o pic?sou novo na eletronica e gostaria de tirrar essa dúvida.

  2. vinicius matias diniz - 20 de abril de 2017

    Amigos, vocês conhecem algum tutorial ensinando como desenvolver um calibrador para monitores? sei que alguns modelos utilizam o TCS3200 da keystudio, mas não encontrei nada a respeito

  3. Vitor Bueno - 2 de abril de 2017

    Olá comprei o sensor tcs3200 um lcd12x2 e um i2C, realizei o esquema acima indicado e deu tudo certo, mas gostaria de saber como posso informar a cor em texto no LCD, gostaria também se fosse informado outra cor ele escrever no LCD é possível ?

  4. luiz felipe - 6 de outubro de 2016

    bom dia. eu comprei um sensor tcs 3200 e utilizei a sua programação para testa o mesmo, porem ele não esta identificando as cores ele ate acende os ledes do sensor mas não identifica as cores. eu queria saber se vc tem ideia do que pode ser???

  5. Roberto - 29 de setembro de 2016

    Gostaria de saber se pode ser feito a ligação direto no clp da delta.
    No aguardo.
    Obrigado.

  6. Rodrigo Zilli - 20 de setembro de 2016

    Olá…

    Como faço pra detectar as cores preto e branco?
    É possível utilizar esse sensor, ou pode ser o óptico reflexivo?

  7. Mateus Figueiedo - 27 de agosto de 2016

    como eu posso identificar a cor prata???

  8. henrique - 31 de julho de 2016

    Olá, como vocês desenham esses esquemáticos? É pelo fritzing? Que bilbiotecas são essas?

  9. Matheus - 30 de julho de 2016

    Olá, montei o sensor de cor tcs3200 da mesma maneira que está no post, entretanto, o sensor mesmo sem encostar nenhum objeto sobre ele, ele fica retornando valores R, G, B no serial monitor muito rápido, mesmo sem eu clocar um objeto sobre o sensor. Por que será que isto está ocorrendo?

  10. Tatiane - 23 de julho de 2016

    Olá! Tenho uma dúvida referente ao módulo TCS230 sensor de cor, usei o programa abaixo para fazer a leitura RBG, porém notei para mesma cor houve uma variação extrema, exemplo: objeto azul primeira medição (43,43,43 ) segunda medição (103; 56; 155); terceira medição com mesmo objeto (205;155;33) e por nas medições seguintes variando, em algumas vez o valor se manteve por 3 medições até alterar novamente. Basicamente a unica cor que não variou foi a branca que se manteve (255;255;255);
    Gostaria de saber o que posso estar fazendo para diminuir esta variação e identificar corretamente as cores, ou se módulo esta apresentando falhas e este seria uma forma de sinal que a identificação da cor não está sendo reconhecida; ou se até mesmo seja algum procedimento de setup que deveria ter feito no primeiro uso.
    Segue abaixo o programa:

    #include
    #include

    // Pinos

    #define S0_OUT 8
    #define S1_OUT 9
    #define S2_OUT 12
    #define S3_OUT 13
    #define OE_OUT 2

    MD_TCS230 CS(S2_OUT, S3_OUT,S1_OUT, S0_OUT, OE_OUT);

    colorData rgb;

    void setup()
    {
    Serial.begin(57600);
    CS.begin();
    }

    int readSensor(int i)
    {
    static bool waiting;
    if (!waiting)
    {
    CS.read();
    waiting = true;
    }
    else
    {
    if (CS.available())
    {
    CS.getRGB(&rgb);
    waiting = false;
    }
    }
    return rgb.value[i];
    }

    void loop()
    {
    Serial.print(readSensor(TCS230_RGB_R));
    Serial.print(“;”);
    Serial.print(readSensor(TCS230_RGB_G));
    Serial.print(“;”);
    Serial.println(readSensor(TCS230_RGB_B));
    delay(1000);
    }

  11. Fabio Vasconcelos - 21 de junho de 2016

    Prezado Adilson,
    Sou estudante de Engenharia Mecatrônica vou iniciar o 2o. período. Como faço pra programar para identificar qualquer cor e suas nuances? Da pra você me enviar a programação pra que o microcontrolador faça dessa forma.

  12. Vinicius Gonçalves - 20 de junho de 2016

    tem como ligar ele num clp siemens em vez de arduíno?

  13. Gleise - 23 de maio de 2016

    Alguém sabe me dizer se o pino do LED deve ser ligado diretamente ou necessita de um resistor? Coloquei um resistor, mas acho que o LED perdeu um pouco a intensidade, mas tenho receio de ligar diretamente e queimar.

  14. Guilherme - 6 de maio de 2016

    Olá, tenho uma dúvida, como imprime os valores em RGB? Porque os valores que aparecem não é em RGB eu acho…

  15. Salomão Luiz - 3 de maio de 2016

    Existe a possibilidade de ao invés de enviar o comando para acender um LED RBG, enviar a um alto falante programado com certos áudios para certas cores.

Deixe uma resposta