Componentes Eletronicos

Sensor de Cor TCS230 com Arduino

Eletrogate 10 de julho de 201713 min

Introdução

Esteiras e correias transportadoras são utilizadas largamente na indústria e na automação de processos. A identificação e contagem de objetos que circulam por essas esteiras são aplicações de automação muito importantes na indústria atual. Para realizar essa tarefa vários sensores são utilizados e também diferentes tipos de circuitos microcontrolados e CLP’s podem ser programados para controlar e fazer a interface com o sensor.

Neste post vamos conhecer um tipo de sensor importante para identificação e contagem de objetos, o Sensor de Cor TCS230, e vamos desenvolver uma aplicação com Arduino na qual esse sensor vai ser empregado para contar objetos coloridos que são transportados por uma esteira rolante portátil.

A primeira seção do artigo apresenta o sensor TCS230, seu princípio de funcionamento e aplicações, bem como a esteira transportadora utilizada na prototipagem. Na segunda seção vamos aprender a utilizar o sensor em si. Vamos montar todo o hardware e circuito, desenvolver o firmware para embarcar no Arduino, testar e colocar para funcionar!


Sensores de Cor e suas Aplicações

Esteiras e correias transportadoras são praticamente a espinha dorsal de uma linha de montagem. É em torno delas e dos objetos transportados por elas que os funcionários e robôs de uma linha de produção executam as suas tarefas. Recentemente alguns modelos de correias e esteiras transportadoras portáteis foram desenvolvidas para serem usadas em bancadas e em pequenos projetos de prototipagem eletrônica. Neste artigo vamos utilizar uma esteira transportadora portátil feita para ser usada com o Arduino. Por meio desse kit é possível prototipar e testar sistemas para controle de velocidade e direção da esteira e diversas processos automáticos de contagem e classificação.

A figura 1 mostra a esteira que utilizamos em nossa montagem: 

Figura 1: Esteira Portátil com sensor de Cores

O objetivo dessas esteiras é transportar materiais por uma certa distância e possibilitar que os trabalhadores e mecanismos de automação possam operar e realizar outros trabalhos sobre esses objetos. Também são utilizadas para separação, contagem, identificação e classificação de objetos, o que é feito utilizando-se diversos tipos de sensores, dentre eles, sensores de cor como o TCS230.


Princípio de Funcionamento

O sensor de cor TCS230 baseia-se em uma matriz 8×8 de fotodiodos combinados com um conversor corrente-frequência. Portanto, são 64 fotodiodos que constituem a célula principal do sensor. Desses 64, 16 possuem filtros para a luz verde, 16 para a vermelha, 16 para a luz azul e 16 não possuem filtro algum. Sob esse conjunto de fotodiodos incide a luz refletida pelos objetos posicionados ao alcance do sensor. Os fotodiodos geram uma corrente de saída de acordo com a intensidade da luz refletida e também de acordo com seus filtros.

Figura 2: Esquema lógico do sensor TCS320. Fonte: Datasheet

Essa corrente de saída é convertida em uma onda quadrada de 50% de duty cycle, isto é, uma onda em que metade do período está em nível alto e outra metade em nível baixo. A frequência dessa onda quadrada é diretamente proporcional à intensidade da luz refletida percebida pelos conjuntos de fotodiodos.

Cada bloco de 16 fotodiodos pode ser selecionado pelos pinos S2 e S3. Os pinos S0 e S1 permitem regular a escala de frequência e também desligar a saída. Veja a tabela abaixo, também retirada do datasheet do sensor:

Tabela 1: Tabela de seleção de filtros e escala de frequência. Fonte: Datasheet

Por meio da matriz de fotodiodos e os seus respectivos filtros, nós podemos facilmente identificar as cores primárias do padrão RGB (red, green, blue) lendo a frequência de saída para cada filtro de cor diferente e obter uma aproximação do código RGB do objeto (um código RGB é um valor entre 0 e 255 associado a uma cor). 


Aplicações

Mas para que alguém iria querer saber a cor dos objetos em uma esteira rolante ou em um protótipo? É uma pergunta que você pode estar se fazendo nesse exato momento. Para respondê-la, vamos te mostrar algumas aplicações corriqueiras de sensores de cor na indústria moderna. Veja!

  • Detecção de etiquetas mal colocadas;
  • Detecção de presença ou ausência de instruções;
  • Detecção de graxa em rolamentos de esfera e outros materiais;
  • Verificação de rótolus;
  • Verificar a presença ou ausência de impressões de tinta nos produtos da linha;
  • Detecção de junção em latas e outros produtos aerossóis;
  • O rótulo desses produtos devem estar impressos de forma correta. Com o sensor de cor é possível saber se a impressão deixou de cobrir alguma parte do produto ou não fechou completamente;

Além dessas aplicações comuns na indústria, os sensores de cor nos permitem desenvolver robôs e dispositivos que possam fazer escolhas de acordo com informações sobre cores também. Por exemplo, uma garra robótica que só deve agarrar objetos da cor vermelha (ou outra para a qual ele esteja programado) ou um carro ou robô que precise identificar placas e outras sinalizações que possuem variações de cor.


Projeto Esteira Transportadora com Sensor TCS230 para Contagem de Objetos por Cor

Agora sim! Vamos pôr a mão na massa. Nessa aplicação nós vamos empregar o sensor TCS230 para identificar e contar objetos de cores diferentes. O Objetivo de nosso protótipo é:

“Identificar objetos por cor usando o sensor de Cor TCS230 e um arduino integrados em uma esteira portátil. O circuito deve mostrar no terminal serial quantos objetos de  cada cor já passaram pela esteira. Além disso, vamos acender leds de cores diferentes para indicar que um objeto acabou de passar na esteira.”

Para fazermos essa aplicação, vamos utilizar a esteira portátil que apresentamos lá em cima. Vamos utilizar o Arduino UNO como placa de prototipagem.

Materiais necessários para o projeto com Sensor de Cor TCS230 e Arduino

cita_cart

Está tudo aí na mesa? Então vamos partir para a montagem e programação!


Aspectos de Hardware

As ligações entre o Arduino e o sensor foram feitas da seguinte forma:

Tabela 2: Ligação de Hardware entre Arduino UNO e o sensor TCS230

Para cada led foi utilizado um resistor de 220 ohms para limitar as respectivas correntes. As demais ligações com o sensor foram feitas diretamente. A fonte de alimentação utilizada para o motor DC que aciona a esteira transportadora não está conectada ao Vcc do Arduino e do sensor para evitar ruídos e interferências.


Aspectos de Software

Após montado o hardware, podemos nos preocupar com o firmware. Abaixo vamos entender cada parte do programa que faz a leitura das cores

Declaração de variáveis globais

Na figura 3 temos as variáveis globais de nosso programa. Definimos algumas variáveis para configurar os pinos digitais do arduino e algumas outras de controle. Os contadores, responsáveis por contar quantas vezes uma cor é identificada na esteira também foram declaradas.

const int s0 = 9;
const int s1 = 10;
const int s2 = 13;
const int s3 = 12;
const int out = 11;
int RedLed = 2;
int GreenLed = 4;
int BlueLed = 7;
int colorIsRed = 1;
int colorIsBlue = 2;
int colorIsGreen = 3;
int colorIsWhite = 3;

// Contador
int CountR;
int CountB;
int CountG;
int ultimaCor = 0;
int NoColor = 0;

// Variáveis que armazenam o valor das cores
int red = 0;
int green = 0;
int blue = 0;

// Variáveis usadas na calibração
int mediaR;
int mediaB;
int mediaG;

Função Void Setup()

Na figura 4, temos a função void Setup(). Aqui são feitas todas as inicializações do programa. As configurações feitas aqui são:

    • Configuramos os pinos de entrada e saída de acordo com a tabela 2.
    • Setamos a escala de frequência para 20%
    • Inicializamos a porta serial com um baund rate de 9600
  • Chamamos a função calibraSensor(), responsável por calibrar a leitura das cores azul, vermelho e verde para as condições ambientes.

Note a função calibraSensor() é chamada antes de qualquer leitura. Os valores lidos pelo sensor são muito sensíveis às condições de iluminação local, de forma que qualquer mudança no ambiente que mude um pouco a iluminação faz com que os valores se alterem.

Dessa forma, é preciso calibrar as leituras para cada condição de iluminação ambiente antes de iniciar as leituras. Para mais detalhes sobre essa função de calibração, deixe seu comentário aqui no blog e faça o download dos códigos fonte do projeto.

void setup(){
  CountR = CountG = CountB = 0;
  // Configura as entradas e saidas
  pinMode(s0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(s2, OUTPUT);
  pinMode(s3, OUTPUT);
  pinMode(out, INPUT);
  pinMode(RedLed, OUTPUT);
  pinMode(GreenLed, OUTPUT);
  pinMode(BlueLed, OUTPUT);

  // Seleciona a escala de frequencia para 20%
  digitalWrite(s0, HIGH);
  digitalWrite(s1, LOW);

  // Inicializa a porta serial
  Serial.begin(9600);
  delay(500);

  // Chama função para calibrar o sensor
  calibraSensor();
}

 

Função Void Loop()

Na figura 5 vemos a função void Loop(), que após a calibração será onde o programa permanecerá. Nessa função nós chamamos a rotina ReadColor() para ler o sensor e depois usamos a função IdentificaCor() para identificar qual cor corresponde aos valores lidos pelo sensor.

Dependendo de qual cor foi identificada, nós mostramos no terminal serial o nome da cor e número de vezes que ela foi identificada. Além disso, o led correspondente a cor identificada é acionado.

Caso nenhuma das cores azul, vermelha ou verde seja identificada, é mostrado no terminal serial “Cor Identificada: Nenhuma”. Para identificar outras cores é preciso fazer expandir a função de calibração para as outras cores e adicionar uma condição na void Loop() para identificar essa nova cor. Deixamos como desafio desse post a implementação de cores adicionais no programa que você pode fazer o download aqui.

void loop() 
{  
  int CorIdentificada;

  //chama funçao para ler o sensor
  Readcolor();
  //imprimi valores na tela
  Serial.print(" Leitura do sensor por filtro: "); 
  Serial.println(); 
  Serial.print(" Azul : ");  
  Serial.print(blue, DEC); 
  Serial.print(" Vermelho :");  
  Serial.print(red, DEC);  
  Serial.print(" Verde : ");  
  Serial.print(green, DEC); 
  Serial.println();  


  CorIdentificada = IdentificaCor();

  //Verifica se a cor vermelha foi detectada  
  if (CorIdentificada == colorIsRed)  
  {  
       if(ultimaCor != colorIsRed)
         CountR++;
   
       Serial.print(" Cor Identificada Vermelho: "); 
       Serial.print(CountR,'DEC'); 
       digitalWrite(RedLed, HIGH); //Acende o led vermelho  
       digitalWrite(GreenLed, LOW);  
       digitalWrite(BlueLed, LOW);  
       delay(25);
       ultimaCor = colorIsRed;
  }  
  
  //Verifica se a cor azul foi detectada  
  else if (CorIdentificada == colorIsBlue)   
  {  
       if(ultimaCor != colorIsBlue)
         CountB++;
       Serial.print(" Cor Identificada: Azul - Contador:");  
       Serial.print(CountB,'DEC');
       digitalWrite(RedLed, LOW);  
       digitalWrite(GreenLed, LOW);  
       digitalWrite(BlueLed, HIGH); //Acende o led azul  
       delay(25);
       ultimaCor = colorIsBlue;
  }  

  //Verifica se a cor verde foi detectada  
  else if (CorIdentificada == colorIsGreen)  
  {         
        if(ultimaCor != colorIsGreen)
             CountG++;
             
       Serial.print(" Cor Identificada: Verde Contador: ");  
       Serial.print(CountG,'DEC');
       digitalWrite(RedLed, LOW);  
       digitalWrite(GreenLed, HIGH); //Acende o led verde  
       digitalWrite(BlueLed, LOW);
       delay(25);   
       ultimaCor = colorIsGreen; 
  }  
  
  else
  {
    ultimaCor = NoColor;
    Serial.print(" Cor Identificada: Nenhuma ");  
  }
  
  
  Serial.println(); 
  Serial.println();  
  digitalWrite(RedLed, LOW);  
  digitalWrite(GreenLed, LOW); 
  digitalWrite(BlueLed, LOW); 
  //Aguarda 1500 milisegundos antes de fazer nova leitura
  delay(10);   
  
}

Função ReadColor()

Como você viu na função void loop(), nós utilizamos duas funções especiais para ler o sensor e identificar a cor que está na esteira num dado momento. A primeira delas é a função ReadColor(), que você pode conferir na figura 6.

void Readcolor()  
{  
  //le saida com filtro vermelho
  digitalWrite(s2, LOW);  
  digitalWrite(s3, LOW);  
  delay(50);
  red = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);  
  
  
  //Le saida com filtro azul
  digitalWrite(s3, HIGH);  
  delay(50);
  blue = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);  
  
  //le saida com filtro verde
  digitalWrite(s2, HIGH);  
  delay(50);
  green = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);  
  
  Serial.print(" Leitura do sensor por filtro: "); 
  Serial.println(); 
  Serial.print(" Azul : ");  
  Serial.print(blue, DEC); 
  Serial.print(" Vermelho :");  
  Serial.print(red, DEC);  
  Serial.print(" Verde : ");  
  Serial.print(green, DEC); 
  Serial.println(); 
}

Essa função seta os sinais S2 e S3 do TCS230 de forma a selecionar cada um dos três filtros de cor e faz a leitura do sinal OUT para cada filtro selecionado. Essas leituras são armazenadas nas variáveis red, blue e green para serem comparadas com os valores de referência obtidos na função de calibração.

Função IdentificaCor()

Por fim, temos a função IdentificaCor(), apresentada na figura 7. Essa função nada mais faz do que comparar os valores lidos pela função ReadColor() com os valores de referência obtidos na calibração. A função retorna um inteiro identificando qual a cor presente na esteira naquele exato momento.

int IdentificaCor()
{
  //verifica se a cor e verde
  if( (blue>(mediaBG-15) && blue<(mediaBG+15)) && (red>(mediaRG-15) && red<(mediaRG+15)) && (green>(mediaGG-15) && green<(mediaGG+15)))
    return colorIsGreen;
    
  //verifica se a cor e azul
  else if((blue>(mediaBB-15) && blue<(mediaBB+15)) && (red>(mediaRB-15) && red<(mediaRB+15)) && (green >(mediaGB-15) && green<(mediaGB+15)) )
    return colorIsBlue;
  
  //Verifica se a cor e vermelha  
  else if((blue>(mediaBR-15) && blue<(mediaBR+15)) && (red>(mediaRR-15) && red<(mediaRR+15)) && (green >(mediaGR-15) && green<(mediaGR+15)) )
    return colorIsRed;
  }

Você também pode conferir o código completo e atualizado visitando o repositório desse post no GitHub da Eletrogate.


Botando para Rodar!

Agora que o hardware está montado e firmware que você baixou aqui está carregado no arduino, é hora de rodar o programa! Assim que você energizar o Arduino, abra o terminal serial pela própria IDE Arduino e você verá as mensagens da função de calibração, como mostrado na figura 8.

Trata-se de uma menu bem simplificado para que você possa calibrar o sensor para as cores vermelho, azul e verde dentro das condições de seu ambiente local. Para fazer a calibração siga os seguintes passos:

    1. Assim que a mensagem anunciando que você está na função de calibração for mostrada, coloque um objeto vermelho ao alcance do sensor e digite 1 no terminal serial. Tecle enter e você verá que a calibração para a cor vermelha foi iniciada.
    1. Após a mensagem “Calibração Cor vermelha finalizada” ser mostrada, coloque um objeto azul ao alcance do sensor e digite 2. Aguarde o fim da calibração para a cor azul.
    1. Após a mensagem “Calibração Cor azul finalizada” ser mostrada, coloque um objeto verde ao alcance do sensor e digite 3. Aguarde o fim da calibração para a cor azul.
  1. Depois de ter feito as três calibrações, digite 4 para sair do menu. As mensagens de leitura começaram a ser mostradas no terminal serial como na figura 9.

Figura 8: Função de calibração

Figura 9: Projeto rodando após calibração


Considerações Finais

Agora que você entendeu como tudo funciona e já até tem um código fonte como base, é hora de pôr a mão na massa e desenvolver as suas próprias funcionalidades novas, adicionar novas cores e expandir o uso do sensor TCS230. Boa sorte!

Esteira com sensor TCS230

Conheça a Metodologia Eletrogate e ofereça aulas de robótica em sua escola!


Sobre o Autor


Vitor Vidal

Engenheiro eletricista, mestrando em eng. elétrica e apaixonado por eletrônica, literatura, tecnologia e ciência. Divide o tempo entre pesquisas na área de sistemas de controle, desenvolvimento de projetos eletrônicos e sua estante de livros.


Eletrogate

10 de julho de 2017

A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.

Tenha a Metodologia Eletrogate dentro da sua Escola! Conheça nosso Programa de Robótica nas Escolas!

Eletrogate Robô

Cadastre-se e fique por
dentro de novidades!