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