SpettroFotometro con Arduino e sensore di colore tcs230
Cos'è la spettrofotometria
Alcuni metodi per l’analisi di campioni di materiali biologici si basano sulla misura di composti colorati che si formano durante alcune reazioni chimiche che li coinvolgono e l’intensità di un determinato colore può essere usato come misura della concentrazione di una determinata sostanza nel campione in esame. La misura del colore per determinare l'indice di concentrazione di alcune sostanze è noto col termine di colorimetria e lo strumento usato per la misura relativa si chiama colorimetro. Si definisce spettrofotometria la tecnica che si basa sulla misura diretta dell’intensità di colore in termini di potere di assorbimento/riflessione della luce da parte di una data soluzione in alcune regioni specifiche dello spettro della luce. In altre parole, banalizzando, si illumina con luce bianca (quindi con una composizione spettrale tale da contenere tutti i colori) una soluzione di cui si vuole misurare il colore, poi si filtrano tramite filtri ottici alcuni colori la cui intensità vogliamo misurare e si inviano a dei sensori che ne rilevano l'intensità. Il tutto in relazione ad un liquido di riferimento di cui conosciamo le caratteristiche (come termine di paragone per tarare lo strumento).
Premessa
Esistono molti modelli di spettrofotometro presenti sul mercato, tuttavia i costi sono molto alti, si tratta di strumenti di laboratorio che vengono usati in vari ambiti della fisica e della chimica. Il nostro obbiettivo è più modesto, ci occorre uno strumento affidabile per determinare con precisione il colore della birra. Ci accontentiamo di una precisione inferiore. Allo scopo, per non riscoprire la ruota partiremo da un hardware di largo utilizzo, il microcontrollore programmabile completo di tutti gli integrati di contorno che prende il nome di "Arduino". Questo è un progetto che non aspira a rivaleggiare con spettrofotometri commerciali dal costo di migliaia di euro, ma nel nostro piccolo abbiamo cercato di fare un buon lavoro. Ci siamo ispirati a lavori che sono di pubblico dominio, pubblicati su vari siti internet e possiamo affermare che quello che si trova in giro su internet è quasi sempre impreciso e frammentario, quasi sempre frutto di scopiazzamento fra siti, (abbiamo trovato lo stesso errore su tutti) quindi cercheremo di fare meglio.
Progetto dello spettrofotometro
Come prima cosa occorre un sensore adeguato da collegare ad arduino, quindi abbiamo scelto un sensore standard che è il TCS230 (Texas advanced optoelectronics solution). Si tratta di un sensore composto da una matrice di elementi fotosensibili, 64 esattamente di cui 16 con un filtro rosso 16 con un filtro verde e 16 con un filtro blu, più altri 16 non filtrati. Questo sensore all'uscita produce una frequenza che è funzione della luce che lo colpisce. E' possibile selezionare l'uscita legandola alla misura di uno dei 4 gruppi di sensori di cui sopra. Arduino seleziona il colore da misurare e legge la frequenza in uscita dal modulo TCS230. Il tutto grazie ad un programma che abbiamo sviluppato e caricato su arduino.
Pin Lato TCS230 | | S0 | Digital 10 | S1 | Digital 11 | S2 | Digital 12 | S3 | Digital 13 | OUT | Digital 5 | Vcc | 5V | GND | GND | OE | GND | | Collegamento fra il sensore e arduino. In fase di costruzione del prototipo è opportuno usare gli appositi ponticelli, in fase di costruzione definitiva è meglio usare dei fili saldati, sia da una parte che dall'altra per evitare falsi contatti. |
|
Fissaggio del sensore ad una basetta millefori che servirà da supporto per fissare i componenti accessori che sono un trimmer per regolare il contrasto del display lcd alcune resistenze e alcuni condensatori di stabilizzazione dell'alimentazione. |
|
Collegamento di arduino con il sensore per la realizzazione di un prototipo per verificare i parametri di funzionamento e abbozzare un primo programma di test. |
|
Prove di funzionamento sul prototipo dello spettrofotometro. |
|
Considerazioni sulla luce che direttamente passa dai diodi led al sensore: occorre evitare questo in modo assoluto, noi abbiamo disaccoppiato i led dal sensore mediante un collarino di tubo nero (abbiamo usato un tubo di plastica ricavato da un pennarello esaurito). Il sensore è ora in fondo al centro dello spezzone di tubo e la possibilità che la luce dei led vi possa giungere è stata eliminata. |
|
Il prossimo passo è integrare un display lcd per poter usare lo strumento senza ricorrere al computer. La scelta del display cade su un modello a due righe 16 caratteri (compatibile con il driver Hitachi HD44780). Questo ha richiesto un certo numero di modifiche come ad esempio il montaggio di un trimmer per regolare il contrasto e di alcune resistenze per regolare la luminosità del display. Poi abbiamo ricablato tutti i fili saldandoli direttamente sul PCB di arduino in modo da eliminare una volta per tutte i falsi contatti. Nel dispay a sinistra si vedono le frequenze relative ai tre colori fondamentali (R=rosso,B=blu,V=verde) e al bianco (W). Nel display al centro la versione del software e il committente (parte introduttiva dopo l'accensione). Nella foto a destra tutto l'apparato completo di arduino uno, display e sensore, con tutti i fili di collegamento direttamente saldati sul PCB di arduino. |
|
Ora dobbiamo costruire una scatola adatta a contenere tutto. Caratteristiche della scatola: -
con l'interno verniciato di nero opaco in modo da evitare riflesioni ed ermetica in modo da evitare infiltrazioni di luce esterna. Questo è fondamentale, quanto usare sempre la stessa provetta (o meglio lo stesso tipo) per contenere il liquido. Cambiando questi parametri la macchina necessita di essere ritarata. -
Il sensore dovrà essere preferibilmente collocato a 10-11 cm dall'oggetto da illuminare, i led impiegati emettono un fascio di luce molto direttivo che si apre sufficientemente solo a questa distanza. Posizionare il sensore troppo lontano è controproducente in quanto diminuisce la luce che lo colpisce e saremmo in questo caso costretti a ricorrere a delle ottiche per migliorarne la sensibilità come ad esempio una lente biconvessa per aumentare la concentrazione della luce sul sensore. In alternativa posizionare il sensore a contatto con la provetta e rendere più direttivi i led. In questo modo cala la luce ma il sensore è molto vicino, quindi più sensibile. -
L'oggetto da misurare dovrà preferibilmente essere l'unico oggetto posto davanti al sensore in grado di emettere luce (in questo caso per riflessione), quindi tutto il resto andrà schermato, questo per aumentare il rapporto segnale utile/luce indesiderata e migliorare la presisione del sistema. In alto alcune fasi della costruzione della scatola, realizzata in legno. |
 |  |  |
Colorazione dell'interno della scatola di nero opaco. | Fori passanti per il collegamento esterno di arduino per la programmazione e l'alimentazione. | Provetta che useremo per i test sullo spettrofotometro. |
Considerazioni sull'allineamento della provetta di fronte al sensore. Per evitare la riflessione del vetro occorre inclinare la provetta rispetto al sensore, in modo che l'angolo fra le fonti di luce e il sensore non possa in alcun caso e per nessuna combinazione essere zero. Questo vale sia per le provette in vetro borosilicato che per quelle in materiale plastico che per tutti gli oggetti di vetro. Questo nell'ottica di miglorare sempre il rapporto fra la luce utile e quella indesiderata.
 |  |  |
Supporto inferiore della provetta. Serve per bloccarla sempre in una precisa posizione per evitare errori di posizionamento della stessa. | Supporto inferiore della provetta. Serve per bloccarla sempre in una precisa posizione per evitare errori di posizionamento della stessa. | Montaggio del supporto guidaprovetta all'interno della scatola dopo averlo verniciato di nero opaco. |
 |  |  |
Provetta messa in posizione nel supporto guidaprovetta. E' stato messo in posizione anche il supporto reggisensore, con il sensore montato e a contatto con la provetta. | Provetta messa in posizione nel supporto guidaprovetta. E' stato messo in posizione anche il supporto reggisensore, con il sensore montato e a contatto con la provetta. | Scatola finita e montata. Sopra la scatola si vedono tre provette di taratura realizzate per eseguire dei test. |
Conclusioni finali
Lo spettrofotometro si comporta alla prova pratica in maniera discreta, è sicuramente troppo accurato per il lavoro che deve svolgere. La soluzione scelta, come potete vedere nelle foto, è quella di mettere il sensore a contatto della provetta e limitare l'apertura del fascio di luce dei led tramite dei tubetti di plastica inseriti sul corpo degli stessi. La scatola è perfettibile ma si tratta di un prototipo che non ha certamente velleità di tipo estetico.
Di seguito il programma utilizzato per le prove dello spettrofotometro: basta copiarlo e trasferirlo su arduino. |
#include <SPI.h> #include <FreqCount.h> #include <TimerOne.h> #include <LiquidCrystal.h> #define S0 13 // Please notice the Pin's define #define S1 12 #define S2 11 #define S3 10 #define OUT 5 #define DELAY 1000 LiquidCrystal lcd(2, 4, 9, 8, 7, 6); void inizio() { pinMode(S0, OUTPUT); // OUTPUT FREQUENCY pinMode(S1, OUTPUT); // OUTPUT FREQUENCY pinMode(S2, OUTPUT); // RGB Selection pinMode(S3, OUTPUT); // RGB Selection pinMode(OUT, INPUT); // Frequency reader digitalWrite(S0, LOW); // OUTPUT FREQUENCY SCALING 2% digitalWrite(S1, HIGH); // Inizializza il display con i numeri dei piedini collegati ad arduino } void setup() { Serial.begin(9600); FreqCount.begin(1000); // set up the LCD's number of columns and rows: lcd.begin(16, 2); // Print a message to the LCD. lcd.clear(); lcd.print("Colorimetro V1.0"); lcd.setCursor(0, 1); lcd.print("->BrewThePlanet"); lcd.setCursor(0, 2); lcd.print("Colore Scala EBC"); } void loop() { unsigned long countR; unsigned long countB; unsigned long countG; unsigned long countW; digitalWrite(S2, LOW); // Rosso digitalWrite(S3, LOW); delay(DELAY); if (FreqCount.available()) { countR = FreqCount.read(); } digitalWrite(S2, LOW); // Blu digitalWrite(S3, HIGH); delay(DELAY); if (FreqCount.available()) { countB = FreqCount.read(); } digitalWrite(S2, HIGH); // Verde digitalWrite(S3, HIGH); delay(DELAY); if (FreqCount.available()) { countG = FreqCount.read(); } digitalWrite(S2, HIGH); // Senza filtro (Bianco) digitalWrite(S3, LOW); delay(DELAY); if (FreqCount.available()) { countW = FreqCount.read(); } Serial.print("->Frequenza Rosso ="); Serial.println(countR); Serial.print("->Frequenza Blu ="); Serial.println(countB); Serial.print("->Frequenza Verde ="); Serial.println(countG); Serial.print("->Frequenza Bianco="); Serial.println(countW); Serial.println("-----------------------------------------------"); lcd.clear(); lcd.setCursor(0, 0); lcd.print("R:"); lcd.print(countR); lcd.setCursor(8, 0); lcd.print("B:"); lcd.print(countB); lcd.setCursor(0, 1); lcd.print("V:"); lcd.print(countG); lcd.setCursor(8, 1); lcd.print("W:"); lcd.print(countW); } |