Descrición

Un dos sensores de cor económicos existentes no mercado é o TCS3200, que é o que imos utilizar nesta práctica. Pódenos servir, por exemplo, para que un robot sexa quen de clasificar pezas en diferentes compartimentos, segundo a súa cor.
Funcionamento
Os TCS3200 son sensores que converten a intensidade da luz en frecuencia, sendo maior a frecuencia canto maior sexa a intensidade da luz incidente.

| Unha matriz de 64 fotodíodos é a encargada de medir a intensidade da luz que incide sobre ela. Os fotodíodos non funcionan de maneira simultánea, senón que se activan por separado para realizar medicións con filtro vermello, verde, azul e sen filtrar, obténdose unha medida para cada cor RGB. Os pins s2 e s3 do sensor son os que determinan con que filtro se realizará a medición, de fano da maneira que aparece na táboa da dereita. | s2 | s3 | modo | |
| LOW | LOW | vermello | ||
| LOW | HIGH | azul | ||
| HIGH | LOW | sen filtro | ||
| HIGH | HIGH | verde |
| O sensor ten un convertedor de corrente a frecuencia que converte as lecturas dos fotodíodos nunha onda cadrada cunha frecuencia que é proporcional á intensidade de luz reflectida pola cor do obxecto que medimos.
Os pins s0 e s1 do sensor encárganse de escalar a frecuencia de saída ao rango que desexemos. |
s0 | s1 | % frec |
|
| LOW | LOW | apagado | ||
| LOW | HIGH | 2% | ||
| HIGH | LOW | 20% | ||
| HIGH | HIGH | 100% |
Montaxe
| TCS3200 | Arduino | ![]() |
|
| s0 | pin 2 | ||
| s1 | pin 3 | ||
| s2 | pin 4 | ||
| s3 | pin 5 | ||
| OUT | pin 6 | ||
| OE | GND | ||
| GND | GND | ||
| VCC | VCC |
Programa
Para medir frecuencias Arduíno inclúe a función pulseIn(), que devolve o tempo que tarda en chegar un nivel a unha entrada dixital. Coa función cor() o que facemos é activar os fotodíodos correspondentes a cada cor RGB e escribir a lectura da frecuencia nas variables RGB creadas para tal fin.
Segundo os valores obtidos, identificaremos varias cores (vermello, azul, verde e amarelo). Podes modificar o programa para identificar outras diferentes.
Ten en conta que os valores obtidos son frecuencias, e non se trata de cores RGB.
// Declaración de variables
// Pins de conexión
const int s0 = 2;
const int s1 = 3;
const int s2 = 4;
const int s3 = 5;
const int out = 6;
// frec_uencias RGB
int frec_vermello = 0;
int frec_verde = 0;
int frec_azul = 0;
// Configuración
void setup(){
Serial.begin(9600); // Comunicación consola serie
pinMode(s0,OUTPUT);
pinMode(s1,OUTPUT);
pinMode(s2,OUTPUT);
pinMode(s3,OUTPUT);
pinMode(out,INPUT);
digitalWrite(s0,HIGH); // escala de frec_uencia 100%
digitalWrite(s1,HIGH);
}
// Programa
// Función que realiza a lectura RGB
void cor() {
// lectura vermello
digitalWrite(s2, LOW);
digitalWrite(s3, LOW);
frec_vermello = pulseIn(out, LOW);
// lectura azul
digitalWrite(s2, LOW);
digitalWrite(s3, HIGH);
frec_azul = pulseIn(out, LOW);
// lectura verde
digitalWrite(s2, HIGH);
digitalWrite(s3, HIGH);
frec_verde = pulseIn(out, LOW);
}
// Programa que identifica as cores que se detectan
void loop(){
cor();
// escribe na consola os valores RGB
Serial.print(" R=");
Serial.print(frec_vermello);
Serial.print(" G=");
Serial.print(frec_verde);
Serial.print(" B=");
Serial.print(frec_azul);
// identifica cores
if (frec_vermello<frec_azul && frec_verde>frec_azul && frec_vermello<frec_verde && frec_vermello<20) {
Serial.println(" --> vermello");
}
else if (frec_azul<frec_vermello && frec_azul<frec_verde && frec_verde<frec_vermello) {
Serial.println(" --> Azul");
}
else if (frec_vermello>frec_verde && frec_azul>frec_verde) {
Serial.println(" --> Verde");
}
else if (frec_vermello<frec_verde && frec_verde<frec_azul && frec_verde<10) {
Serial.println(" --> Amarelo");
}
else{
Serial.println(" ");
}
delay(800);
}
Propostas
- Modifica o necesario para que o sensor detecte pezas de diferentes cores que teñas no taller.
- Fai que cando detecte unha peza vermella se acenda un LED vermello, cando detecte unha peza amarela se acenda un LED vermello e cando detecte unha peza verde se acenda un LED verde.
