gbm
Sensore di colore LED RGB
Tutorials -
Sabato 29 Ottobre 2011 09:09
Scritto da gbm

Come potete vedere da questo video, ho messo insieme un semplice algoritmo che permette di percepire il colore presente davanti al sensore, ma soprattutto, un'applicazione in Processing che permette di visualizzarlo.

Questo sensore riesce a determinare il colore presente davanti ad esso grazie alla riflettività delle superifici. In poche parole, emettendo luce rossa contro una superficie rossa, otterremo un forte riflesso, al contrario utilizzando luce blu o verde, otterremo un riflesso piuttosto esiguo. Illuminando con i 3 colori la superificie, di conseguenza, è possibile determinare il suo colore stimando la quantità di luce riflessa ottenuta dalle 3 differenti colorazioni. Ovviamente è possibile ottenere tutti i colori della scala RGB quindi da 0,0,0 a 255,255,255.

Per farlo sfruttiamo la capacità dei LED, di produrre elettricità se colpiti da radiazione luminosa. Di conseguenza, grazie alle porte analogiche di Arduino, determiniamo in voltaggio prodotto.

Per stabilizzare il dato ottenuto viene filtrata la luce ambientale, che viene completamente rimossa grazie all'algoritmo ERER applicato alla soluzione analogica. Grazie a cio' il sensore funziona in qualsiasi situazione di luce.

 

    RGB       

Come vedete il circuito è molto semplice. 

Il LED emettitore di luce, pilotato dalle porte digitali 8, 9 e 10.

Il LED ricevitore, viene connesso con i + alle porte analogiche 0, 1 e 2.

 

Se avete un output virato decisamente verso un colore, per esempio il blu, questo significa che l'emettitore probabilmente è decisamente piu' potente degli altri due.

Per sistemare il problema è possibile posizionare tra analogica e + del LED un potenziometro, oppure una resistenza per regolare la radiazione luminosa emessa.

 

 

Il codice per Arduino:

//Simple LED RGB color sensor
//G.B.Mitolo -Gioblu Robotics- released under Creative Commons Attribution-NonCommercial-ShareAlike 3.0
//G.B.Mitolo -Gioblu Robotics- materiale rilasciato sotto licenza Creative Commons Attribution-NonCommercial-ShareAlike 3.0
//use and enjoy free :-) - gioscarab[att]gmail.com
//usa pure e divertiti  :-) - gioscarab[att]gmail.com

 int R = 0;
 int G = 0;
 int B = 0;
 
 int Ra = 0;
 int Ga = 0;
 int Ba = 0;
 int counter = 0;

void setup() {                
 pinMode(13, OUTPUT); // blu 
 pinMode(12, OUTPUT); // verde    
 pinMode(11, OUTPUT); // rosso
 Serial.begin(9600);  
}

void getR() {
  counter = 0;
  while(counter < 5) { Ra = analogRead(2) + R; counter++;} // ambientale
  digitalWrite(11, HIGH);   // Accendi LED rosso
  counter = 0;
  while(counter < 5) { R = analogRead(2) - Ra; counter++; }
  digitalWrite(11, LOW);   // Spegni LED rosso
}

void getG() {
  counter = 0;
  while(counter < 5) { Ga = analogRead(1) + G; counter++;} // ambientale
  digitalWrite(12, HIGH);   // Accendi LED verde
  counter = 0;
  while(counter < 5) { G = analogRead(1) - Ga; counter++; }
  digitalWrite(12, LOW);   // Spegni LED verde
}

void getB() {
  counter = 0;
  while(counter < 5) { Ba = analogRead(0) - B; counter++;} // ambientale
  digitalWrite(13, HIGH);   // Accendi LED blu
  counter = 0;
  while(counter < 5) { B = analogRead(0) - Ba; counter++; }
  digitalWrite(13, LOW);   // Spegni LED blu
}

void loop() {
getR(); //ottieni valore rosso
getG(); //ottieni valore verde
getB(); //ottieni valore blu
Serial.print(R); // comunica a Processing
Serial.print("/");
Serial.print(G);
Serial.print("/");
Serial.println(B);
R = 0; //reset
G = 0;
B = 0;
Ra = 0;
Ga = 0;
Ba = 0;
}

 

Vediamo invece il codice per l'applicazione che ci permetterà di visualizzare il colore ottenuto:

import processing.serial.*;

Serial myPort;  // Create object from Serial class
int R = 0;
int G = 0;
int B = 0;
String valueStr;

void setup() {
  size(800, 800);
   background(255);          
}

void draw() {}

void mouseClicked() {
    myPort = new Serial(this, Serial.list()[1], 9600); 
    // Al posto di 1 va inserito il numero della porta in uso
  }

void serialEvent(Serial myPort) {
 if ( myPort.available() > 0) { valueStr = myPort.readStringUntil('\n'); }
 //Se la connessione è presente, dividi quello che ottieni ad ogni "a capo"
 if(valueStr != null) { valueStr = trim(valueStr); String[] data = split(valueStr, "/"); 
 //Se lo spezzone ottenuto non è nullo, dividilo in pezzi con divisore "/"
 R = int(data[0]); //Primo pezzo R
 R = int(map(R, 0, 65, 0, 255));  //variare i valori di map x setting
 G = int(data[1]); //Secondo pezzo G
 G = int(map(G, 0, 30, 0, 255));  //variare i valori di map x setting
 B = int(data[2]); //Terzo pezzo B
 B = int(map(B, 0, 50, 0, 255));  //variare i valori di map x setting
 print(R+" "); print(G+" "); println(B+" "); // debug print
 fill(R,G,B); // riempi del colore ottenuto il quadrato
 rect(100, 100, 600, 600);
 }
}

Creative Commons License
LED RGB sensor with Arduino by Giovanni Blu Mitolo is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.
Based on a work at www.gioblu.com.

 

Gioblu Robotics © 2010 - 2012 · Sitemap · privacy

gioscarab@gmail.com

Gioblu BOTServer è online dal 10 Aprile 2010 - 319.232 Visite - 1.027.175 Pagine visualizzate - 182.309 Visitatori unici - 536 utenti attivi