Nov 112013
 

Tempo fa ho comperato una shield per Arduino con un display grafico 320×240, 2.8″, controller ILI9325DS, dotato di touch screen, nello specifico la shield distribuita da Iteastudio che trovate qui. Fate molta attenzione perchè esistono numerose shield, anche in diverse revisioni, alcune specifiche per ATMega, altre per UNO/2009. Quella di cui stiamo parlando è quella per Arduino UNO ma, come potete vedere nella pagina che vi ho linkato, risulta compatibile con la Mega per cui in linea teorica dovrebbe essere facilmente intercambiabile fra le due schede. Il motivo di questo articolo è legato al fatto che ho perso tre giornate intere a far funzionare la shield sia sulla UNO che sula Mega e a quanto pare in rete ci sono un’infinità di notizie errate, probabilmente legate alle diverse revisioni sia della shield che della libreria UTFT che la gestisce. Vi faccio notare che sulle schede Arduino “originali”, la shield sbatte contro la porta USB per cui resta leggermnete sollevata da un lato, ma senza comprometterne il funzionamento.

Gestione del Display

La primissima cosa da fare per far funzionare il tutto è scaricarsi l’ultima versione della libreria UTFT che trovate qui, infatti quella inclusa con l’IDE di arduino non è aggiornata (almeno sulla IDE 1.05 che sto usando). Non credo serva ricordarlo, ma la cartella UTFT dovete copiarla nella directory libraries dell’installazione dell’IDE di Arduino. A questo punto apriamo una sketch d’esempio come potrebbe essere Arduino(AVR)->UTF_Demo_320x240. Una volta caricato l’esempio ci troviamo, poco prima del setup, le seguenti  righe di codice:

// Uncomment the next line for Arduino 2009/Uno
 UTFT myGLCD(ITDB32S,19,18,17,16);   // Remember to change the model parameter to suit your display module!
// Uncomment the next line for Arduino Mega
 //UTFT myGLCD(ITDB32S,38,39,40,41);   // Remember to change the model parameter to suit your display module!

La prima cosa da fare è modificare il modello di display, quindi al posto di ITDB32S dobbiamo mettere ITDB28 per cui le due righe di codice diventano:

// Uncomment the next line for Arduino 2009/Uno
 UTFT myGLCD(ITDB28,19,18,17,16);   // Remember to change the model parameter to suit your display module!
// Uncomment the next line for Arduino Mega
 //UTFT myGLCD(ITDB28,38,39,40,41);   // Remember to change the model parameter to suit your display module!

Ora provate a compilare la sketch sull’Arduino UNO e il tutto funzionerà che è una meraviglia. A questo punto vi verrà la tentazione di compilare la versione per la Mega, ovviamente commentando l’inizializzazione per la Uno e decommentando quella per la Mega, ma dopo il caricamento sulla scheda avrete una brutta sorpresa, infatti lo schermo resterà nero, anzi, grigio visto che resta accesa la retroilluminazione. A questo punto sono impazzito per trovare la soluzione al problema. Ci sono due cose distinte da fare per riuscire a far funzionare la shield correttamente. La prima è modificare i pin nel costruttore, infatti dobbiamo sospeture UTFT myGLCD(ITDB28,38,39,40,41);  con UTFT myGLCD(ITDB28,A5,A4,A3,A2); . Ma non basta, infatti dobbiamo fare una modifica ad uno dei files della libreria . Se andate in libraries\UTFT\hardware\avr\ ed editate il file HW_AVR_defines.h, fra i commenti iniziali trovate //#define USE_UNO_SHIELD_ON_MEGA 1 : è sufficiente decommentare (togliere //) questa linea per rendere la shield magicamente compatibile con Arduino Mega. Questa compatibilità si paga con una maggior lentezza del display, diciamo un 20%, però funziona e vi permette di usare i pin liberi della scheda.

Gestione del touch screen

Dopo questa prima parte andiamo a provare un esempio che faccia uso dell’interfaccia Touch. In questo caso la versione dell’IDE era l’ultima disponibile, comunque per sicurezza potete scaricare da qui l’ultima versione della libreria UTouch. Andiamo a prendere un esempio come Arduino->UTouch_ButtonTest. Come prima incominciamo con Arduino Uno. Ricordiamoci di modificare il costruttore come abbiamo visto sopra, ossia con UTFT myGLCD(ITDB28,19,18,17,16); , compiliamo ed inviamo  la sketch sulla scheda. Verranno visualizzati alcuni pulsanti blu numerati e premendo con un dito sul relativo pulsante…..non succederà niente di niente. Anche qui mi sono imbattuto in numerose ricerche, ho persino trovato chi sostiene che non è  possibile usare le funzionalità touch su Arduino Uno in quanto i pin non sono sufficienti, ma ovviamente non è così. Per far funzionare magicamente anche il TouchScreen dobbiamo modificare la riga UTouch myTouch(6,5,4,3,2);  in quanto anche questa non è corretta. A questo punto vi chiederete perchè entrambe le librerie contengono degli errori così palesi, credo che il punto stia nel fatto che la libreria supporta numerosi tipi di display, diversi tipi di shield e diversi tipi di Arduino, compresi alcuni chipKIT uC32 che sono delle schede basate su Microchip PIC32, decisamente più performanti dell’Arduino originale anche se in buona parte compatibile con esso. Tornando a noi modifichiamo il costruttore con UTouch myTouch(A1,A3,A0,8,9); e a questo punto reinviando la sketch compilata, finalmente alla pressione dei tasti blu viene scritto in basso il numero corrispondente del tasto. Per quanto riguarda poi la Mega la modifica da affettuare è identica per cui non serve fare ulteriori aggiunte o modifiche. In definitiva se volete preparare delle sketch che funzionino in entrambe le schede vi consiglio di sostituire la parte con i costruttori presente negli esempi con:

//UTFT myGLCD(ITDB28,19,18,17,16);  // Uncomment  for Arduino 2009/Uno
//UTFT myGLCD(ITDB28,A5,A4,A3,A2);  // Uncomment  for Arduino Mega
//UTouch myTouch(A1,A3,A0,8,9); // Uncomment for touch functionality

A questo punto è sufficiente volta per volta togliere il commento dalla versione che vogliamo usare (Uno o Mega) ed eventualmente dalla terza riga se vogliamo usare le funzionalità touch.

Usare la memoria SD

Per completare in bellezza manca lo sfruttamento dello slot SD. Come primo esperimento ho provato la libreria SD già presente nell’IDE di Arduino ed ha funzionato al primo colpo. Ho usato l’esempio Cardinfo e, con Arduino UNO, ho modificato unicamente const int chipSelect con 10 anzichè il 4 preimpostato ed ha funzionato al primo colpo con una SD da 4GB. E con questo andiamo a smentire tutti quelli che sostengono che con Arduino Uno e questa shield possiamo usare o la SD o il Touch ma non entrambi insieme per mancanza di pin hardware. Con Arduino Mega lo stesso test non funziona in quanto l’hardware SPI usa pins diversi. Sulla Uno però non posso compilare gli esempi UTFT con la libreria SD per l’eccessiva occupazione di spazio flash che ne impediscono il caricamento sulla scheda. A questo punto avrei voluto testare le più leggere librerie tinyFAT e la UTFT_tinyFAT, quest’ultima utile per copiare direttatemente immagini dalla SD allo schermo LCD, ma purtroppo non sono riuscito in nessun modo a far funzionare gli esempi allegati. Di fatto non sono riuscito in nessun modo ad utilizzare lo schermo e la SD in contemporanea.

Considerazioni

Questa shield è stata creata quasi preferenzialmente per interfacciarsi con Arduino Uno e compatibili. Ma la domanda che mi pongo è: cosa me ne faccio di un display così se poi i pin di Arduino vengono interamente occupati? In realtà resta libero il pin A2, ma la scheda lo occupa “fisicamente” senza dare la possibilità di collegare quell’uscita ad “altro”. L’unico modo resta l’utilizzo di una shield intermedia o l’accesso diretto con una saldatura, cosa decisamente poco elegante. Sono molto perplesso sull’utilità di questa shield così com’è. Un’alternativa potrebbe essere lo sfruttamento del pin libero per comandare una terza interfaccia SPI, ma resto dell’idea che i limiti siano decisamente troppi anche per le applicazioni più semplici. In realtà mentre vi scrivo queste parole, ho già pronta un’iniziale nuova libreria scritta da me, per incuriosirvi vi dico che è possibile anche sfruttare uno shift register per liberare 5 pin digitali . Mi serve però ancora un po’ di tempo sia per implementare nuove funzioni grafiche, sia per verificare il supporto SD e Touch di cui non mi sono ancora occupato. I risultati sono incoraggianti, ma ho ancora un bel po’ di lavoro da fare prima del prossimo articolo in cui vi illustrerò la nuova libreria. Abbiate pazienza e fra breve avrete una valida alternativa alla libreria origniale.