Nessa aula você verá como usar um sensor de cor TCS34725 com qualquer Arduino e como obter leituras de dois sensores ao mesmo tempo utilizando o Arduino Due. Utilizaremos como base a biblioteca disponibilizada gratuitamente pela Adafruit.

sobre o TCS34725

Descrição:

Se trata de um sensor de cor bastante preciso, ideal para se utilizar em projetos de robótica por possuir muitos benefícios. Ele se diferencia dos seus concorrentes por possuir um LED de alta intensidade, funcionar tanto com 5v quanto com 3.3v e possuir um filtro IR, tudo isso em uma pequena placa, tornando assim sua leitura de cores mais fiel e condizente com a realidade, além de permitir muitas configurações internas.

Especificações:

Implementando um sensor TCS34725:

Para esse primeiro exemplo irei usar um Arduino UNO, primeiramente você terá que ligar os pinos do sensor à sua placa Arduino, se precisar siga o esquemático à baixo:

Em seguida você pode abrir a sua IDE, selecionar qual placa você está usando e passar o seguinte código para o seu Arduíno:

#include <Wire.h>
#include "Adafruit_TCS34725.h"
/* Inicializa com os valores padrões(int time = 2.4ms, gain = 1x) */
// Adafruit_TCS34725 tcs = Adafruit_TCS34725();
/* Initialise with specific int time and gain values */
Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_700MS, TCS34725_GAIN_1X);
void setup()
{
Serial.begin(9600);
if (tcs.begin())//Se conseguirmos iniciar o sensor significa que ele está conectado
{
Serial.println("Sensor encontrado");
}
else//caso contrário ele nao está conectado
{
Serial.println("Sensor não encontrado, cheque suas conecções.");
while (1);
}
}
void loop()
{
uint16_t r, g, b, c;
tcs.getRawData(&r, &g, &b, &c);//Pega os valores "crus" do sensor referentes ao Vermelho(r), Verde(g), Azul(b) e da Claridade(c).
//Agora vamos printar Os valores referentes a cada cor.
Serial.print("Vermelho : "); Serial.print(r, DEC); Serial.print(" ");
Serial.print("Verde : "); Serial.print(g, DEC); Serial.print(" ");
Serial.print("Azul : "); Serial.print(b, DEC); Serial.print(" ");
Serial.print("Claridade: "); Serial.print(c, DEC); Serial.print(" ");
Serial.println(" ");
}

Após isso, ainda com seu Arduino conectado, ao abrir o serial monitor você deverá começar a receber os valores lidos pelo sensor, r(Vermelho), g(Verde), b(Azul) e c(claridade), caso não esteja recebendo nada, verifique se seu baud rate(taxa de transmissão de dados) está em 9600, caso esteja e mesmo assim você continuar sem receber nada, procure verificar suas conexões.

Obtendo a leitura simultânea de dois sensores TCS34725 com o Arduino Due:

Caso você deseje utilizar dois sensores TCS34725 simultaneamente com o Arduino Due, utilizando seus 2 barramentos I²C, saiba que é possível, fiz algumas modificações na biblioteca da Adafruit para que seja possível usar o segundo barramento I²C da placa

Primeiramente devemos fazer as ligações dos sensores na placa Arduino, você pode seguir o seguinte esquemático:

Depois, baixe e instale em sua IDE a biblioteca que modifiquei e o núcleo da placa Arduíno Due. Para baixar o núcleo, siga o tutorial:

1. Vá em “Ferramentas/Placa” depois clique em “Gerenciador de Placas…”

2. Procure por “Arduino Due” e instale a versão mais recente

Após instalado use esse código como exemplo:

#include <Wire.h>
#include "Adafruit_TCS34725_DUE.h"
/* Inicializa com os valores padrões(int time = 2.4ms, gain = 1x) */
// Adafruit_TCS34725_W0 sensor1 = Adafruit_TCS34725_W0();
// Adafruit_TCS34725_W1 sensor2 = Adafruit_TCS34725_W1();
//------------
bool S1; // SERVE PARA SABER SE O SENSOR FOI DETECTADO OU NÃO// S = 0 --> SENSOR
// NAO ENCONTRADO S = 1 --> SENSOR ENCONTRADO
bool S2; //
//------------
/* Inicializa com um 'int time' e 'gain values' especificos */
Adafruit_TCS34725_W0 sensor1 = Adafruit_TCS34725_W0(TCS34725_INTEGRATIONTIME_700MS, TCS34725_GAIN_4X);
Adafruit_TCS34725_W1 sensor2 = Adafruit_TCS34725_W1(TCS34725_INTEGRATIONTIME_700MS2, TCS34725_GAIN_4X2);
// TABELA DE VELOCIDADES e GANHOS:
// SENSOR1:
// TCS34725_INTEGRATIONTIME_2_4MS TCS34725_GAIN_1X
// TCS34725_INTEGRATIONTIME_24MS TCS34725_GAIN_4X
// TCS34725_INTEGRATIONTIME_50MS TCS34725_GAIN_16X
// TCS34725_INTEGRATIONTIME_101MS TCS34725_GAIN_60X
// TCS34725_INTEGRATIONTIME_154MS
// TCS34725_INTEGRATIONTIME_700MS
// SENSOR2:
// TCS34725_INTEGRATIONTIME_2_4MS2 TCS34725_GAIN_1X2
// TCS34725_INTEGRATIONTIME_24MS2 TCS34725_GAIN_4X2
// TCS34725_INTEGRATIONTIME_50MS2 TCS34725_GAIN_16X2
// TCS34725_INTEGRATIONTIME_101MS2 TCS34725_GAIN_60X2
// TCS34725_INTEGRATIONTIME_154MS2
// TCS34725_INTEGRATIONTIME_700MS2
void setup()
{
Serial.begin(9600);
delay(1000);
}
void loop()
{
if (sensor1.begin())
{
S1 = 1;
}
else
{
S1 = 0;
}
if (sensor2.begin())
{
S2 = 1;
}
else
{
S2 = 0;
}
if (S1 == 1)
{
uint16_t r, g, b, c;
sensor1.getRawData(&r, &g, &b, &c);//Pega os valores "crus" do sensor 1 referentes ao Vermelho(r), Verde(g), Azul(b) e da Claridade(c).
Serial.print("R1: ");
Serial.print(r, DEC);
Serial.print("\t");
Serial.print("G1: ");
Serial.print(g, DEC);
Serial.print("\t");
Serial.print("B1: ");
Serial.print(b, DEC);
Serial.print("\t");
Serial.println(" ");
}
else
{
Serial.print("R1: 0\t");
Serial.print("\t");
Serial.print("G1: 0\t");
Serial.print("\t");
Serial.print("B1: 0\t");
Serial.print("\t");
Serial.println(" ");
}
if (S2 == 1)
{
uint16_t r2, g2, b2, c2;
sensor2.getRawData2(&r2, &g2, &b2, &c2);//Pega os valores "crus" do sensor 2 referentes ao Vermelho(r), Verde(g), Azul(b) e da Claridade(c).
Serial.print("R2: ");
Serial.print(r2, DEC);
Serial.print(" \t");
Serial.print("G2: ");
Serial.print(g2, DEC);
Serial.print(" \t");
Serial.print("B2: ");
Serial.print(b2, DEC);
Serial.print(" \t");
Serial.println(" ");
Serial.println("/-----------------------------------------/ ");
}
else
{
Serial.print("R2: 0\t");
Serial.print("\t");
Serial.print("G2: 0\t");
Serial.print("\t");
Serial.print("B2: 0\t");
Serial.print("\t");
Serial.println(" ");
Serial.println("/-----------------------------------------/ ");
}
}