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); } }
Rodrigo Medeiros Domingo, 08.09.2013 22:26:
erick, este vídeo ficou como privado no youtube e a gente não consegue visualizar por aqui. Modifica por lá.
Erick Vilela Terça, 10.09.2013 19:24:
fiz as modificações, acho que agora está tudo resolvido :D
Orivaldo Santana Jr Domingo, 29.09.2013 23:48:
Grande Erick, ficou bem legal o detector de cores, parabéns :)