Identifique cores com o Sensor de Cor TCS3200 e Arduino 58

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? Deixe seu comentário logo abaixo.

Faça seu comentário

Acesse sua conta e participe

58 Comentários

  1. Tem como integrar esse circuito no circuito da maquina separadora de mm?

    1. Olá Enzo,

      É possível sim.

      Temos este post aqui explicando um pouco da lógica para juntar dois projetos em um:
      https://www.filipeflop.com/blog/como-juntar-dois-projetos-em-arduino/

      Abraços!
      Vinícius – Equipe FilipeFlop

  2. consigo detectar as cores estando elas em um monitor de LCD e: uma barra de cor Azul de 5mm seria detectada na tela do computador para uma ação especifica acionada pela saída na lógica?

  3. Não encontro o sensor TCS no Fritzing, qual o sensor usado na sua demonstração?

    1. Olá Laura,

      O sensor está disponível para download e inclusão no fritzing neste link: https://github.com/e-radionicacom/e-radionica.com-Fritzing-Library-parts-/blob/master/TCS230%20Color%20Sensor.fzpz

      Abraço!
      Vinícius – Equipe FilipeFlop

  4. Boa tarde, não consigo encontrar esse sensor de cor no tinkercad. Tem algum jeito de adicionar esse componente lá ou até mesmo criá-lo?

    1. Olá,

      Até onde eu sei esse layout foi feito no Fritzing.

      Pelo que pesquisei não é possível adicionar ou criar componentes no tinkercad

      Abraço!
      Vinícius – Equipe FilipeFlop

  5. Boa tarde Adilson, olha amigo estou com um problema na contagem de pacote de gelo na saída da minha esteira porque á embalagem é de cores, branco vermelho verde azul e eu quero só detectar a cor preto ou seja preta, mim der uma solução.

    1. Olá Origenes,

      Acredito que poderias utilizar o valor das cores para fazer essa detecção, pois o preto seria a ausência das três cores, nenhuma das três estariam presentes na leitura.

      Abraço!
      Vinícius – Equipe FilipeFlop

  6. Muito bom!
    Uma dúvida, ele é capaz de formar cores diferentes como roxo, amarelo entre outras sem ser apenas, verde, azul e vermelho?
    Obrigado!

    1. Olá Marcio!

      Tanto o sensor é capaz de identificar cores diferentes quando o LED é capaz de formar cores variadas.

      Abraço!
      Rosana – Equipe FilipeFlop

  7. Dae amigo,

    estou buscando uma forma de conseguir saber a cor da agua dentro daques potes de testes de parâmetros para aquario, seja de ph, amonia, nitrito, etc.

    A ideia é suprir uma deficiência ocular minha na detectação de cores (daltonismo) e usar a tecnologia para isso.

    Pensei em usar o arduino e aqueles sensores de cores, todavia não sei se são eficiente para a cor em fluídos ou semente em objetos sólidos.

  8. Tentei recriar o circuito, mas por algum motivo o LED de forma alguma exibe a cor vermelha, e não consegue identificar com facilidade as outras duas cores, mas aleatoriamente fica alternando entre verde e azul… o que percebi é que quando mexo ou no LED ou no sensor, as cores do LED parecem ser afetadas, mas nunca para o vermelho… não sei se o problema está no código ou no sensor, já tentei por vezes descobrir o problema mas n consigo

  9. oi julia

  10. oque significa essa linha? >> red = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);

  11. Boa noite
    Queria fazer um projeto de iluminação e gostaria de saber se é possível fazer a leitura de algumas cores da tv e assim fazer com que uma fita de 3 mts de led fica se da mesma cor ?

    1. Leonardo,

      A única forma de fazer algo assim é se a cor na TV seja sólida (como por exemplo você ter na tela uma imagem toda vermelha), e muito provavelmente não vai ter uma precisão muito boa devido a natureza dessas cores (que serão LEDs). No geral, é um projeto meio impraticável, mas talvez não impossível.

      Abraços!
      Diogo – Equipe FilipeFlop

  12. Boa noite, esse sensor consegue identificar a cor de uma linha escrita por um lápis?

    1. Matheus,

      Acredito que seja fina demais para ser detectado. Talvez se a linha for mais grossa que o comum ele detecte facilmente.

      Abraços!
      Diogo – Equipe FilipeFlop

  13. abaixe a resistência e o led brilhará mais intensamente

  14. fiz isso e não funcionou no meu do mesmo jeito que está ai

    1. Guina,

      Aconteceu algum erro? Teve algum problema em específico?

      Abraços!
      Diogo – Equipe FilipeFlop

  15. Por favor preciso saber se este sensor conseguiria detectar cor preta e cor prata por exemplo e se tem resposta rápida como numa esteira de produção.

    Obs: trabalho de TCC

    1. Olá Carlos!

      Conseguiria sim. Sobre a velocidade, não testamos isso aqui.

      Abraços!

      André – Equipe FilipeFlop

      1. por favor preciso conequitar servo motor com o sensor de cor

        1. Olá Luiz,

          Acho que esse post sobre servo motor pode te ajudar: https://www.filipeflop.com/blog/micro-servo-motor-9g-sg90-com-arduino-uno/

          Abraço!
          Rosana – Equipe FilipeFlop

  16. Estou usando a versão 1.6.12 e não funcionou corretamente. Testei com o Uno, Mini e Mega. Todos apresentaram o mesmo erro. Ora apresentam resultado geral 0 e ora a barra fica rolando rapidamente.

    1. Olá Mack!

      Você pode colocar esse problema com mais detalhes no nosso fórum? Era bom detalhar a montagem do circuito e o programa como está usando. A barra rola mas não aparece nada? Lá o pessoal pode te ajudar melhor nisso.

      https://www.filipeflop.com/forum/

      Abraços!

      André – Equipe FilipeFlop

  17. Olá, boa noite, estou tentando calibrar meu sensor de cor mas na Library do Arduino pede para ligar os pinos S2, S3 e OE. O sensor desse tutorial é o mesmo que o meu e não possui o pino OE.
    Como tentei calibrar usando o pino OUT ao invés do OE, agora o sensor perdeu a configuração e não reconhece mais nada. Vocês poderiam me ajudar em uma explicação de como calibrar esse sensor? Grato!!!

  18. qual é o alcance do sensor ?

  19. gostaria de sabe qual a distancia de alcance do sensor!

    1. Pelo que vi 10mm, muito pouco na minha opinião.

  20. Boa Tarde!
    Gostaria de Saber se é possível conectar dois sensores de cor ao mesmo tempo no Arduino. Tipo, aqui na escola estamos fazendo um robô seguidor de linha e ele precisa se orientar pela cor preta, virar quando ver cor verde, etc.
    É possível ligar dois sensores?
    Att
    fabricio

  21. Bom dia, poderia disponbilizar a biblioteca fritzing para esse sensor de cor?

    Att.

  22. Bom dia. Excelente matéria. Me tire uma dúvida: esse sensor detecta qualquer cor? Qual seria o código para detectar a cor amarela?

  23. É 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.

  24. 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

  25. 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 ?

  26. 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???

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

  28. Olá…

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

    1. Também queria saber, estou pendente disto para um trabalho de curso.

  29. como eu posso identificar a cor prata???

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

    1. Boa tarde Henrique,

      Sim, utilizamos o Fritzing. Alguns componentes não existem no Fritzing e inserimos posteriormente.

      Abraço.

      Adilson – Equipe FILIPEFLOP

  31. 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?

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

    1. Boa noite

      As luz ambiente era a mesma e o teste foi feito no mesmo local? A intensidade de luz no ambiente interfere, assim como a cor da luz ambiente.

  33. 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.

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

  35. 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.

    1. Bom dia Gleise,

      Usamos ele ligado diretamente, sem problemas.

      Abraço!

      Adilson – Equipe FILIPEFLOP

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

  37. 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.

    1. E gostaria de saber tambem e qual seria o codigo se puder me explicar agradeço.

    2. Gostaria de saber tbm, se possivel o quanto antes

      1. Olá,

        É possível fazer isso sim. No entanto, não temos nenhum código como exemplo.

        Abraço!
        Rosana – Equipe FilipeFlop

Trackbacks and Pingbacks

  1. […] sensor de cor usado é o TCS3200, ele é um chip que possui vários fotodiodos que filtram a luz refletida por objetos colocados em […]