Sensor de cor TCS34725 RGB

Descrición

É  un sensor de cor dixital capaz de medir os valores RGB da cor dun obxecto ou luz incidente, polo que será moito máis preciso có sensor TC3200.

Proporciona valores RGB e Clear (medición sen filtrar)

Funcionamento

O TCS34725 incorpora unha matriz de fotodíodos filtrados para vermello (R), verde (G) , azul (B) e sen filtro (clear), proporcionando unha medición de cor relativamente precisa, aínda que non perfecta.

[TCS34725 no microscopio. luisllamas.es]
O código de cores RGB, vermello-verde-azul, baséase na mestura destas tres cores para acadar toda a gama completa.

Se a cor RGB vai representada en código decimal, cada unha das tres cores vermella, verde e azul toma un valor entre 0 e 255 (256 valores en total), co que se consegue un total de 256 x 256 x 256 = 16.777.216 cores distintas.

Cando o valor RGB  represéntase en código hexadecimal o rango das cores RGB vai de 00 a FF para cada unha delas. O código da cor resultante da mestura exprésase así: #RRGGBB.

Cor RGB dec RGB hex
vermello 255,0,0 FF0000
verde 0,255,0 00FF00
azul 0,0,255 0000FF
maxenta 255,0,255 FF00FF
amarelo 255,255,0 FFFF00
ciano 0,255,255 00FFFF
branco 255,255,255 FFFFFF
negro 0,0,0 000000

Montaxe

A comunicación co sensor realízase por I2C, polo que chega con conectar os pins SDA (A4) e SCL (A5) e os pins de alimentación Vin (5V) e GND.

O pin LED controla o acendido do LED de luz neutra integrado no módulo. Pódese:

  • Deixalo sen conectar para mantelo sempre acendido.
  • Conectalo a GND para telo sempre apagado.
  • Conectar a un pin dixital e controlar o seu acendido e apagado con digitalWrite(pinLED, HIGH); e digitalWrite(pinLED, LOW);

Nós ímolo deixar desconectado.

Programa

Necesitamos a librería Adafruit_TCS34725 e a librería Wire para a comunicación I2C. Para a segunda práctica necesitamos a librería ColorConverterLib.

Podes descargalas directamente aquí: Adafruit_TCS34725.zip | Arduino-ColorConverter-master.zip

1. Ver RGB

Imos ver os valores dun sensor e mostralos na consola serie. Conectamos un pulsador para que a lectura se realice cando prememos nel.

#include <Wire.h>
#include "Adafruit_TCS34725.h"

const int pulsador = 2;

Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_4X);

void setup() {
  
  Serial.begin(9600);

  if (tcs.begin()) {
    Serial.println("Sensor atopado");
  }
  else {
    Serial.println("Sensor TCS34725 non atopado");
    while (1); // halt!
  }

}

void loop() {

  float red, green, blue;
  delay(60);  // takes 50ms to read

  tcs.getRGB(&red, &green, &blue);

  int estado=digitalRead(pulsador);
 
  if (estado == 1){ 
    while(digitalRead(pulsador)==1);  
    delay(20); 
  
    Serial.print("R:"); Serial.print(int(red));
    Serial.print(" G:"); Serial.print(int(green));
    Serial.print(" B:"); Serial.print(int(blue));
  
    Serial.print("\t");
    Serial.print(" HEX: "); Serial.print((int)red, HEX); Serial.print((int)green, HEX); Serial.print((int)blue, HEX);
    
    Serial.print("\n");
  }

}

2. Detectar Cor

No seguinte programa imos ver na consola que cor está a detectar o sensor.

#include <Wire.h>
#include "Adafruit_TCS34725.h"
#include <ColorConverterLib.h>

uint16_t redT, greenT, blueT, clearT;
float scaleRedT, scaleGreenT, scaleBlueT;
double nuanceT, saturationT, valueT;
String nameColorT;

Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_4X);

void setup() {
  
  Serial.begin(9600);

  if (tcs.begin()) {
    Serial.println("Sensor atopado");
  }
  else {
    Serial.println("Sensor TCS34725 non atopado");
    while (1); // halt!
  }

}

String printColorNameT() {
  
  if (nuanceT <= 15){
    return nameColorT = "Vermello";
  }
  else if (nuanceT <= 45){
    return nameColorT = "Laranxa";
  }
  else if (nuanceT <= 90){
    return nameColorT = "Amarelo";
  }
  else if (nuanceT <= 150){
    return nameColorT = "Verde";
  }
  else if (nuanceT <= 210){
    return nameColorT = "Ciano";
  }
  else if (nuanceT <= 270){
    return nameColorT = "Azul";
  }
  else if (nuanceT <= 330){
    return nameColorT = "Maxenta";
  }
  else{
    return nameColorT = "Vermello";
  }
  
}

void loop() {
  
  tcs.setInterrupt(false);
  delay(60);
  tcs.getRawData(&redT, &greenT, &blueT, &clearT);
  tcs.setInterrupt(true);

  scaleRedT = redT;
  scaleRedT = (scaleRedT / clearT ) * 255;

  scaleGreenT = greenT;
  scaleGreenT = (scaleGreenT / clearT ) * 255;

  scaleBlueT = blueT;
  scaleBlueT = (scaleBlueT / clearT ) * 255;

  ColorConverter::RgbToHsv(static_cast<uint16_t>(scaleRedT), static_cast<uint16_t>(scaleGreenT),
                           static_cast<uint16_t>(scaleBlueT), nuanceT, saturationT, valueT);

  nuanceT *= 360;
  Serial.println("Cor: " + printColorNameT() + "[" + String(nuanceT) + "]");
  delay(900);

  if (printColorNameT()=="Vermello"){
    Serial.println("atopado vermello");
  }

}

Propostas

  • Mostra agora na consola se a peza é vermella, amarela ou verde. Segundo sexa a cor fai que se acenda un LED da cor correspondente.
  • Proba o sensor con pezas de varias cores (vermello, azul, verde, …) e mostra na consola o valor RGB. Fai que un LED RGB imite a cor desas pezas.