IoT e Makers

27 out, 2014

Biblioteca no Arduino pra o sensor de cor TCS320 e TCS3200

Publicidade

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 frequência de cor vermelha (Red), 16 com filtro para a frequência de cor verde (Green), 16 com filtro para a frequência de cor azul (Blue), e ainda 16 fotodiodos sem filtro de cores. Esse conjunto de fotodiodos permite ao circuito integrado fazer o que chamamos de transformação de luz-para-frequência (light-to-frequency). O que acontece é que 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 de frequência conforme a intensidade da luz.

Sensor de Cor TCS230/TCS3200 em uma breakout board.
Sensor de Cor TCS230/TCS3200 em uma breakout board.

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 possibilidades, 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:

tcs230

Finalmente 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.

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 dependência 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 sketchbookprovavelmente 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) 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).

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).

Montando o hardware: ligações com o Arduino

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.

Arduino UNO
Arduino UNO

É 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 frequência 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 carregá-lo (você 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!