Sensor de cor TCS3200

Descrición

[TCS3200 tecnoloxia.org CC By-SA]
Se ben cun octoacoplador podemos distinguir cores pola intensidade da luz reflectida, non soen ser moi fiables se non hai moita diferenza entre a luz que reflicten as cores das pezas que queremos identificar, polo que mellor é deixalos para distinguir entre branco e negro e usar outro dispositivo para distinguir outras cores, como verde, azul, amarelo, etc.

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.

[TCS3200 tecnoloxia.org CC By-SA]
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 
[TCS3200 tecnoloxia.org CC By-SA]
 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

  1. Modifica o necesario para que o sensor detecte pezas de diferentes cores que teñas no taller.
  2. 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.

Deixa un comentario