Arduino Nano - TCS3200D/TCS230 Color Sensor

Este guia completo mostra como conectar o sensor de cor TCS3200D/TCS230 ao Arduino Nano para medir cores com precisão e extrair valores RGB. Domine os procedimentos de calibração e desenvolva recursos de reconhecimento de cores nos seus projetos.

Objetivos de aprendizado:

Arduino Nano with TCS3200D TCS230 color recognition sensor module tutorial

Hardware Necessário

1×Official Arduino Nano
1×Alternatively, DIYables Nano V3.0 Development Board
1×Cabo USB A para Mini-B
1×TCS3200D/TCS230 Color Recognition Sensor Module
1×Protoboard
1×Fios Jumper
1×(Recomendado) Placa de Expansão com Bornes de Parafuso para Arduino Nano
1×(Recomendado) Placa de Expansão Breakout para Arduino Nano
1×(Recomendado) Divisor de Alimentação para Arduino Nano

Or you can buy the following kits:

1×DIYables Sensor Kit (18 sensors/displays)
Divulgação: Alguns dos links desta seção são links de afiliado da Amazon. Podemos receber uma comissão pelas compras feitas por meio desses links, sem custo adicional para você. Agradecemos o seu apoio.

Sobre o Sensor de Cor TCS3200D/TCS230

O sensor TCS3200D/TCS230 usa uma matriz de fotodiodos organizada em uma grade 8×8 para detectar cores por meio de filtragem óptica. Nesse conjunto de 64 elementos, 16 fotodiodos têm filtros espectrais vermelhos, outros 16 usam filtros verdes, 16 empregam filtros azuis e os 16 restantes operam sem filtros (resposta clara). A medição de cor acontece ativando conjuntos de filtros específicos e analisando a onda quadrada modulada em frequência da saída.

Os arranjos de LEDs brancos embutidos nos módulos típicos fornecem iluminação constante aos objetos, mantendo a estabilidade da leitura apesar das variações da luz externa e melhorando o desempenho em ambientes escuros.

Pinagem

Conexões disponíveis na placa do sensor TCS3200D/TCS230:

  • Pino VCC: Entrada da tensão de alimentação (+5V).
  • Pino GND: Referência de terra (0V).
  • Pinos S0, S1: Seletores de escala da frequência de saída.
  • Pinos S2, S3: Seletores do filtro do canal de cor.
  • Pino OUT: Saída de onda quadrada modulada em frequência.
  • Pino OE: Entrada de habilitação da saída (habilita em LOW). Os módulos padrão normalmente ligam este pino ao GND internamente. Se ele não estiver conectado, ligue-o manualmente ao GND.
TCS3200 TCS230 color sensor module pinout diagram showing VCC GND S0 S1 S2 S3 OUT pins

Como Funciona

Duas configurações críticas controlam o comportamento do sensor: qual canal de cor ativar e qual intensidade de sinal de saída gerar. Dois pares de entradas de controle gerenciam essas funções:

Controle da escala de frequência (pinos S0 e S1):

  • S0=LOW, S1=LOW: Estado desligado
  • S0=LOW, S1=HIGH: Fator de escala de 2%
  • S0=HIGH, S1=LOW: Fator de escala de 20%
  • S0=HIGH, S1=HIGH: Fator de escala de 100% (velocidade total)

Seleção do canal de cor (pinos S2 e S3):

  • S2=LOW, S3=LOW: Fotodiodos vermelhos ativos
  • S2=LOW, S3=HIGH: Fotodiodos azuis ativos
  • S2=HIGH, S3=LOW: Fotodiodos claros ativos (sem filtragem)
  • S2=HIGH, S3=HIGH: Fotodiodos verdes ativos

O pino OUT fornece ondas quadradas com frequências na faixa aproximada de 2 Hz a 500 kHz. A frequência aumenta com a intensidade da luz: uma iluminação mais forte produz uma saída de frequência mais alta. A função pulseIn() mede a duração do pulso, que tem correlação inversa: durações mais curtas indicam luz mais forte. As medições calibradas são convertidas para o formato RGB convencional de 0-255.

Como Obter a Melhor Precisão

  • Mantenha o sensor a 1-3 cm do objeto a ser medido, com alinhamento angular estável.
  • Use a iluminação de LED branco integrada para ter uma luz repetível.
  • Proteja o sensor da luz ambiente variável para melhorar a consistência da medição.

Diagrama de Ligação

Configuração de ligação do sensor de cor TCS3200 ao Arduino Nano:

Sensor de Cor TCS3200Arduino Nano
VCC5V
GNDGND
S0D4
S1D3
S2D6
S3D5
OUTD7
The wiring diagram between Arduino Nano and and TCS3200 color sensor  showing connection between pins

This image is created using Fritzing. Click to enlarge image

Veja A melhor forma de alimentar o Arduino Nano e outros componentes.

Código Arduino Nano - Calibração da Largura de Pulso

A calibração elimina a interferência do ambiente nas medições brutas. Variáveis como a intensidade do LED, a distância do objeto, a refletividade do material e a iluminação da sala afetam as leituras. Pense nelas como erros sistemáticos que precisam ser medidos. A rotina de calibração identifica as larguras de pulso mínima e máxima em todos os canais de cor, estabelecendo limites de referência para converter os dados brutos em valores RGB precisos de 0–255, ajustados ao seu ambiente de uso.

/* * Este código de Arduino Nano foi desenvolvido por pt.newbiely.com * Este código de Arduino Nano é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-nano/arduino-nano-tcs3200d-tcs230-color-sensor */ // Define color sensor pins #define PIN_S0 4 #define PIN_S1 3 #define PIN_S2 6 #define PIN_S3 5 #define PIN_sensorOut 7 // Variables for Color Pulse Width Measurements int redPW = 0; int greenPW = 0; int bluePW = 0; // Variables to track min and max pulse widths for calibration int redMin = 10000, redMax = 0; int greenMin = 10000, greenMax = 0; int blueMin = 10000, blueMax = 0; void setup() { // Set S0 - S3 as outputs pinMode(PIN_S0, OUTPUT); pinMode(PIN_S1, OUTPUT); pinMode(PIN_S2, OUTPUT); pinMode(PIN_S3, OUTPUT); // Set Pulse Width scaling to 20% digitalWrite(PIN_S0, HIGH); digitalWrite(PIN_S1, LOW); // Set Sensor output as input pinMode(PIN_sensorOut, INPUT); // Setup Serial Monitor Serial.begin(9600); Serial.println("=== TCS3200 Calibration ==="); Serial.println("Point the sensor at different objects (white, black, colors)."); Serial.println("Min and Max values are tracked automatically."); Serial.println("When values look stable, note them down for the next code."); Serial.println("------------------------------------------"); } void loop() { // Read Red Pulse Width redPW = getRedPW(); // Delay to stabilize sensor delay(200); // Read Green Pulse Width greenPW = getGreenPW(); // Delay to stabilize sensor delay(200); // Read Blue Pulse Width bluePW = getBluePW(); // Delay to stabilize sensor delay(200); // Update min and max values if (redPW < redMin) redMin = redPW; if (redPW > redMax) redMax = redPW; if (greenPW < greenMin) greenMin = greenPW; if (greenPW > greenMax) greenMax = greenPW; if (bluePW < blueMin) blueMin = bluePW; if (bluePW > blueMax) blueMax = bluePW; // Print the pulse width values with min/max Serial.print("Red PW = "); Serial.print(redPW); Serial.print(" - Green PW = "); Serial.print(greenPW); Serial.print(" - Blue PW = "); Serial.println(bluePW); Serial.print(" Min -> R:"); Serial.print(redMin); Serial.print(" G:"); Serial.print(greenMin); Serial.print(" B:"); Serial.println(blueMin); Serial.print(" Max -> R:"); Serial.print(redMax); Serial.print(" G:"); Serial.print(greenMax); Serial.print(" B:"); Serial.println(blueMax); Serial.println("------------------------------------------"); delay(1000); } // Function to read Red Pulse Widths int getRedPW() { // Set sensor to read Red only digitalWrite(PIN_S2, LOW); digitalWrite(PIN_S3, LOW); // Read the Pulse Width int PW = pulseIn(PIN_sensorOut, LOW); // Return the value return PW; } // Function to read Green Pulse Widths int getGreenPW() { // Set sensor to read Green only digitalWrite(PIN_S2, HIGH); digitalWrite(PIN_S3, HIGH); // Read the Pulse Width int PW = pulseIn(PIN_sensorOut, LOW); // Return the value return PW; } // Function to read Blue Pulse Widths int getBluePW() { // Set sensor to read Blue only digitalWrite(PIN_S2, LOW); digitalWrite(PIN_S3, HIGH); // Read the Pulse Width int PW = pulseIn(PIN_sensorOut, LOW); // Return the value return PW; }

Passos Rápidos

  • Carregue o sketch de calibração no Arduino IDE
  • Conecte o Arduino Nano via USB e faça o upload usando o botão Upload
  • Abra o Serial Monitor para observar o acompanhamento de Min/Max em tempo real
  • Exponha o sensor a superfícies variadas: materiais brancos (papel de impressora), objetos pretos e itens de várias cores
  • Veja os limites Min/Max serem atualizados automaticamente conforme os extremos são detectados
  • Quando os valores estabilizarem (geralmente em 10-20 segundos), anote os seis parâmetros de calibração
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Nano
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano' on 'COM15')
New Line
9600 baud
=== TCS3200 Calibration === Point the sensor at different objects (white, black, colors). Min and Max values are tracked automatically. When values look stable, note them down for the next code. ------------------------------------------ Red PW = 42 - Green PW = 55 - Blue PW = 60 Min -> R:42 G:55 B:60 Max -> R:42 G:55 B:60 ------------------------------------------ Red PW = 210 - Green PW = 185 - Blue PW = 172 Min -> R:42 G:55 B:60 Max -> R:210 G:185 B:172 ------------------------------------------ Red PW = 44 - Green PW = 57 - Blue PW = 61 Min -> R:42 G:55 B:60 Max -> R:210 G:185 B:172 ------------------------------------------
Ln 11, Col 1
Arduino Nano on COM15
2

Exemplo de parâmetros de calibração extraídos da saída acima:

  • RedMin = 42, redMax = 210
  • GreenMin = 55, greenMax = 185
  • BlueMin = 60, blueMax = 172

Código Arduino Nano - Medição de Valores RGB

/* * Este código de Arduino Nano foi desenvolvido por pt.newbiely.com * Este código de Arduino Nano é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-nano/arduino-nano-tcs3200d-tcs230-color-sensor */ // Define color sensor pins #define PIN_S0 4 #define PIN_S1 3 #define PIN_S2 6 #define PIN_S3 5 #define PIN_sensorOut 7 // Calibration Values // Replace these values with your actual calibration data from the previous step int redMin = 0; // Red minimum pulse width int redMax = 0; // Red maximum pulse width int greenMin = 0; // Green minimum pulse width int greenMax = 0; // Green maximum pulse width int blueMin = 0; // Blue minimum pulse width int blueMax = 0; // Blue maximum pulse width // Variables for Color Pulse Width Measurements int redPW = 0; int greenPW = 0; int bluePW = 0; // Variables for final Color values int redValue; int greenValue; int blueValue; void setup() { // Set S0 - S3 as outputs pinMode(PIN_S0, OUTPUT); pinMode(PIN_S1, OUTPUT); pinMode(PIN_S2, OUTPUT); pinMode(PIN_S3, OUTPUT); // Set Pulse Width scaling to 20% digitalWrite(PIN_S0, HIGH); digitalWrite(PIN_S1, LOW); // Set Sensor output as input pinMode(PIN_sensorOut, INPUT); // Setup Serial Monitor Serial.begin(9600); } void loop() { // Read Red value redPW = getRedPW(); // Map to value from 0-255 redValue = map(redPW, redMin, redMax, 255, 0); // Delay to stabilize sensor delay(200); // Read Green value greenPW = getGreenPW(); // Map to value from 0-255 greenValue = map(greenPW, greenMin, greenMax, 255, 0); // Delay to stabilize sensor delay(200); // Read Blue value bluePW = getBluePW(); // Map to value from 0-255 blueValue = map(bluePW, blueMin, blueMax, 255, 0); // Delay to stabilize sensor delay(200); // Print output to Serial Monitor Serial.print("Red = "); Serial.print(redValue); Serial.print(" - Green = "); Serial.print(greenValue); Serial.print(" - Blue = "); Serial.println(blueValue); } // Function to read Red Pulse Widths int getRedPW() { // Set sensor to read Red only digitalWrite(PIN_S2, LOW); digitalWrite(PIN_S3, LOW); // Read the Pulse Width int PW = pulseIn(PIN_sensorOut, LOW); // Return the value return PW; } // Function to read Green Pulse Widths int getGreenPW() { // Set sensor to read Green only digitalWrite(PIN_S2, HIGH); digitalWrite(PIN_S3, HIGH); // Read the Pulse Width int PW = pulseIn(PIN_sensorOut, LOW); // Return the value return PW; } // Function to read Blue Pulse Widths int getBluePW() { // Set sensor to read Blue only digitalWrite(PIN_S2, LOW); digitalWrite(PIN_S3, HIGH); // Read the Pulse Width int PW = pulseIn(PIN_sensorOut, LOW); // Return the value return PW; }

Passos Rápidos

  • Identifique as variáveis de calibração no início do código:
int redMin = 0; // Red minimum pulse width int redMax = 0; // Red maximum pulse width int greenMin = 0; // Green minimum pulse width int greenMax = 0; // Green maximum pulse width int blueMin = 0; // Blue minimum pulse width int blueMax = 0; // Blue maximum pulse width
  • Substitua os seis valores zero pelos dados de calibração medidos. Exemplo usando os valores redMin = 42, redMax = 210, greenMin = 55, greenMax = 185, blueMin = 60, blueMax = 172:
int redMin = 42; int redMax = 210; int greenMin = 55; int greenMax = 185; int blueMin = 60; int blueMax = 172;
  • Transfira o código atualizado para o Arduino Nano
  • Coloque uma amostra colorida na frente do sensor
  • Veja a saída RGB no Serial Monitor
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Nano
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano' on 'COM15')
New Line
9600 baud
Red = 210 - Green = 35 - Blue = 20 Red = 25 - Green = 200 - Blue = 40 Red = 30 - Green = 45 - Blue = 215
Ln 11, Col 1
Arduino Nano on COM15
2

Os valores RGB exibidos seguem a escala padrão de 0-255. Larguras de pulso menores (indicando reflexos mais brilhantes) geram saídas RGB maiores; larguras de pulso maiores (reflexos mais fracos) geram valores menores.

Aplicações do Projeto

Com a medição RGB funcionando, você pode desenvolver:

  • Sistema de separação por cores: Classificar objetos por cor (diferenciação entre vermelho/verde/azul)
  • Dispositivo de verificação de cor: Confirmar a consistência de cor entre amostras
  • Seguidor de trajeto colorido: Robôs que navegam seguindo marcas coloridas
  • Inspeção visual de qualidade: Detectar defeitos de produção por meio da análise de cor
  • Automação acionada por cor: Executar ações quando tons específicos são detectados

Vídeo

Referências de Funções

Tutoriais Relacionados

※ NOSSAS MENSAGENS

  • Fique à vontade para compartilhar o link deste tutorial. Porém, por favor, não use nosso conteúdo em outros sites. Investimos muito esforço e tempo para criar este conteúdo, por favor respeite nosso trabalho!