Biblioteca no Arduino para o Sensor de Cor TCS320 e TCS3200

Share
banner
color-sensor-TCS230-Color-Recognition-Sensor-Detector-Module-DC-3-5V-Input-Color-090541

Sensor de Cor TCS230/TCS3200 em uma breakout board

O sensor de reconhecimento de cor TCS230/3200 da AMS (antiga TAOS) possui um conjunto de 64 fotodiodos para detecção de cores: 16 com filtro para a frequencia de cor vermelha (Red), 16 com filtro para a frequencia de cor verde (Green), 16 com filtro para a frequencia de cor azul (Blue), e ainda 16 fotodiodos sem filtro de cores. Esse conjunto de fotodiodos permite ao circuito integrado fazer o que chama de transformação de luz-para-frequência (light-to-frequency). O que acontece é o seguinte: a saída do sensor é um pulso de 50% de duty cycle (isso significa que é um pulso quadrado “perfeito”, ou seja, metade do tempo em nível lógico alto e metade em nível lógico baixo), que varia a frequência conforme a intensidade da luz.

O TCS230/3200 possui quatro entradas: S0, S1, S2, e S3. As duas primeiras servem para selecionar uma escala de frequência (2%, 20% ou 100%), ou simplesmente desligar o sensor. As duas últimas servem para selecionar o conjunto de fotodiodos que você quer o resultado: como são dois bits, teremos exatamente quatro possiblidades, que são correspondentes aos quatro conjuntos de fotodiodos. Assim o sensor dará um resultado com a intensidade de cada cor que ele consegue medir, e a intensidade total, permitindo o desenvolvimento de uma aplicação que calcule o valor RGB para a cor detectada. Veja abaixo a tabela, extraída do datasheet:

tcs230Finalmente temos uma biblioteca para lidar com esse sensor no Arduino!!! A bilioteca MD_TCS230 está disponível para download no GitHub e no CodePlex. Vamos a um passo-a-passo para testar seu primeiro programinha com o sensor de cores no Arduino!!

1º passo – Instalando a biblioteca MD_TCS230

Faça o download da biblioteca nesse link (aconselho utilizar este link direto para a página de download no CodePlex, pois a MD_TCS230 possui uma dependencia que está incluída neste pacote zip). Depois de completar o download, abra o pacote zip com o descompactador e extraia as pastas FreqCount e MD_TCS230 no dentro do diretório ~/sketchbook/libraries (ou /home/[SEU_USUARIO/sketchbook/libraries ou, se usar Windows – sério que vc faz isso??? :O – você irá encontrar a pasta libraries dentro da pasta sketchbook provavelmente no sua pasta de usuário – c:\Users\[SEU_USUARIO]\sketchbook\libraries – não mudou nada, né? rs). Feche todas as janelas da Arduino IDE (isso é importante! – em alguns casos só funciona se fizer isso – wtf?) e depois abra o Arduino IDE novamente. Pronto! As bibliotecas MD_TCS230 e FreqCount estão instaladas (a FreqCount é uma dependência da MD_TCS230).

2º passo – Carregando o programa de exemplo da biblioteca

Vamos utilizar aqui o mais simples programa de exemplo disponível na biblioteca, que simplesmente irá retornar no Serial Monitor as leituras realizadas em um código RGB. Se tudo deu certo no passo anterior, você poderá acessar o programa de exemplo da MD_TCS230 através do menu: File -> Sketchbook -> libraries -> MD_TCS230 -> Simple_NB_TCS230. Quando você clicar aí, carregará o seguinte código:

// TCS230 sensor reading example
//
// This is just to show basic functionality without calibration.
// Utilises the non-blocking version of the reading function.
// Output uses the Serial console.
//
#include 
#include 

// Pin definitions
#define  S2_OUT  12
#define  S3_OUT  13
#define  OE_OUT   8    // LOW = ENABLED 

MD_TCS230  CS(S2_OUT, S3_OUT, OE_OUT);

void setup()
{
  Serial.begin(57600);
  Serial.println("[TCS230 Simple NON_BLOCKING Example]");
  Serial.println("\nMove the sensor to different color to see the RGB value");
  Serial.println("Note: These values are being read in without sensor calibration");
  Serial.println("and are likely to be far from reality");

  CS.begin();
}

void readSensor()
{
  static  bool  waiting;
 
  if (!waiting)
  {
    CS.read();
    waiting = true;
  }
  else
  {
    if (CS.available())
    {
      colorData  rgb;
      
      CS.getRGB(&rgb);
      Serial.print("RGB [");
      Serial.print(rgb.value[TCS230_RGB_R]);
      Serial.print(",");
      Serial.print(rgb.value[TCS230_RGB_G]);
      Serial.print(",");
      Serial.print(rgb.value[TCS230_RGB_B]);
      Serial.println("]");
      
      waiting = false;
    }
  }
}

void loop()
{
  readSensor();
}

Pronto! Esse programa aí você carregará para a memória do Arduino em breve (é aconselhável montar todo o hardware antes de carregar o programa pro Arduino, o que faremos no próximo passo).

3º passo – Montando o hardware: ligações com o Arduino

120_1_H

Arduino UNO

Nesse primeiro programa de exemplo, que é bastante simples, você precisará fazer apenas quatro conexões além do VCC e GND, que são a alimentação do sensor: S2, S3, OE, e OUT. Até mesmo OE (Output Enable), se quiser, você pode simplesmente ligar o pino OE do sensor ao GND, sem conectar no Arduino, mas é aconselhável seguir o projeto do programa, já que estamos aprendendo e poderá ser importante, no futuro, desabilitar temporariamente a saída do sensor.

É fácil descobrir as conexões para S2, S3, e OE simplesmente verificando as linhas de código dentro do programa:

// Pin definitions
#define  S2_OUT  12
#define  S3_OUT  13
#define  OE_OUT   8    // LOW = ENABLED

Mas… e onde vou conectar OUT no Arduino?? Como é que eu sei onde vou conectar a saída do meu sensor de cores RGB no Arduino? Então, tive um trabalho aqui, mas foi apenas falta de ler a documentação da bilioteca. Se você observar na descrição da biblioteca aqui, perceberá uma NOTA IMPORTANTE onde o autor da biblioteca avisa sobre uma limitação da dependencia FreqCount, que permite a utilização apenas de determinados pinos para a contagem da frequencia e limita o uso de outros pinos, conforme a tabela abaixo:

Board         Input Pin   Pins Unusable with analogWrite()
-----------   ---------   --------------------------------
Arduino Uno   5           3, 9, 10, 11
Arduino 2009  5           3, 9, 10, 11
Arduino Mega  47          9, 10, 44, 45, 46
Sanguino      1           12, 13, 14, 15

Logo, sabemos que o pino para a conexão da saída do sensor (pino OUT), é o pino 5 do Arduino. Ficam então as conexões:

SENSOR     ARDUINO UNO
------     -----------
 VCC           5V
 GND           GND
 S2            12
 S3            13
 OE            2
 OUT           5

Uma vez terminadas as conexões, carregue o programa para dentro do Arduino e teste seu programa! Assim que carregar o programa (você verá ver a mensagem “Done uploading.” na barra de status da Arduino IDE), pressione Ctrl+Shift+M ou vá em Tools -> Serial Monitor. Quando abrir o Serial Monitor, selecione a taxa de transferência de 57600 baud no canto inferior direito, senão você apenas enxergará caracteres malucos em sua tela… rs. Aproxime uma folha branca de papel do sensor para ver como ele marca perfeitamente: [255,255,255] no Serial Monitor. Outras cores ficarão aproximadas, o preto é bastante difícil de detectar. Cores mais “claras” são mais fáceis por terem uma SATURAÇÃO maior e também maior INTENSIDADE de luz, permitindo assim que o software tenha mais informações com que trabalhar. Deixe seu comentário e até a próxima!!

PUBLICIDADE


Quer continuar por dentro das novidades do Blog Seja Livre? Siga o nosso perfil no TWITTER, curta a nossa página no FACEBOOK ou adicione o Blog Seja Livre nos seus círculos do GOOGLE+.

Sobre o Autor

Natural de Cruz Alta - RS, mora em São Paulo desde ínicio de 2014. Trabalha com eletrônica desde 2006, tendo atuado nas áreas de manutenção hospitalar, telecomunicações e defesa. Entusiasta de Linux, Software Livre e Eletrônica, é programador e desenvolvedor web, apaixonado por Arduino e membro da LoCo Team Ubuntu-BR-SP.. Também curte música, filosofia e sociologia, chegou a cursar Direito na UFSM e é discípulo de Lênio Streck e da hermenêutica filosófica.

  • Larissa

    Alguem sabe como fazer 2 sensores RGB seguirem linha? Não entendi a estrutura deste codigo e nao consigo usar os valores dados na serial para fazer a lógica de seguir linha

  • Wendell Mendes

    Muito bom!
    Obrigado!