Come rilevare un colore con il sensore TCS230

Chi come me ha giocato con le Lego si sarà cimentati nella realizzazione di robot e marchingegni pieni di ingranaggi! I movimenti delle mie realizzazioni avvenivano spostando leve e manopole. Con una scheda Arduino possiamo automatizzare questi meccanismi utilizzando piccoli motori o servomeccanismi. Utilizzando dei sensori potremmo rispolverare le nostre costruzioni, fare un salto nel passato e trascorrere piacevoli momenti con i nostri amici.
Poi se avete dei bambini appassionati di costruzioni Lego allora non avete più scuse per mettevi all’opera!

Sensore TCS230

Se ad esempio, avete intenzione di realizzare un colour sorter oltre ai servo vi servirà un sensore capace di rilevare il colore di un oggetto. Sensori di questo tipo ne esistono di diverse tipologie e fortunatamente per noi anche a basso costo.
Quello che ho utilizzato di recente è il sensore TCS230, dal costo contenuto, con una buona sensibilità  e di facile utilizzo.

Il sensore TCS230

E’ composto da una matrice 8×8 di fotodiodi. Questi 64 fotodiodi sono suddivisi in 4 gruppi. 16 fotodiodi hanno un filtro rosso, 16 fotodiodi hanno un filtro verde, 16 fotodiodi hanno un filtro blu e i restanti 16 fotodiodi non presentano filtro.

I 16 fotodiodi dello stesso filtro sono connessi in parallelo e producono una corrente proporzionale all’intensità della luce del colore che devono rilevare.
Tramite i pin S2 e S3 del TCS230 è possibile selezionare un gruppo di fotodiodi alla volta.
La corrente prodotta dai fotodiodi viene inviata ad un convertitore corrente/frequenza, e di conseguenza, in uscita dall’integrato avremo una frequenza ad onda quadra direttamente proporzionale all’intensità della luce del colore.
Tramite i pin S0 e S1 è possibile decrementare la frequenza in uscita dall’integrato.

Circuito Elettrico

Lo schema seguente mostra come eseguire i collegamenti tra il sensore TCS230 e l’Arduino UNO.

Arduino circuito TCS230
Pin Arduino Pin TCS230
5V Vcc
GND Gnd
13 S1
12 S0
2 S2
3 S3
4 Out

Codice di esempio

Abbiamo visto che il sensore TCS230 produce una frequenza proporzionale all’intensità della luce rilevata da un gruppo di fotodiodi.

La funzione che ci permette leggere questo valore è pulseIn(). Questa funzione permette di misurare la durata di un impulso (di conseguenza calcolarne la frequenza).
Il minimo valore misurabile è di 10uS (frequenza massima di 100 KHz).

Il codice dovrà gestire le line S2 e S3 per selezionare ciclicamente il gruppo dei fotodiodi, leggere il valore della frequenza e ottenere cosi i valori per i canali Rosso Verde e Blu (RGB).

Di seguito il codice dello sketch:

#define S1 5
#define S2 6
#define S3 7
#define sensorOut 8

int frequency = 0;
int R = 0;
int G = 0;
int B = 0;

void setup() {

  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);
  pinMode(sensorOut, INPUT);

  // Setto la frequenza a 20%
  digitalWrite(S0, HIGH);
  digitalWrite(S1, LOW);

  Serial.begin(9600);

}

void loop() {

  delay(500);
  R = 0;
  G = 0;
  B = 0;

  digitalWrite(S2, LOW);
  digitalWrite(S3, LOW);
  delay(150);
  for (byte ciclo = 0; ciclo < 10; ciclo++)
  {
    R += pulseIn(sensorOut, LOW);
  }
  R = R / 10;
  Serial.print("R=");
  Serial.print(R);
  Serial.print(" ");

  digitalWrite(S2, HIGH);
  digitalWrite(S3, HIGH);
  delay(150);
  for (byte ciclo = 0; ciclo < 10; ciclo++)
  {
    G += pulseIn(sensorOut, LOW);
  }
  G = G / 10;
  Serial.print("G=");
  Serial.print(G);
  Serial.print(" ");

  digitalWrite(S2, LOW);
  digitalWrite(S3, HIGH);
  delay(150);
  for (byte ciclo = 0; ciclo < 10; ciclo++)
  {
    B += pulseIn(sensorOut, LOW);
  }
  B = B / 10;
  Serial.print("B=");
  Serial.print(B);
  Serial.println(" ");

}

Il codice precedente permette di acquisire i valori di frequenza per i canali Rosso, Verde e Blu. Questi valori possono variare significativamente tra loro.  Infatti a seconda della distanza tra l’oggetto e il sensore, la presenza di luce naturale o artificiale al momento della misurazione, potremmo avere variazioni dei dati letti.

Concludendo, per avere delle letture omogenee è necessario riprodure sempre le stesse condizioni di luce, questo si può ottenere ad esempio utilizzando un box illuminato artificialmente e posizionando l’oggetto alla stessa distanza dal sensore. 
Con le costruzioni Lego abbiamo ora tutto il necessario per realizzare un progetto per stupire i nostri bambini!