Colour Picker

IMG_1835

Exercício de aplicação sobre Entrada e Saída analógica no Arduino. Entrada Digital e Pull-Resistor.

O CP (Colour Picker) é um tipo de projeto bastante popular na WEB o qual pode ser visto em inúmeros exemplos disponíveis em sites Maker, DiY ou blogs de micro-electrónica. O exemplo que aqui publicamos tem como objectivo ser implementado numa sala de aula como introdução à plataforma Arduino e está, por essa mesma razão, organizado sob a forma de um exercício.

Tratando-se de um desafio de natureza pedagógica, com recurso a componentes facilmente disponíveis e de baixo custo, este CP não tem o desempenho ou acuidade que outros equipamentos profissionais de maior precisão oferecem. Desde logo, o LDR que está na base do sensor de luminosidade, com o qual se constrói o dispositvo, está longe de ser um componente ideal. Ocorrem-nos imediatamente 3 aspectos limitativos: i) apresenta uma resposta muito lenta, na ordem dos 100hz, ii) não garante linearidade entre o estímulo de entrada e o valor da resistência de saída e, por último, iii) é mais sensível ao espectro vermelho e infra-vermelho que em relação ao azul.

Outra ordem de razões que nos merece tabém um comentário diz respeito ao código. As soluções apresentadas têm por objectivo serem claras e simples procurando não apresentar grandes dificuldades ao aluno iniciado na programação. Por força disso, o código não é optimizado e tende a ser extenso, evitando-se o uso de funções e previligiando a repetição de códico e recurso a valores literais.

Apesar destas e outras limitações o dispositivo tem um desempenho bastante satisfatório e, depois de corretamente calibrado (balanço dos brancos), as cores que surgem no ecrã são muito idênticas aos das superfícies físicas.

Convida-se o aluno a pensar como pode o CP ser integrado em  outros dispositivos de comunicação e a idealizar projetos mais completos baseados também nesta funcionalidade. Veja-se como exemplo um projeto que dita as cores a um invisual, apresentado na mini-feira Maker 2014 em Lisboa, ou o célebre candeeiro Camaleão que escolhe a cor com que ilumina pusando a base do candeeiro sobre uma objecto colorido.

1- Preparar o circuito do interruptor

Comece por criar um circuito com um interruptor de pressão conectando ao pino 6. Teste o seu funcionamento no arduino e no terminal, recorrendo ao modo de input Pull-Up Resistor (veja na referência o comando pinMode).

colour_picker1

arduinoheader

void setup(){
  Serial.begin(9600);
  pinMode(6, INPUT_PULLUP);
}
void loop(){
  if (digitalRead(6)==LOW){
     Serial.println("ON!");
  }
}

2- Ligar o LED RGB.

Para proteger o LED RGB limitando o seu consumo, instale resistências de 100r a 330r nos seus terminais em cada uma das cores. Conecte a cor vermelha (R) ao pino (G) 5, o verde ao 4 e o azul (B) ao 3. Teste o circuito criando um programa que quando o botão é pressionado as cores primárias, R,G e B são acesas à vez.

colour_picker2

arduinoheader

void setup(){
  Serial.begin(9600);
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6, INPUT_PULLUP);
}
void loop(){
  if (digitalRead(6)==LOW){
     Serial.println("ON!");
     //RED
     digital.Write(5,HIGH);
     digital.Write(4,LOW);
     digital.Write(3,LOW);
     delay(400);
     //RED
     digital.Write(5,LOW);
     digital.Write(4,HIGH);
     digital.Write(3,LOW);
     delay(400);
     //RED
     digital.Write(5,LOW);
     digital.Write(4,LOW);
     digital.Write(3,HIGH);
     delay(400);
  }
}

3 – Sensor de luminosidade.

Construa um sensor de luminosidade conjugando um LDR e um resistência (2.2K~22K) no modo de divisor de tensão (em série). Alimente uma das extremidades do divisor de tensão com 5V e conecte a outra extremidade ao Ground. Por fim, conecte o pino analógico A0 entre a resistência e o LDR.

O circuito deverá ter agora a seguinte aparência:

colour_picker3

Teste o circuito criando um programa que quando o botão é pressionado o valor de luminosidade é apresentado no terminal.

arduinoheader

void setup(){
  Serial.begin(9600);
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6, INPUT_PULLUP);
}
void loop(){
  if (digitalRead(6)==LOW){
     int sensor=analogWrite(0);
     Serial.println(sensor);
     delay(100);
  }
}

 

4 – Colour Picker.

IMG_1832

Usando o circuito que construíu nas alíneas anteriores, conceba um programa no arduino que detecte a cor de um objecto e comunique o código web respectivo via terminar. O LED RGB deverá ser usado para iluminar o objecto e o detector de luminosidade para realizar a leitura da intensidade para cada uma das cores primárias.

IMG_1833

O sensor e o LED RGB deverão ser instalados numa caixa escura e com uma disposição física que impeça a luz do LED iluminar diretamente o sensor. O objectivo é que toda a luz proveniente do LED que atinja o sensor seja constituida apenas pela luz reflectida pelo objecto, tal como ilustra a imagem seguinte.

IMG_1834

setup

arduinoheader

// Readings for White
int wR=490;
int wG=300;
int wB=460;

// Readings for Black
int bR=900;
int bG=900;
int bB=900;

void setup() {
pinMode(13, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, INPUT_PULLUP);
Serial.begin(9600);

}

void loop() {
int R,G,B;
if (digitalRead(6)==LOW){
// BLUE
digitalWrite(3,HIGH);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
delay(50);
B=analogRead(0);

// GREEN
digitalWrite(3,LOW);
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
delay(50);
G=analogRead(0);

// RED
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
delay(50);
R=analogRead(0);

// OFF
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,LOW);

//Serial.print("#");

// NORMALIZE
R=map(R, wR, bR, 255, 0);
G=map(G, wG, bG, 255, 0);
B=map(B, wB, bB, 255, 0);

if (R>255) R=255;
if (G>255) G=255;
if (B>255) B=255;
if (R<0) R=0;
if (G<0) G=0;
if (B<0) B=0;

String sR=String(R, HEX);
if (R<16) sR = "0" + sR;

String sG=String(G, HEX);
if (G<16) sG = "0" + sG;

String sB=String(B, HEX);
if (B<16) sB = "0" + sB;

//PRINT

//Serial.print("#");
Serial.print(sR);
Serial.print(sG);
Serial.print(sB);
Serial.println();

delay(300);
}
//Serial.println(analogRead(0));
}

 

 

5 – testar no Photoshop ou num editor web.

Para inserir automaticamente os valores RGB o código da cor deverá estar no formato web hexadecimal #RRGGBB.

Por exemplo, a cor amarela é FFFF00, a Azul 0000FF, etc

Uma vez que os dados são comunicador por porta série e estamos a usar o UNO e não a placa Arduino LEONARDO que permite instalar-se como um teclado, necessitamos de um emulador “Serial to Keyboard”.

Vário emuladores estão disponíveis e testámos este exemplo com o seguinte software gratuito:

http://download.cnet.com/windows/sybink/3260-20_4-10209575-1.html

O sistema foi testado usando um editor disponível na WEB:

https://www.w3schools.com/colors/colors_picker.asp

 

 

 

 

 

Anúncios