30. Color detection

Mål: Att kunna använda TCS3200 sensorn för färgigenkänning.

Teorin: Sensorn består av en del fotoresistorer som är känsliga för olika våglängder (färger) . Om t.ex. rött ljus träffar sensorn kommer motsvarande resistorer att reagera. Frekvensen för röd färg omvandlas till fyrkantsvåg (PWM – pulse width modulation) som Arduinon kan avläsa med pulseIn funktionen. Samma gäller grön, blå och vit färg.

Sensorn verkar vara väldigt känslig till bakgrundsbelysningen så därför har vi valt att använda en bit av wc-pappersrulle för att isolera sensorn.


Arduino koden

/*  
Color detection by Wilbur Smith. 

Sensor    Arduino
VCC   ---   5V
GND   ---   GND
S0    ---   pin4
S1    ---   pin5
OE    ---   GND
S2    ---   pin6
S3    ---   pin7
OUT   ---   pin9

 */
 
#define S0 4
#define S1 5
#define S2 6
#define S3 7
#define sensorOut 8
int Rfrequency = 0;
int Gfrequency = 0;
int Bfrequency = 0;
int frequency = 0;
int readings = 0;

void setup() 
  {
    pinMode(S0, OUTPUT);
    pinMode(S1, OUTPUT);
    pinMode(S2, OUTPUT);
    pinMode(S3, OUTPUT);
    pinMode(sensorOut, INPUT);
    digitalWrite(S0,LOW);
    digitalWrite(S1,LOW);
    delay(1000);
 // Set frequency scaling to 20%
    digitalWrite(S0,HIGH);
    digitalWrite(S1,LOW);
    Serial.begin(9600);
  }
  
void loop() {
  
// ..... RED reading .................................
 
     digitalWrite(S2,LOW);
     digitalWrite(S3,LOW);
  
     for (int i = 0; i < 10; i++)   // for smoothing
     {
     frequency = pulseIn(sensorOut, LOW);
     readings = readings + frequency;
     delay(10);
     }
     Rfrequency = readings / 8;
     readings = 0;     // reset readings variable  
 //  Serial.print("R= ");
 //  Serial.print(Rfrequency);
 //  Serial.print("  ");
  

// ..... GREEN reading ................................

    digitalWrite(S2,HIGH);
    digitalWrite(S3,HIGH);
      
    for (int i = 0; i < 10; i++)  // for smoothing
    {
    frequency = pulseIn(sensorOut, LOW);
    readings = readings + frequency;
    delay(10);
    }
    Gfrequency = readings / 8;
    readings = 0;     // reset readings variable  
      
 // Serial.print("G= ");
 // Serial.print(Gfrequency);
 // Serial.print("  ");
  
  
// ..... BLUE reading ..................................

    digitalWrite(S2,LOW);
    digitalWrite(S3,HIGH);
  
    for (int i = 0; i < 10; i++)  // for smoothing
    {
    frequency = pulseIn(sensorOut, LOW);
    readings = readings + frequency;
    delay(10);
    }
    Bfrequency = readings / 8;
    readings = 0;     // reset readings variable  
    
 // Serial.print("B= ");
 // Serial.print(Bfrequency);
 // Serial.println("  ");
  
    

// ..... Check for conditions............................

if(Rfrequency > 25 && Rfrequency < 60 && Gfrequency >90 && Gfrequency< 130 && Bfrequency >80 && Bfrequency< 120 )
  {
    Serial.println("RED");
    delay(1000);
  }
else if(Rfrequency > 55 && Rfrequency < 100 && Gfrequency >55 && Gfrequency< 105 && Bfrequency >80 && Bfrequency< 130 )
  {
    Serial.println("GREEN");
    delay(1000);
  }
else if(Rfrequency > 40 && Rfrequency < 80 && Gfrequency >40 && Gfrequency< 90 && Bfrequency >35 && Bfrequency< 80 )
  {
    Serial.println("BLUE"); 
    delay(1000);
  } 
else{}

}

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s