Esse conteúdo tem como objetivo construir um mecanismo simples que tenha a capacidade de detectar cores e aplicar essa funcionalidade dentro de uma oficina de experimentação da robótica.

As cores 

Definir cor cientificamente pode ser algo um pouco complicado já que teríamos de tratar sobre espectros, comprimentos de onda, frequencia, fótons e etc, entretando, desde muito pequenos somos acostumados a caracterizar um objeto partir de suas cores.
As cores existem em sua maior variação e podem ser obtidas a partir combinação de cores denominadas como primárias (padrão RGB).

Padrão RGB 

O padrão RGB (abreviação das cores Vermelho, Verde e Azul do inglês) consiste no sistema de cores em que as outras cores são derivadas dessas primárias.
Ex.: Podemos combinar as cores Verde + Vermelho e obter a coloração Amarela, e a depender da "quantidade" de Verde e Vermelho que eu utilizar nessa "mistura", vou poder encontrar outras variações do amarelo.
Dessa forma, se eu souber as "quantidades" de cores nessa mistura, eu vou ter aproximadamente uma noção de que cor eu terei como resultado.

 



Detector de Cores

Para construir o detector de cores, nós iremos utilizar um LDR (Light Dependent Resistor) que é um sensor capaz de perceber a intensidade da luz, e LED's RGB, que são leds específicos que possuem em um só, as três cores juntas.


Mecanismo de Detecção

O funcionamento do detector é simples. Como o LDR tem sensibilidade á luz , quando eu os três leds piscam num intervalo pequeno de tempo e em seguida colocar uma superfície colorida sobre o LDR, teremos um valor associado à essa leitura.

Ex.: Imaginemos que temos esse dispositivo funcionando de forma boa, então coloco uma superfície vermelha sobre ele e vou ter como valor retornado o Número "40".

Se eu fizer esse mesmo teste para outras cores, terei como retorno valores diferentes, então temos que para cada cor, o dispositivo verifica um valor, e assim, podemos dizer que aquele valor corresponde a uma cor.

Material

-Arduino,
- 2 leds RGB ,
- 1 Resistor de 10K ohm,

- 1 Resistor de 470K ohm,
- Fios Jumpers,
- Placa de Ilha (para soldagem) ou protoboard,
- 1 sensor LDR,
-  2 placas de nylon 12x11 cm,

- 2 placas de nylon 35x50 mm,
- 4 parafusos Grandes,

- 12 porcas, 

- 1 bateria 9v,

- Fita isolante para envolver as placas de nylon menores.


Montagem do Circuito






Código 


//Definir os Leds 
int ledArray[] = {2,3,4};
int red1 = 5;
int green1 = 6;
int blue1 = 7;

//variável que verifica se o sensor foi calibrado
boolean balanceSet = false;




float colourArray[] = {0,0,0};
float whiteArray[] = {0,0,0};
float blackArray[] = {0,0,0};


int avgRead;

void setup(){
 
  //Declaração dos pinos como de saída
  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
 
  //inicia a comunicação serial
  Serial.begin(9600);
 
}

void loop(){

    checkBalance();
    checkColour();
    printColour();
    }
 
void checkBalance(){
  if(balanceSet == false){
    setBalance();
  }
}

void setBalance(){
  //Calibrando o branco!
   delay(5000);                              
  for(int i = 0;i<=2;i++){
     digitalWrite(ledArray[i],HIGH);
     delay(100);
     getReading(5);          
     whiteArray[i] = avgRead;
     digitalWrite(ledArray[i],LOW);
     delay(100);
  }
 
   //Calibrando o preto!
    delay(5000);              
  for(int i = 0;i<=2;i++){
     digitalWrite(ledArray[i],HIGH);
     delay(100);
     getReading(5);
     blackArray[i] = avgRead;
     digitalWrite(ledArray[i],LOW);
     delay(100);
  }
   //Avisa que a calibragem foi feita
  balanceSet = true;
  delay(5000);     
  }

void checkColour(){
    for(int i = 0;i<=2;i++){
     digitalWrite(ledArray[i],HIGH);  
     delay(100);                      
     getReading(5);                  
     colourArray[i] = avgRead;        
     float greyDiff = whiteArray[i] - blackArray[i];                    
     colourArray[i] = (colourArray[i] - blackArray[i])/(greyDiff)*255; 
     digitalWrite(ledArray[i],LOW);   
     delay(100);
  }
 
 
}
void getReading(int times){
  int reading;
  int tally=0;
  
for(int i = 0;i < times;i++){
   reading = analogRead(0);
   tally = reading + tally;
   delay(10);
}
avgRead = (tally)/times;
}


//Função para escrever no Serial Monitor o que foi lido e responder acendendo o led
void printColour(){
Serial.print("R = ");
Serial.println(int(colourArray[0]));
Serial.print("G = ");
Serial.println(int(colourArray[1]));
Serial.print("B = ");
Serial.println(int(colourArray[2]));

//Condições para acender o led vermelho
if (((int(colourArray[0])) >= 200) && ((int(colourArray[0])) <= 235)){
  digitalWrite(red1,HIGH);
  digitalWrite(green1,LOW);
  digitalWrite(blue1,LOW);
  delay(1000);
  digitalWrite(red1,LOW);
  digitalWrite(green1,LOW);
  digitalWrite(blue1,LOW);
  
}
//Condições para acender o led verde
else if (((int(colourArray[1])) >= 200) && ((int(colourArray[1])) <= 220)){
  digitalWrite(red1,LOW);
  digitalWrite(green1,HIGH);
  digitalWrite(blue1,LOW);
  delay(1000);
  digitalWrite(red1,LOW);
  digitalWrite(green1,LOW);
  digitalWrite(blue1,LOW);
}
//Condições para acender o led azul
else if (((int(colourArray[2])) >= 100) && ((int(colourArray[2])) <= 130)){
  digitalWrite(red1,LOW);
  digitalWrite(green1,LOW);
  digitalWrite(blue1,HIGH);
  delay(1000);
  digitalWrite(red1,LOW);
  digitalWrite(green1,LOW);
  digitalWrite(blue1,LOW);
}


}


Atividades recentes

  • Erick Vilela

    Um pouco do fun­ciona­mento ini­cial do Detec­tor de Cores, são ape­nas os primeiros pas­sos! (ocor­rem alguns erros porque o ambi­ente é bas­tante ilu­mi­nado e por isso temos alguns prob­le­mas de reflexão)

    • Rodrigo Medeiros Domingo, 08.09.2013 22:26:

      erick, este vídeo ficou como pri­vado no youtube e a gente não con­segue visu­alizar por aqui. Mod­i­fica por lá.

    • Erick Vilela Terça, 10.09.2013 19:24:

      fiz as mod­i­fi­cações, acho que agora está tudo resolvido :D

    • Orivaldo Santana Jr Domingo, 29.09.2013 23:48:

      Grande Erick, ficou bem legal o detec­tor de cores, parabéns :)