Usando o Sensor de Cor TCS230

Introdução
A sua aplicação precisa identificar cores, mas você não sabe como implementar essa função? O Sensor de Cor TCS230 é utilizado para detectar cores do tipo RGB (red, green e blue) em objetos colocados à sua frente, e assim você é capaz de atuar sobre objetos de uma cor específica.
Nesse tutorial você irá aprender a identificar cores e a implementar uma lógica para atuar sobre uma determinada cor lida.
Lista de Materiais

Lista completa de produtos
comprar
BlackBoard UNO R3

Cabo USB AB 1.50m

Sensor de Cor TCS230

Resistor 300Ω - Pacote com 10 unidades

LED RGB Alto Brilho - 5 unidades

Micro Servo 9g SG90

Garra Robótica Ant V2

Protoboard 400 Pontos

WorkPlate 400 - Preta

Jumpers Macho-Macho x40 Unidades

Jumpers Macho-Fêmea x40 Unidades
Conceitos Teóricos
Sensor de Cor TCS230
O módulo aceita uma alimentação de 3 a 5 V e são utilizados cinco pinos para a conexão ao Arduino. São eles: os pinos de controle S0 e S1, que configuram a escala de frequência na saída para 2%, 20% ou 100%; S2 e S3, que selecionam o filtro de cor a ser lida; OUT, que é o responsável pelo envio das informações; e o pino OE (Operational Enable), que deve ser ligado ao GND, já que o módulo vai enviar informações continuamente ao Arduino.

Fonte: Datasheet TCS230
O sensor possui 64 fotodiodos que captam a intensidade da luz, dos quais 48 são filtrados para as cores RGB (16 para a cor vermelha, 16 para a cor verde e 16 para a cor azul), e o restante não possui filtro. Ele gera na saída um sinal de onda quadrada com as informações sobre a intensidade das cores RGB, como na imagem abaixo.

Fonte: RandomNerdTutorials
Servo Motor

Fonte: Flickr
Os servomotores de aeromodelismo, como o MG90S e o MG996R, possuem uma tensão de alimentação e operação entre 4,8 V e 6 V, assim como três pinos de conexão, sendo eles VCC (fio vermelho), GND (fio marrom) e PPM (fio laranja), como na imagem ao lado. Com ele é possível controlar a posição do eixo através dos comandos enviados pelo microcontrolador.
Vale lembrar que os servomotores trabalham com um sinal PPM (Pulse-Position Modulation), de rádio controle, porém podemos controlá-los utilizando placas da plataforma Arduino, juntamente com a biblioteca "Servo" da Arduino IDE, que envia um sinal PPM através dos pinos digitais da placa.
Para este tutorial usamos a Garra Robótica Ant V2, portanto, antes de mais nada, monte a estrutura da garra seguindo os passos de seu manual de montagem.
Projeto Identificando Cores
Nesse primeiro projeto vamos usar o sensor TCS230 para identificar cores.
Circuito
Monte o circuito conforme a figura abaixo. Note que utilizamos um LED RGB, que irá acender a cor corresponde ao objeto colocado na frente do sensor de cores.

Código
Com o circuito pronto, copie e carregue o código abaixo para sua BlackBoard.
Entendendo o Código
No início do código definimos os pinos para a conexão com o sensor de cor e os pinos que são conectados ao LED RGB. Posteriormente criamos as variáveis vermelho
, verde
e azul
, que armazenam os valores das cores.
No setup do programa, definimos as entradas e saídas, e também deixamos o pino S0 em nível alto e o pino S1 em nível baixo, configurando como 20% a frequência de saída.
Pulando brevemente o looping do código, inserimos a função leitura_cores()
, que contém a rotina de leitura das cores. Para realizar essa leitura de cores, primeiramente definimos os pinos S2 e S3 em nível lógico baixo, para ativar no sensor o filtro de cor vermelha, e então verificamos através da lógica if(digitalRead(PINO_SENSOR_OUT) == HIGH)
se o nível lógico do pino OUT do sensor está alto. Caso essa condição seja verdadeira, atribuímos à variável vermelho
a duração do pulso do pino de saída do sensor em nível baixo através do comando pulseIn(PINO_SENSOR_OUT, LOW)
. Caso contrário, utilizamos o comando pulseIn(PINO_SENSOR_OUT, HIGH)
para atribuir à variável vermelho
a duração do pulso de saída do sensor em nível alto. Em seguida, ativamos o filtro de cor azul do sensor, mantendo o pino S2 em nível lógico baixo, e definindo o pino S3 em nível lógico alto. Após a ativação do filtro de cor azul, da mesma maneira da variável vermelho
, verificamos o nível lógico da saída do sensor atribuímos a sua duração de pulso à variável azul
. Por fim, o filtro de cor verde é ativado, passando o pino S2 para nível lógico alto também, para que possamos atribuir à variável verde
a duração do pulso do pino de saída do sensor, da mesma forma que foi feita com as variáveis vermelho
e azul
.
No looping do programa, primeiramente chamamos a função leitura_cores()
, realizando assim a leitura das cores, para que possamos compará-las e atuar sobres elas. Em seguida, com as condições "if", verificamos qual foi a cor lida, através da comparação das variáveis vermelho
, azul
e verde
. Ao identificar a cor vermelha, por exemplo, o TCS230 gera pulsos de baixa duração com o filtro de cor vermelha ativada, o que acaba gerando um valor inferior às demais cores. O mesmo ocorre com as cores verde e azul em seus respectivos filtros, portanto, podemos compará-las através da duração do pulso recebido. Através da condição if (vermelho < azul && vermelho < verde)
, verificamos se a variável vermelho
é inferior às variáveis azul
e verde
. Então, caso essa condição seja verdadeira, sabemos que a cor lida pelo sensor é vermelha, e acionamos, portanto, o pino da cor vermelha do LED RGB, assim como mantemos os pinos das cores verde e azul do LED apagados.
Da mesma maneira que comparamos a variável vermelho
, comparamos as variáveis azul
e verde
através das condições if (azul < vermelho && azul < verde)
e if (verde < vermelho && verde < azul)
, respectivamente. Então acendemos e apagamos os respectivos pinos do LED para demonstrar qual foi a cor lida pelo sensor.
O Que Deve Acontecer
Como é possível ver abaixo, o LED RGB acenderá de acordo com a cor do objeto na frente do sensor, sendo ele, azul, verde ou vermelho.
Projeto Agarrando por Cores
Agora que já aprendemos a identificar cores, que tal capturar com uma garra robótica um objeto quando determinada cor for identificada?
Circuito
Para esse projeto, monte o circuito a seguir, com a garra robótica já montada.

Código
O código para o controle da garra robótica é parecido com o código do primeiro projeto, porém adicionando alguns comandos para controle do servomotor.
Entendendo o Código
No início do código, adicionamos a biblioteca "Servo" da Arduino IDE, e criamos o objeto servo_motor
, que é atribuído ao pino 6 na configuração do código através do comando servo_motor.attach(6)
.
Durante a execução de leitura de cores do sensor, e juntamente com o acender do pino azul do LED RGB, movemos o eixo do servo para o ângulo definido para o seu fechamento (10 graus). Entretanto, caso a cor lida não seja azul, o servomotor é mantido na posição de 90 graus.
O Que Deve Acontecer
Ao identificar a cor azul, a garra se fecha no intuito de capturar o objeto à sua frente, e caso contrário, a garra irá se manter aberta, como se estivesse à espera de uma nova leitura, como no GIF abaixo.