Olá, tudo bem? Hoje vamos aprender a como estar utilizando o sensor de cor TCS230. Um sensor muito utilizado devido ao seu custo benefício.
Vamos aprender a como estar identificando todas as cores dos objetos que aproximamos do sensor e como calibrar para uma melhor precisão dele. Quer saber como faz isso? Então vamos nessa!
Tipos de Aplicações do Sensor de Cor TCS230
A aplicação dos sensores de cor pode ter diversos exemplos, tudo vai depender das funções que determinado projeto irá executar. Contudo, o exemplo mais claro e que você vai encontrar muito na internet é a utilização desse sensor para a separação de objetos coloridos.
Funcionamento do Sensor de Cor TCS230
Então, entrando agora mais a fundo sobre o seu funcionamento, vamos compreender como esse sensor identifica a cor do objeto que colocamos na sua frente.
Antes disso, é importante saber que qualquer cor formada, ela sempre vai ser derivada de três cores principais, O chamado RGB. Assim, para cada cor, sempre vamos ter um valor de R = red, G = green e B = blue.
Falando agora sobre a composição do sensor, ela vai ser feita por 64 fotodiodos. Desses 64 fotodiodos, 16 tem filtros (ou seja, absorve) cor vermelha, 16 filtros para a cor verde, 16 para a cor azul e 16 não tem filtro algum.
Dessa forma, esses filtros são distribuídos uniformemente sobre o sensor, captando a luminosidade, filtrando as cores, e gerando na saída um sinal de onda quadrada com as informações sobre a intensidade das cores do RGB.
Configuração sensor de cor TCS230
Acredito que você já notou que o nosso sensor TCS230 possui 8 pinos. Desses pinos, vamos trabalhar apenas com 5, são eles: S0, S1, S2, S3, utilizado para o controle do sensor e o pino OUT, responsável pelo envio das informações coletadas.
O pino OE (Output Enable, ou saída habilitada/ativada) deve ser ligado ao GND, isso porque o módulo vai estar enviando continuamente informações ao Arduino.
Para terminar então a explicação da sua funcionalidade, vamos compreender como funciona os pinos de controle. Observe portanto, as tabelas abaixo:
Como vamos trabalhar com a escala de frequência no máximo então vamos colocar os pinos S0 e S1 no nível alto. Já os pinos S2 e S3 precisam estar se alterando para poder captar os valores de RGB.
Ou seja, quando aproximarmos o sensor de uma determinada cor será preciso realizar a leitura do red, green e blue, pois com esses valores vamos saber qual cor está na frente do sensor, beleza?
Lista de Componentes
- 01 x Arduino UNO
- 01 x Protoboard 830 Pontos
- 01 x Sensor de Cor TCS230
- Alguns Jumpers
Montagem do Circuito
Código do Projeto Comentado
/* ========================================================================================================
Projeto: Identificando Cores com TCS230
Autor: Danilo Nogueira
Data: 23/02/2019
Domínio Público.
// ==================================================================================================*/
// --- Conexão dos Pinos ---
#define S2 9
#define S3 10
#define OUT 8
// ==================================================================================================
// --- Definindo as funções ---
void calculo_RGB(); // Função para calcular o valor de R G B de cada cor.
void color(); // Função para identificar a cor que o sensor identificou.
// ==================================================================================================
// --- Definindo as Variáveis ---
// Variáveis para armazenar os valores de cada cor enviados pelo sensor.
int red;
int green;
int blue;
// ==================================================================================================
// --- Configurando o Setup() ---
void setup()
{
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(OUT, INPUT);
Serial.begin(115200); // Velocidade de comunicação do Monitor Serial
}
// ==================================================================================================
// --- Configurando o Loop() ---
void loop()
{
calculo_RGB();
color();
delay(700);
}
// ==================================================================================================
// --- Desenvolvendo a Função criada ---
void calculo_RGB()
{
//Seleciona leitura com filtro para vermelho de acordo com a tabela lembra?
digitalWrite(S2,LOW);
digitalWrite(S3,LOW);
//Lê duração do pulso em LOW
red = pulseIn(OUT, LOW); // Função que retorna a duração do pulso em ms
//Imprime via serial
Serial.print(" RED = ");
Serial.print(red);
Serial.print(" | ");
delay(10);
//Seleciona leitura com filtro para verde
digitalWrite(S2,HIGH);
digitalWrite(S3,HIGH);
//Lê duração do pulso em LOW
green = pulseIn(OUT, LOW);
//Imprime via serial
Serial.print("GREEN = ");
Serial.print(green);
Serial.print(" | ");
delay(10);
//Seleciona leitura com filtro para azul
digitalWrite(S2, LOW);
digitalWrite(S3,HIGH);
//Lê duração do pulso em LOW
blue = pulseIn(OUT, LOW);
//Imprime via serial
Serial.print("BLUE = ");
Serial.println(blue);
delay(10);
}
// ==================================================================================================
// --- Desenvolvendo a Função criada ---
void color()
{
// ----- OBS: Os valores dessa tabela irão variar dependendo da luminosidade do local. ------
/* Tabela de Valores do RGB das Cores
* COR | RED | GREEN | BLUE |
* PRETO | 13 | 22 | 20 |
* VERMELHO | 06 | 14 | 12 |
* VERDE | 11 | 16 | 15 |
* AZUL | 12 | 18 | 13 |
* CINZA | 06 | 08 | 07 |
* BRANCO | 04 | 04 | 04 |
*/
if (12 <= red <= 14 && 21 <= green <= 23 && 19 <= blue <= 21)
{
Serial.println("");
Serial.print(" PRETO! ");
Serial.println("");
}
if (05 <= red <= 07 && 13 <= green <= 15 && 11 <= blue <= 13)
{
Serial.println("");
Serial.print(" VERMELHO! ");
Serial.println("");
}
if (10 < red < 12 && 15 < green < 17 && 14 < blue < 16)
{
Serial.println("");
Serial.print(" VERDE! ");
Serial.println("");
}
if (11 < red < 13 && 17 < green < 19 && 12 < blue < 14)
{
Serial.println("");
Serial.print(" AZUL! ");
Serial.println("");
}
if (5 < red < 7 && 7 < green < 9 && 6 < blue < 8)
{
Serial.println("");
Serial.print(" CINZA! ");
Serial.println("");
}
if (03 < red < 04 && 03 < green < 04 && 03 < blue < 04)
{
Serial.println("");
Serial.print(" BRANCO! ");
Serial.println("");
}
}
// ======================================= FIM =====================================================
Analisando o Código a Fundo
Em nosso código, nós iniciamos definindo os pinos do Arduino onde o sensor está conectado. Logo depois, declaramos as duas funções que vamos utilizar em nosso código e também declaramos as variáveis que utilizamos para trabalhar com os valores de RGB que o sensor está enviando ao Arduino.
Em seguida, no void setup, declaramos os pinos S2 e S3 como saída uma vez que iremos alternar eles para a leitura de cada cor do RGB. Além disso, iniciamos a comunicação serial e colocamos o valor de 115200. Então é preciso alterar esse valor quando você abrir o monitor serial, beleza?
Agora entrando no void loop, encontramos as nossas duas funções do programa. Analisando a primeira delas, a “calculo_RGB”, vamos encontrar dentro dela, toda a lógica de como está sendo feita a leitura de cada cor RGB do sensor. Primeiro configuramos os pinos S2 e S3 e então realizamos a leitura através do comando:
cor = pulseIn(OUT, LOW);
Depois disso, mostramos no Monitor Serial o valor enviado pelo sensor ao Arduino. A mesma lógica segue para as cores green e blue. Por fim, entramos na outra função do código chamada de “color”.
Dentro dessa função, é onde vamos identificar qual cor o sensor está lendo naquele momento. Para isso, monte uma tabela como essa que está no código e coloque os valores que o sensor está lendo naquele momento.
Em seguida, altere os intervalos dentro do If e adicione o número de cores que quiser. Lembrando que é aconselhável utilizar objetos com cores bem sólidas, nada de degradê ou desenho combinado?
Resultado do Projeto
Para finalizar o projeto de hoje, deixo para você um vídeo do canal da AutoCore no Youtube. Nele, estamos mostrando o resultado do projeto desenvolvido.
Mas e ai? Gostou? Caso tenha ficado algo incompleto para você, comenta abaixo
Dicas?
Forte abraço!
