Light-Pen RGB

Progetto sviluppato in collaborazione con la collega Mariella Bonomo per l'insegnamento Multisensory Data Exploration and Analytics del corso di Laurea Magistrale in Informatica dell'Università di Palermo, tenuto dal professore Davide Rocchesso nell'anno accademico 2017/2018.

Il software è disponibile a questo indirizzo:

https://github.com/alessiolombardo/light-pen-rgb

Documentazione

Light-Pen RGB

Light-Pen RGB

Mariella Bonomo, Alessio Lombardo – Università degli Studi di Palermo

Corso di Laurea in Informatica Magistrale – A.A. 2017/18

Multisensory Data Exploration and Analytics

 

Abstract

L’uso di monitor touch-screen è sempre più frequente in diversi contesti perché avvicina la macchina all’utente e spesso semplifica notevolmente l’interfacciamento, specie nell’ambito della Data Visualization.

Tuttavia i costi di un monitor touch-screen non sono sempre sostenibili e pertanto in questo documento descriviamo la realizzazione di un dispositivo di puntamento a basso costo denominato “Light-Pen RGB” capace di rilevare la luminosità e il colore di una porzione di monitor anche non dotato di tecnologia touch. Un software specifico scritto in linguaggio Java consentirà di convertire il colore e la luminosità rilevati in un colore RGB e di modificare coerentemente la visualizzazione dei dati sul monitor.

 

Cenni storici

Le Light-Pen (Penne Ottiche) furono progettate originariamente da Robert R. Everett nei primi anni ’50 e fin da subito trovarono utilizzo in ambito militare. Ad esempio nei calcolatori Whirlwind e SAGE, entrambi progettati da Jay Forrester, le Light-Pen venivano utilizzate per selezionare aerei in monitor a tubi catodici (Cathode-Ray Tube – CRT). Successivamente negli anni ’60, ’70 e ’80 le Light-Pen trovarono ampio utilizzo prima in ambito accademico e professionale (IBM 2250) ed in seguito anche in ambito videoludico dove spesso veniva utilizzato il termine “Pistola Ottica” (Atari XG1).

Il principio di funzionamento di questi dispositivi era piuttosto semplice. L’immagine sul monitor CRT veniva creata attraverso la proiezione di un fascio di elettroni. Il fascio veniva spostato ad intervalli fissati da una posizione all’altra in modo da scansionare tutto il monitor dall’alto verso il basso. Quando la Light-Pen rilevava una luminosità elevata (provocata dal fascio) si poteva risalire alla sua posizione misurando i millisecondi trascorsi dall’inizio della scansione dell’immagine.

Il grosso difetto di questi dispositivi era appunto quello di poter essere utilizzati solo su monitor CRT, oggi obsoleti, e inoltre non erano in grado di distinguere i colori ma solamente la luminosità.

 

           

Esempi di Light-Pen per monitor CRT: IBM 2250 (a sinistra) e Atari XEGS con XG1 (a destra).

 

Descrizione generale del progetto

Il nostro progetto si basa sulla costruzione di una Light-Pen, sensibile alle frequenze di colore RGB e alla luminosità che fa uso del sensore RGB TCS3200. Dietro il sensore è stato posizionato un pulsante che abilita la lettura dei dati solo durante la pressione della punta (ovvero del sensore). I valori forniti dal sensore durante il tocco costituiscono un’onda quadra nel quale la frequenza varia a seconda dell’intensità del colore o della luminosità che è stata letta. Tramite l’utilizzo di Arduino, i colori intercettati dal sensore RGB TCS3200 vengono letti ed inviati ad un computer Windows o Linux attraverso un cavo USB.

Successivamente alla costruzione della penna e del collegamento di essa all’interfaccia software, è stato realizzato un software Java con un’interfaccia grafica JavaFX, costituita da vari bottoni che consentono di effettuare una calibrazione delle letture e di testare l’accuratezza con un grafico d’esempio e tre diverse palette cromatiche a 16 colori. Il risultato finale è un interfacciamento “tattile” su computer dotati di monitor tradizionale (non di tipo touchscreen). Il nostro progetto è stato realizzato suddividendo il lavoro in due fasi: una prima parte relativa alla costruzione dell’hardware e una seconda parte relativa alla scrittura del software.

 

Hardware

La Light-Pen RGB è stata interamente assemblata dagli autori. Per la struttura è stata utilizzata una comune penna a sfera di diametro di circa 1-1.2cm svuotata di tutte le parti non necessarie.

A circa 1/4 dell’altezza della penna è stato fissato un pulsante (tipologia “Tactile Push Button” da 6mm) rivolto verso la punta della penna.

Tra il pulsante e la punta della penna è stata inserita una vite a testa piana con la sua punta che fuoriesce di qualche millimetro dalla punta della penna e la sua testa che tocca il pulsante senza premerlo.

Sulla punta della vite è stato fissato un sensore RGB programmabile TCS3200 prodotto dalla TAOS/AMS. Si tratta di un componente costruito secondo lo standard SMT (Surface Mount Technology) che può essere pilotato direttamente da segnali digitali a 5Volt senza dover rispettare particolari protocolli di comunicazione.

Generalmente il TCS3200 viene commercializzato già incluso in un modulo di controllo (come ad esempio qui) e questo lo rende più semplice da connettere ad altri dispositivi come Arduino. Tuttavia abbiamo scelto di acquistare il sensore senza moduli di controllo perché solo le sue dimensioni estremamente ridotte (6x5mm) lo rendono adatto allo scopo. Inoltre il suo package piatto consente di catturare la luce del monitor senza subire eccessive interferenze dalla luce ambientale proveniente dai lati.

Prestando attenzione alla delicatezza degli 8 pin del sensore abbiamo saldato ad essi i fili necessari che sono stati convogliati all’interno della penna. Abbiamo scelto fili abbastanza flessibili e li abbiamo disposti ad elica lungo la parte terminale della penna per non ostacolare la pressione del sensore e di conseguenza la pressione del pulsante interno alla penna.

 

Sensore TCS3200 (in alto a sinistra), la sua piedinatura (a sinistra) e il suo diagramma di funzionamento (a destra).

Il sensore è costituito da una matrice di 64 fotodiodi collegati in parallelo e di 4 tipologie diverse (16 sensibili al rosso, 16 al verde, 16 al blu e 16 a tutte le frequenze di luce visibile cioè al bianco). I due pin denominati S2 ed S3 consentono di selezionare una delle 4 tipologie di fotodiodo inibendo tutti gli altri. I fotodiodi variano il passaggio di corrente al variare dell’intensità di luce percepita. La corrente che attraversa i diodi viene misurata da un convertitore corrente-frequenza che trasforma l’intensità di corrente in un’onda quadra con frequenza proporzionale alla corrente misurata che viene condotta al pin OUT. Il fattore di proporzionalità (denominato scaling) si può variare agendo sui pin S0 ed S1 ma nel nostro caso abbiamo fissato questo fattore al massimo possibile e non è stato necessario collegare questi ulteriori 2 pin ad Arduino. Infine il pin O̅E̅ consente di disabilitare il sensore. Abbiamo connesso questo pin al pulsante in modo da poter attivare il sensore solamente quando esso viene premuto. Il pulsante è connesso a GND e a VDD tramite una resistenza di pull-up da 10kΩ.

I pin che hanno la necessità di essere connessi con Arduino sono pertanto 5: VDD e GND per l’alimentazione, S2 ed S3 per selezionare la tipologia di fotodiodo ed OUT per la lettura della luminosità percepita. I 5 fili connessi a questi 5 pin sono stati convogliati in un cavo USB schermato che possiede appunto 4 fili più un ulteriore filo di schermatura (in questo caso utilizzato impropriamente per connettere GND).

All’estremità del cavo è stato inserito un connettore femmina a 6 vie (di cui una non utilizzata) collegato alla porta ICSP di un Arduino Uno Rev3 che possiede i pin VDD/5Volt e GND (necessari per alimentare la Light-Pen RGB), 3 pin di Input/Output generici (nel nostro caso utilizzati per connettere S2, S3 ed OUT) e un ulteriore pin per il reset di Arduino (non utilizzato). Il connettore è stato opportunamente modificato per impedire di essere inserito al contrario.

Arduino dovrà essere connesso attraverso un collegamento USB ad un computer con sistema operativo Windows o Linux con il quale comunicherà ad una velocità di 9600 baud/s.

 

Schema elettrico della Light-Pen RGB e della porzione di Arduino Uno ad essa collegata tramite il cavo a 5 fili.

 

l 

Schema topografico della Light-Pen RGB.

 

ll  

 

Immagini della costruzione della Light-Pen RGB (analisi delle onde quadre generate dal sensore, assemblaggio della punta, dettaglio dei fili saltati sul sensore, interno della penna, connettore per il collegamento con Arduino).

 

 

Light-Pen RGB connessa ad Arduino e computer.

 

Software

La seconda fase del progetto, ovvero la realizzazione del software, è stata a sua volta suddivisa in due step.

Per prima cosa abbiamo scritto un semplice sketch per Arduino Uno capace di leggere i dati ed inviarli di continuo al computer connesso. Iterativamente il programma imposta un valore alle porte connesse ai pin S2 ed S3 del sensore e in questo modo selezionerà il tipo di fotodiodo da attivare (rosso, verde, blu o bianco). Ogni volta sarà rilevato il periodo dell’onda quadra presente sulla porta connessa al pin OUT del sensore e in questo modo si potrà rilevare l’intensità del colore percepito. I 4 valori letti (RGBW) vengono inseriti in un pacchetto da 24byte e spediti continuamente nella porta seriale USB connessa al computer. Se il sensore non è attivo (perché la Light-Pen non è premuta) allora viene spedito un pacchetto contenente valori nulli.

Successivamente è stata realizzata un’interfaccia scritta in Java, utilizzando l’IDE Eclipse, costituita da un package con 4 classi: RGBSerialPort, RGBPenColori, JavaFx e Controller.

La classe “RGBPenSerialPort” permette la comunicazione tra Arduino e le altre classi, mediante l’uso della libreria SerialPort. Questa classe si occupa di ricercare se viene connesso Arduino (sia su Windows che su Linux) ed in caso affermativo apre una comunicazione seriale con la porta seriale corrispondente. Una volta aperta la comunicazione, quando richiesto si occupa di leggere dalla porta seriale un pacchetto da 24 Byte corrispondente al colore letto dal sensore, restituendo i 4 valori RGBW.

La classe “JavaFx” descrive l’interfaccia grafica che presenta inizialmente una schermata principale. All’avvio viene ricercata la porta di Arduino e si viene avvisati nella finestra se Arduino è collegato. Successivamente viene richiesto di effettuare la calibrazione di 8 colori (rosso, giallo, verde, ciano, blu, magenta, nero e bianco) effettuando un “tocco” prolungato con la penna per ciascun colore.

La finestra presenta inoltre 3 bottoni che, gestiti con il metodo setOnAction della libreria JavaFX, aprono tre palette a 16 colori in una seconda finestra:

o   “TEST PALETTE NOSTRA”: costituita dagli 8 colori principali di calibrazione con l’aggiunta dei colori intermedi e di un grigio chiaro e grigio scuro;

o   “TEST PALETTE CGA” costituita dai colori utilizzati nelle schede grafiche CGA;

o   “TEST PALETTE VIC II” costituita dai colori utilizzati negli home computer con VIC II;

In queste finestre è stata inserita una lista di 16 Radio Button, uno per ogni colore. Il colore letto dalla penna dopo essere stato convertito in RGB viene confrontato con i colori della palette, e verrà attivato il Radio Button sotto al colore più simile corrispondente. E’ stato impedito che il mouse possa cliccare i Radio Button in modo che essi siano gestiti direttamente in base ai valori letti dalla penna.

Sulla finestra principale è presente un quinto bottone “GRAFICO D’ESEMPIO” che permette di creare una finestra che presenta un grafico d’esempio di tipo ScatterPlot, a dispersione, che rappresenta l’andamento del tasso di fertilità neonatale nel periodo 2000-2010 per gli stati Italia, Francia, Germania, Belgio e Spagna (valori presi da una documentazione presentata da Google) dove si rappresentano il numero dei nascituri in ogni anno con simboli di forma e colore diverso in base allo stato. Le forme e i colori sono stati impostati grazie ad un file scritto in css. Utilizzando la Light-Pen RGB è possibile selezionare un simbolo di un determinato colore e in base al colore letto di eliminare o reinserire un andamento del corrispondente stato dal grafico.

Le finestre sono state gestite in modo da essere aperte una alla volta così da effettuare un comando alla volta.

I colori RGBW del sensore vengono rappresentati da un oggetto “RGBPenColor” che possiede anche un metodo di conversione che restituisce il corrispondente colore RGB True Color calcolato attraverso delle interpolazioni in base alla lista di colori di calibrazione. Viene utilizzato lo spazio colore HSV come spazio di appoggio per effettuare la conversione RGBW→HSV→RGB. Abbiamo gestito separatamente i tre canali dell’HSV nel modo seguente:

o   Tonalità: abbiamo calcolato la minima distanza tra il colore letto e i colori di calibrazione rispetto ai canali R, G, B e fra questi abbiamo selezionato il colore più simile. Successivamente abbiamo considerato i due colori ad esso adiacenti sul cerchio HSV e di questi abbiamo selezionato il più simile rispetto al colore letto.  Fra i due colori “simili” viene effettuata un interpolazione lineare rispetto alla loro distanza dal colore letto e da qui si definisce l’angolo del cerchio ovvero la tonalità.

o   Saturazione: è stata definita come media delle distanze rispetto ai canali del bianco di calibrazione. Se questa saturazione è abbastanza piccola viene impostata a 0 e il colore riconosciuto sarà il bianco. Viceversa abbiamo considerato due casi: nel caso più semplice la saturazione viene sempre impostata ad 1, ma questo non permette di riconoscere i grigi. Selezionando una Check Box nella finestra principale è possibile attivare il calcolo della saturazione attraverso la formula

Se questo valore è superiore ad un certo livello la saturazione in ogni caso viene impostata ad 1. Inoltre nei calcoli sono stati inseriti vari valori di correzione stabiliti sperimentalmente.

o   Brightness: definita come media delle distanze dei 4 canali rispetto al nero di calibrazione. Anche in questo caso sono state apportate alcune correzioni.

Infine la classe “Controller” si occupa di gestire lo stato dell’applicazione: avvia la connessione con Arduino, gestisce gli errori di comunicazione, memorizza i valori di calibrazione per ogni colore, imposta la palette da utilizzare, calcola la media delle letture effettuate mentre si tocca ed infine modifica le finestre grafiche in modo coerente con i colori letti.

 

Conclusioni

Abbiamo raggiunto un’accuratezza moderata per il riconoscimento dei colori, tuttavia considerando il basso costo del dispositivo e la realizzazione amatoriale possiamo ritenerci soddisfatti.

Lo spazio di colori percepito dal sensore è molto irregolare, questo ha complicato notevolmente la conversione ad un spazio di colori standard come l’RGB True Color.

Purtroppo abbiamo riscontrato che il dispositivo non è adatto a funzionare su monitor CRT poiché emettono una luce troppo debole ed inoltre hanno un vetro di maggior spessore che aumenta fenomeni di rifrazione.

Il costo complessivo dell’intero hardware è stato di circa 30 euro, di cui 21 euro circa per Arduino Uno, 5 euro il sensore RGB, 3 euro per i due cavi USB.

Eventuale miglioramento: togliere il cavo tra la penna ed Arduino; affinché la penna si possa utilizzare senza fili, tuttavia questa ipotesi incrementerebbe notevolmente i costi. Un altro miglioramento per limitare le dimensioni è quello di sostituire Arduino Uno con Arduino Nano. Infine, per migliorare il riconoscimento dei colori, si può prevedere l’utilizzo di tecniche di apprendimento supervisionato o non supervisionato.