Arduino UNO R4 - Sensor de Cor TCS3200D/TCS230

Este guia vai mostrar como usar o Arduino UNO R4 e o módulo sensor de reconhecimento de cor TCS3200D/TCS230 para calibrar e ler valores RGB de objetos e detectar cores.

Tutorial do Arduino UNO R4 com módulo sensor de reconhecimento de cor TCS3200D TCS230

Sobre o Sensor de Cor TCS3200D/TCS230

O TCS3200D/TCS230 é um módulo sensor de reconhecimento de cor que usa uma matriz 8x8 de fotodiodos. Dezesseis fotodiodos têm filtros vermelhos, 16 têm filtros verdes, 16 têm filtros azuis e 16 são transparentes (sem filtro). O módulo converte a intensidade da luz em um sinal de frequência de onda quadrada. Ao alternar os filtros de cor e medir a frequência de saída (ou a largura de pulso), podemos estimar os valores RGB de um objeto.

Muitos módulos incluem LEDs brancos para iluminar o alvo. Isso deixa as leituras mais consistentes e ajuda o sensor a detectar cores de forma confiável, mesmo com pouca luz.

Pinagem

O módulo do sensor de cor TCS3200D/TCS230 normalmente tem estes pinos:

  • Pino VCC: Conecte este pino ao VCC (5V).
  • Pino GND: Conecte este pino ao GND (0V).
  • Pinos S0, S1: Seleção da escala da frequência de saída.
  • Pinos S2, S3: Seleção do filtro de cor.
  • Pino OUT: Saída de frequência de onda quadrada.
  • Pino OE: Habilitação da saída (ativo em LOW). A maioria dos módulos já conecta este pino ao GND internamente, então você não precisa ligá-lo. Se o seu não faz isso, conecte-o ao GND.
Diagrama da pinagem do módulo sensor de cor TCS3200 TCS230 mostrando os pinos VCC GND S0 S1 S2 S3 OUT

Como Funciona

É preciso dizer duas coisas ao sensor: qual canal de cor medir e qual intensidade dar ao sinal de saída. Dois pares de pinos de controle cuidam disso:

  • S0 e S1 controlam a escala da frequência de saída:
  • S0 = LOW, S1 = LOW: Desligado
  • S0 = LOW, S1 = HIGH: escala de 2%
  • S0 = HIGH, S1 = LOW: escala de 20%
  • S0 = HIGH, S1 = HIGH: escala de 100%
  • S2 e S3 selecionam o filtro de cor:
  • S2 = LOW, S3 = LOW: Filtro vermelho
  • S2 = LOW, S3 = HIGH: Filtro azul
  • S2 = HIGH, S3 = LOW: Transparente (sem filtro)
  • S2 = HIGH, S3 = HIGH: Filtro verde

O pino OUT emite uma onda quadrada (normalmente de 2 Hz a 500 kHz). A frequência é proporcional à intensidade da cor selecionada, enquanto a largura de pulso é inversamente proporcional. Podemos medir a largura de pulso usando pulseIn() e depois convertê-la em valores RGB após a calibração.

Dicas para Leituras Estáveis

  • Coloque o sensor a 1-3 cm do objeto e mantenha o ângulo constante.
  • Use os LEDs brancos embutidos para fornecer uma iluminação estável.
  • Proteja o sensor das mudanças de luz ambiente para obter resultados mais precisos.

Diagrama de Ligação

Esta imagem mostra como conectar o sensor de cor TCS3200 ao Arduino UNO R4:

Sensor de Cor TCS3200Arduino UNO R4
VCC5V
GNDGND
S0Pino 4
S1Pino 3
S2Pino 6
S3Pino 5
OUTPino 7
Diagrama de ligação do Arduino UNO R4 e do sensor de cor TCS3200 mostrando a conexão entre os pinos

This image is created using Fritzing. Click to enlarge image

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

Código Arduino UNO R4 - Calibração (Largura de Pulso)

A calibração é necessária porque as leituras brutas do sensor são afetadas pelo ambiente. Fatores como o brilho do LED, a distância, a refletividade da superfície e a luz ambiente mudam os valores medidos. Você pode pensar nesses efeitos como “ruído”. O primeiro passo da calibração ajuda você a medir a faixa desse ruído (mínimo e máximo de cada cor) para que você possa subtrair a influência dele e mapear as leituras para valores RGB corretos de 0–255 para a sua montagem.

/* * Este código de Arduino UNO R4 foi desenvolvido por pt.newbiely.com * Este código de Arduino UNO R4 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-uno-r4/arduino-uno-r4-tcs3200d-tcs230-color-sensor */ // Define color sensor pins #define S0 4 #define S1 3 #define S2 6 #define S3 5 #define 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(S0, OUTPUT); pinMode(S1, OUTPUT); pinMode(S2, OUTPUT); pinMode(S3, OUTPUT); // Set Pulse Width scaling to 20% digitalWrite(S0, HIGH); digitalWrite(S1, LOW); // Set Sensor output as input pinMode(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 current readings Serial.print("Red PW = "); Serial.print(redPW); Serial.print(" - Green PW = "); Serial.print(greenPW); Serial.print(" - Blue PW = "); Serial.println(bluePW); // Print current min/max 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("------------------------------------------"); } // Function to read Red Pulse Widths int getRedPW() { // Set sensor to read Red only digitalWrite(S2, LOW); digitalWrite(S3, LOW); // Define integer to represent Pulse Width int PW; // Read the output Pulse Width PW = pulseIn(sensorOut, LOW); // Return the value return PW; } // Function to read Green Pulse Widths int getGreenPW() { // Set sensor to read Green only digitalWrite(S2, HIGH); digitalWrite(S3, HIGH); // Define integer to represent Pulse Width int PW; // Read the output Pulse Width PW = pulseIn(sensorOut, LOW); // Return the value return PW; } // Function to read Blue Pulse Widths int getBluePW() { // Set sensor to read Blue only digitalWrite(S2, LOW); digitalWrite(S3, HIGH); // Define integer to represent Pulse Width int PW; // Read the output Pulse Width PW = pulseIn(sensorOut, LOW); // Return the value return PW; }

Passos Rápidos

Siga estas instruções passo a passo:

  • Se esta é a sua primeira vez usando o Arduino Uno R4 WiFi/Minima, consulte o tutorial sobre como configurar o ambiente para o Arduino Uno R4 WiFi/Minima na Arduino IDE.
  • Conecte a placa Arduino Uno R4 ao sensor de cor conforme o diagrama fornecido.
  • Conecte a placa Arduino Uno R4 ao seu computador usando um cabo USB.
  • Abra a Arduino IDE no seu computador.
  • Selecione a placa Arduino Uno R4 apropriada (por exemplo, Arduino Uno R4 WiFi) e a porta COM.
  • Copie o código acima e abra-o na Arduino IDE.
  • Clique no botão Upload na Arduino IDE para fazer o upload do código para o Arduino UNO R4.
  • Abra o Serial Monitor. Você verá leituras contínuas junto com os valores Min e Max.
  • Passe o sensor sobre objetos diferentes: um objeto branco (como papel), um objeto preto e, se quiser, alguns objetos coloridos.
  • Veja as linhas Min e Max serem atualizadas automaticamente enquanto o sensor acompanha os extremos.
  • Quando os valores Min e Max pararem de mudar (normalmente depois de 10-20 segundos), esses são os seus valores de calibração - anote-os.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno R4 WiFi
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno R4 WiFi' 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 Uno R4 WiFi on COM15
2

Por exemplo, a partir da saída acima, os seus valores de calibração seriam:

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

Código Arduino UNO R4 - Ler os valores RGB

/* * Este código de Arduino UNO R4 foi desenvolvido por pt.newbiely.com * Este código de Arduino UNO R4 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-uno-r4/arduino-uno-r4-tcs3200d-tcs230-color-sensor */ // Define color sensor pins #define S0 4 #define S1 3 #define S2 6 #define S3 5 #define sensorOut 7 // Calibration Values // *Get these from the Calibration Sketch 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 RGB values int redValue = 0; int greenValue = 0; int blueValue = 0; void setup() { // Set S0 - S3 as outputs pinMode(S0, OUTPUT); pinMode(S1, OUTPUT); pinMode(S2, OUTPUT); pinMode(S3, OUTPUT); // Set Pulse Width scaling to 20% digitalWrite(S0, HIGH); digitalWrite(S1, LOW); // Set Sensor output as input pinMode(sensorOut, INPUT); // Setup Serial Monitor Serial.begin(9600); } void loop() { // Read Red Pulse Width redPW = getRedPW(); // Map to value from 0-255 redValue = map(redPW, redMin, redMax, 255, 0); // Delay to stabilize sensor delay(200); // Read Green Pulse Width greenPW = getGreenPW(); // Map to value from 0-255 greenValue = map(greenPW, greenMin, greenMax, 255, 0); // Delay to stabilize sensor delay(200); // Read Blue Pulse Width 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(S2, LOW); digitalWrite(S3, LOW); // Define integer to represent Pulse Width int PW; // Read the output Pulse Width PW = pulseIn(sensorOut, LOW); // Return the value return PW; } // Function to read Green Pulse Widths int getGreenPW() { // Set sensor to read Green only digitalWrite(S2, HIGH); digitalWrite(S3, HIGH); // Define integer to represent Pulse Width int PW; // Read the output Pulse Width PW = pulseIn(sensorOut, LOW); // Return the value return PW; } // Function to read Blue Pulse Widths int getBluePW() { // Set sensor to read Blue only digitalWrite(S2, LOW); digitalWrite(S3, HIGH); // Define integer to represent Pulse Width int PW; // Read the output Pulse Width PW = pulseIn(sensorOut, LOW); // Return the value return PW; }

Passos Rápidos

  • No código acima, encontre estas linhas perto do início:
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 TODOS os seis valores 0 pelos seus números de calibração do passo anterior. Por exemplo, se a sua calibração deu redMin = 42, redMax = 210, greenMin = 55, greenMax = 185, blueMin = 60, blueMax = 172, mude as linhas para:
int redMin = 42; int redMax = 210; int greenMin = 55; int greenMax = 185; int blueMin = 60; int blueMax = 172;
  • Faça o upload do código para o Arduino UNO R4.
  • Coloque um objeto colorido na frente do sensor.
  • Confira o resultado no Serial Monitor.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno R4 WiFi
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno R4 WiFi' 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 Uno R4 WiFi on COM15
2

Os valores RGB agora estão mapeados para a faixa padrão de 0-255. Larguras de pulso menores (mais luz) produzem valores RGB maiores, e larguras de pulso maiores (menos luz) produzem valores RGB menores.

Aplicações

Agora que você consegue ler valores RGB, você pode criar projetos como:

  • Separador de cores: Separe objetos por cor (vermelho, verde, azul)
  • Jogo de combinação de cores: Verifique se dois objetos têm a mesma cor
  • Robô seguidor de linha: Siga linhas coloridas no chão
  • Controle de qualidade: Detecte produtos defeituosos pela cor
  • Alarme ativado por cor: Acione um buzzer ou um LED quando uma cor específica for detectada

Vídeo

※ 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!