Deteção de cores com o Arduino

Neste tutorial, exploraremos como ler cores usando um Arduino e sensores como o TCS 3200. A idéia será detectar a cor de um objeto, exibindo-a em um LCD. Este tutorial é a primeira parte de um projeto maior, um braço robótico que decide que operação executar a partir da cor de uma peça.

O diagrama de blocos abaixo mostra os principais componentes:

Color Detector Block Diagram

O vídeo abaixo mostra como ficará o projeto final:

1: Lista de materiais (BoM)

Os links e preços abaixo são apenas para referência.

  1. Arduino Nano (US$ 8.00)
  2. TCS3200 Color Sensor Module (US$ 9.00)
  3. IIC/I2C/TWI 1602 Serial Blue Backlight LCD Module (US$ 8.00)
  4. Breadboard (US$ 2.00)
  5. Cables

2: O sensor TSC 3200

The TSC 3200 Color Sensor

Como descrito en seu Datasheet, O TCS3200 é um conversor programável de luz (cor) em frequência que combina fotodiodos de silício configuráveis e um conversor de corrente em frequência, tudo encapsulado em um único circuito integrado do tipo CMOS.

A saída é um sinal do tipo “onda quadrada” (ciclo de trabalho de 50%) cuja freqüência é diretamente proporcional à intensidade da luz (irradiance). A frequência de saída pode ser escalonada por um dos três valores predefinidos através de dois pinos de entrada de controle (S0 e S1).

Entradas e saída digitais permitem interface direta com um microcontrolador ou outros circuitos lógicos.
TSC3200 Diagram
Output enable (OE) coloca a saída no estado de alta impedância para a partilha de múltiplas unidades de uma linha de entrada do microcontrolador. No TCS3200, o conversor de luz em frequência lê uma matriz 8 x 8 de fotodíodos. O OE (Enable) deve ser conectado a GND (LOW).
  • 16 fotodiodos têm filtros azuis,
  • 16 fotodiodos têm filtros verdes,
  • 16 fotodiodos têm filtros vermelhos e
  • 16 fotodiodos são claros sem filtros.

Os pinos S2 e S3 são usados para selecionar qual grupo de fotodíodos (vermelho, verde, azul ou claro) está ativo. Os fotodiodos têm um tamanho de 110 μm x 110 μm e estão em centros de 134 μm.

O Sensor deve ser alimentado entre 2.7 e 5.5VDC. Usaremos a saída 5V do Arduino para alimentar o sensor.

Para usar corretamente o sensor, vamos instalar um pequeno anel de borracha para isolar o sensor da luz lateral. Eu usei cola quente para corrigi-lo.

Sensor with ring

3: Conectando o HW

Connecting the HW
  1. Instale o Arduino Nano no BreadBoard
  2. Conecte a saída de 5V e GND do Nano 5Va ambos Power Rails do BreadBoard
  3. Conecte o sensor TSC3200 como descrito abaixo:
    • S0     ==> Nano pin D4
    • S1     ==> Nano pin D5
    • S2     ==> Nano pin D6
    • S3     ==> Nano pin D7
    • OUT ==> Nano Pin D8
    • EN    ==> GND
    • VCC  ==> +5V
    • GND ==> GND
  4. Conecte o I2C LCD 2/16 Serial Display como abaixo:
    • SDA ==> Nano Pin A4
    • SCL ==> Nano Pin A5

4: O código do Arduino

The Arduino Code

A primeira coisa a definir é a escala de freqüência a ser utilizada, tal como definida na tabela mostrada acima. Os pinos S0 e S1 são usados para isso. A escala da freqüência de saída é útil para otimizar as leituras de sensores para vários contadores de freqüência ou microcontroladores. Definiremos S0 e S1 em HIGH (100%), funcionou bem com meu Nano. Já observei em alguns projectos com o UNO, a frequência escalonada em 20%. Teste para ver o melhor em seu caso.

  digitalWrite(s0,HIGH);
  digitalWrite(s1,HIGH);

A próxima coisa a fazer é selecionar a cor a ser lida pelo fotodíodo (vermelho, verde ou azul), usamos os pinos de controle S2 e S3 para isso. Como os fotodiodos são conectados em paralelo, o ajuste de S2 e S3 como LOW ou HIGH em combinações diferentes, permite que você selecione diferentes fotodiodos, como mostrado na tabela acima e definidos no código abaixo:

void readRGB() 
{
  red = 0;
  grn = 0;
  blu = 0;
  int n = 10;
  for (int i = 0; i < n; ++i)
  {
    //read red component
    digitalWrite(s2, LOW);
    digitalWrite(s3, LOW);
    red = red + pulseIn(outPin, LOW);
 
    //read green component
    digitalWrite(s2, HIGH);
    digitalWrite(s3, HIGH);
    grn = grn + pulseIn(outPin, LOW);
 
    //let's read blue component
    digitalWrite(s2, LOW);
    digitalWrite(s3, HIGH);
    blu = blu + pulseIn(outPin, LOW);
  }
  red = red/n;
  grn = grn/n;
  blu = blu/n;
}

Observe que no código acima,  leremos algumas vezes cada um dos componentes RGB, tomando uma média, para que com isso possamos reduzir o erro se algumas leituras forem ruins.

Uma vez de posse dos 3 componentes (RGB), deveremos definir a qual cor equivale. A maneira de fazê-lo é “calibrando-se” previamente o projeto. Você pode usar tanto papel quanto objetos com cores conhecidas e assim ler os 3 componentes gerados por este objeto.

Você pode começar com o meu set-up, mudando os parâmetros para o seu nível de luz:

void getColor()
{ 
 readRGB();
      if (red > 8 && red < 18 && grn > 9 && grn < 19 && blu > 8 && blu < 16) color = "WHITE";  else if (red > 80 && red < 125 && grn > 90 && grn < 125 && blu > 80 && blu < 125) color = "BLACK";  else if (red > 12 && red < 30 && grn > 40 && grn < 70 && blu > 33 && blu < 70) color = "RED";  else if (red > 50 && red < 95 && grn > 35 && grn < 70 && blu > 45 && blu < 85) color = "GREEN";  else if (red > 10 && red < 20 && grn > 10 && grn < 25 && blu > 20 && blu < 38) color = "YELLOW";  else if (red > 65 && red < 125 && grn > 65 && grn < 115 && blu > 32 && blu < 65) color = "BLUE";
 else color = "NO_COLOR";
}

Como você pode ver acima tenho predefinido 6 cores: Branco, Preto, Vermelho, Verde, Amarelo e Azul.

À medida que a luz ambiente diminui, os parâmetros tendem a aumentar de valor.

Dentro do loop (), definimos que as leituras são mostradas no LCD a cada 1 segundo.

O código completo pode ser encontrado no meu GitHub:

https://github.com/Mjrovai/Color-Detector

5: Conclusão

Como sempre, espero que este projeto possa ajudar outras pessoas a encontrar o seu caminho no excitante mundo da eletrônica, robótica e do IoT!

Por favor, visite o meu GitHub para arquivos atualizados: Color Detector

Não deixem de se inscrever no congresso on-line: Tudo sobre IoT, que acontecerá entre 5 e 8 de junho. Estarei fazendo a palestra: “A revolução Maker e o retorno dos dinossauros!” Nos vemos lá!
Iot Congress Banner MR
Saludos desde el sur del mundo!
Até o próximo post!
Um abraço e obrigado.
Marcelo
Anúncios

Autor: Marcelo Rovai

Engineer, writer and forever student. Passionate to share knowledge of electronics with focus on IoT and robotics.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s