Feb 112014
 

Nello scorso articolo vi ho presentato il lavoro che stavo facendo su una nuova libreria nata per controllare la shield “IteadStudio 2.8”. Quest’oggi passiamo alla descrizione del suo funzionamento ed al link per il download. Nel frattempo ho deciso anche di modificare il nome della libreria, che come da titolo sarà Ss_TFT. Ricordo che Ss sono le iniziali del mio nome e cognome.

Collegamentitft2hc595

Se utilizzate la shield così com’è non dovete far altro che collegarla ad Arduino come qualunque altra shield. Vi ricordo però che su Arduino Uno vengono occupati tutti i pin rendendo di fatto la shield stessa del tutto inutile e sulla Mega non funziona l’SD per incompatibilità dei pin SPI.

Se invece decidete di farla funzionare con uno shift register, c’è un po’ di lavoro da fare. Nello specifico lo shift register viene usato solamente per collegare i pin che accedono al display vero e proprio mentre quelli usati per il touch screen e la SD continuano ad essere connessi direttamente ad Arduino.
Ciò permette comunque di risparmiare 5 pin digitali, inoltre possiamo anche decidere di non usare le funzionalità touch o l’SD risparmiando ulteriori pin. Lo schema è quello qui a lato: sopra vediamo il collegamento diretto che si ottiene usando la shield così com’è, per semplificare il disegno ho segnato solo i pin necessari al controllo del display vero e proprio, mancano perciò quelli relativi al touch screen, SD e alimentazione. Per usare l’HC595 dobbiamo arrivare allo schema di sotto. No, non spaventatevi, è molto più semplice di quello che sembra. Le uscite dello shift register, da Q0 a Q7, non fanno altro che arrivare ai pin del display, dal primo all’ottavo, in sequenza, dal primo all’ultimo, senza incroci o chissa quale strana modifica. Il disegno sembra complesso in quanto un’uscita è su un lato e le altre dall’altro, inoltre le tracce devono incrociarsi per poter combaciare con gli ingressi del display. Poi abbiamo alimentazione e massa oltre ai tre pin necessari per comandare l’HC595 (latch, clock, data) che ho disegnato in viola. Osservate lo schema con attenzione, converrete con me che è più semplice di quanto appaia a prima vista. C’è però una finezza che vi vorrei far notare. Fra i primi otto pin di arduino avrei potuto usarne tre qualunque per comandare lo shift register, eppure ho deciso di usare il 2, il 4 ed il 7. Perchè? Innanzitutto liberare i pin 0 e 1 permette di usare la porta seriale. Ciò permette sia di sfruttare il serial monitor con il PC, molto utile nelle fasi di debug, sia sfruttare la UART ad esempio per una connessione RS485 per collegarsi ad una rete di altri microcontrollori. Il pin 3 l’ho lasciato libero apposta, infatti se ricordate gli articoli sull’uso di trasmettitori e ricevitori infrarossi, ricorderete che questo pin viene usato di base dalla IR-Remote per cui potete continuare a sfruttare quanto abbiamo spiegato in altri articoli senza fare salti mortali per modificare la porta. Per lo stesso motivo ho lasciato liberi i pin 5 e 6 che permettono di sfruttare l’uscita PWN nel caso ne avessimo bisogno. Attualmente non è possibile modificare i pin nel vostro sketch ma dovete modificare l’inizializzazione della libreria prima della compilazione. Per farlo dovete editare il file Ss_TFT.cpp e pressapoco alla line 47 modificare la riga My595=new hc595(3,4,7,1); Ricordo per chi non ha letto o non ricorda come funziona la libreria Ss_hc595 che i 4 parametri sono in sequenza latch, clock, data e numero dello shift register. Come ripetuto anche più avanti, ricordo che per attivare il funzionamento attraverso lo shift register è necessario editare il file Ss_TFT.h e decommentare la linea che riporta //#define USE_HC595.

L’alto tipo di collegamento che potrei mostrarvi è come fare per sfruttare la SD sulla Mega. Se vi interessa magari vi farò un’altro articolo dedicato, per ora mi limito a quanto vi ho esposto in quanto ho voglia di rilasciare velocemente questa prima versione della libreria.

Funzionamento della libreria

Nel pacchetto di installazione sono presenti alcuni esempi che mostrano come gestire i colori, le primitive geometriche, i font, l’SD ed il touch screen per cui vi invito a dagli un’occhiata per rendervi conto delle potenzialità della libreria.

Funzione Versione Applicazione Descrizione Esempio di utilizzo
Ss_TFT 1.00 TFT / Touch Crea l’istanza iniziale per il controllo del display Ss_TFT lcd;
Initialize 1.00 TFT / Touch Inizializza il display lcd.Initialize();
CleanLCD 1.00 TFT Questa funzione cancella il contenuto dello schermo. Senza parametri utilizza il colore bianco, in alternativa può essere specificato un colore nel formato 0xRRGGBB. lcd.CleanLCD();

SetPORTRAIT

SetLANDSCAPE

1.00 TFT / Touch

Settano l’orientamento del display. Con l’instanza il display viene inizializzato per funzionare in Portrait, ossia in verticale. E’ possibile forzare il funzionamento in orizzontale (landscape). In ogni caso la coordinata 0,0 sarà lo spigolo superiore destro. Ovviamente anche le coordinate del touch screen vengono corrette modificando l’orientamento del display.

lcd.SetPORTRAIT();
SetFcolor(R,G,B); 1.00 TFT Permette di decidere il colore in primo piano. lcd.SetFcolor(0,0,0);
SetBcolor(R,G,B); 1.00 TFT Permette di decidere il colore dello sfondo. lcd.SetBcolor(255,255,255);
SetFont 1.00 TFT

Seleziona il tipo di font. La chiamata alla funzione è diverse in base a che si usi il font bitmap o quello vettoriale. Nel caso di font bitmap è sufficiente indicare il puntatore al font:

lcd.SetFont(BasicSmallFont);

extern unsigned char BasicSmallFont[];
...
lcd.SetFont(BasicSmallFont);

Se invece vogliamo usare il font vettoriale dobbiamo usare 4 parametri, che in sequenza sono il puntatore al font, la larghezza dei segmenti, la spaziatura fra i segmenti, la spaziatura aggiuntiva sull’asse X e la spaziatura aggiuntiva sull’asse Y. Questi ultimi due permettono di modificare il rapporto X/Y creando dei caratteri più allungati o più larghi a seconda delle necessità:

extern unsigned char SegmentFont[]; 
...
lcd.SetFont(SegmentFont,2,1,0); 
 
DisplayString 1.00 TFT

Scrive una stringa sul display nella posizione selezionata, usando font e colore attivi in quel momento. Nel caso di font vettoriali necessita di 3 parametri che sono: coordinata X, Y, stringa.

lcd.DisplayString(10,10,”MCMAJAN.COM”);

Se invece usiamo un font bitmap dobbiamo specificare anche un quarto parametro che ha il seguente significato: impostato a 0 scrive le lettere presentano le dimensioni originali, a 1 raddoppia la larghezza, a 2 l’altezza, a 3 entrambe.

lcd.DisplayString(10,10,”MCMAJAN.COM”,3);

 
DisplayChar 1.00 TFT

Scrive un carattere sul display nella posizione selezionata, usando font e colore attivi in quel momento. Funziona esattamente come come la DisplayString, l’unica differenza stà nel fatto che non passiamo una stringa ma un singolo carattere.

 
Line 1.00 TFT Line(); Traccia una linea del colore selezionato da x,y a x2,y2. lcd.Line(0,0,50,70);
Rect 1.00 TFT Rect(x1,y1,x2,y2); Traccia un rettango vuoto lcd.Rect(x,y,x+20,y+20);
RectFill 1.00 TFT RectFill(x1,y1,x2,y2); Traccia un rettango pieno lcd.RectFill(x,y,x+20,y+20);
Circle 1.00 TFT Circle(X,Y,R); Traccia un cerchio vuoto lcd.Circle(20,30,7);
CircleFill 1.00 TFT CircleFill(X,Y,R);Traccia un cerchio pieno lcd.CircleFill(20,30,7);
Pixel 1.00 TFT Pixel(x,y); Disegna un singolo pixel lcd.Pixel(20,87);
TouchInitial 1.00 Touch Inizializza il touch screen lcd.TouchInitial();
TouchReady 1.00 Touch Ritorna true se il touch è stato toccato ed ha delle coordinate da inviarci. if(lcd.TouchReady()) …..
TouchGetPoint 1.00 Touch Questa funzione trasforma i dati raw letti dal touch screen in coordinate X e Y corrispondenti al punto premuto sul display. Una volta usata la funzione, le coordinate X ed Y possono essere ottenute leggendo le variabili Tc_X e Tc_Y

lcd.TouchGetPoint();

int lx=lcd.Tc_X;
int ly=lcd.Tc_Y;

         
         
         

Tweak e utilità

La libreria è scritta per permettere a chiunque di accedere a tutti i suo parametri di funzionamento per poter manipolare direttamente ogni aspetto si desideri. Se la libreria avrà successo scriverò un apposito articolo su come sfruttare le opportunità offerte a basso livello dal mio software, in questa sezione mi limito solamente a segnalarvi alcune variabili che risultano molto utili per agevolare l’impaginazione.

WIDTH: rappresenta la larghezza del display in pixel.

HEIGTH: rappresenta l’altezza in pixel.

Questi due cambiano con l’orientamento del display. Se lo teniamo in verticale WIDTH rappresenterà il lato corto, ma se lo usiamo in senso orizzontale, rappresenterà il lato lungo. Facendo riferimento a questi due valori potete creare interfacce grafiche che funzionano con entrambi gli orientamenti adattandosi in maniera automatica. Se invece vi interessa il valore assoluto che non varia con la rotazione del display abbiamo altre due variabili:

WW: rappresenta i pixel del lato corto

HH: rappresenta i pixel del lato lungo

LocalFont.font_y_space: Rappresenta l’altezza in pixel del font attualmente selezionato. Utile per posizionare le scritte senza sovrapposizioni. In una prossima versione aggiungerò alcune funzioni per una migliore gestione del testo che attualmente è assai rudimentale. Esiste anche la LocalFont.font_x_space per la larghezza.

Nel file TFT.h ci sono due definizioni utili:

#define USE_HC595: di base è commentata, se viene tolto il commento la libreria utilizza uno shif register come descritto nel diagramma più sopra.
#define SS_USEDIRECTPORT: la libreria è settata per usare la programmazione diretta delle porta. SE avete board diverse dalla Arduino Uno o Mega potreste scoprire inaspettati problemi di compatibilità. In questi casi potete commentare questa definizione così verranno utilizzate le chiamate FastArduino anziché la programmazione diretta, cosa che migliorerà la compatibilità a fronte di un importante calo prestazionale. A sua volta la FastArduino permette di dirottare le chiamate alle funzioni native di Arduino, aumentando ulteriormente la compatibilità con ulteriore perdita prestazionale.

Calibrazione del TouchScreen

Ovviamente la libreria è già calibrata e in linea di massima non dovrebbe essere necessario eseguire alcun processo di calibrazione. Nel caso però notiate che il tocco non vi sembra molto preciso, vi spiego come fare.Compilate ed inviate ad Arduino l’esempio “Calibrate” incluso nella libreria. Una volta avviato questo software, toccando il display ci saranno dei puntini azzurri che seguono il vostro tocco e verranno visualizzate delle coordinate. Quelle che vi interessano sono rx ed ry. Dovete andare ai 4 estremi del display ed annotare i valori minimi e massimi di rx ed ry. Per farlo vi consiglio di usare un pennino a punta sottile in quanto le dita non sono molto precise. Una volta annotati questi valori dovete editare il file Ss_TFT.cpp e dentro il costruttore (Ss_TFT::Ss_TFT()) andrete a modificare i valori TouchRawCalibX, TouchRawCalibXX, TouchRawCalibY e TouchRawCalibYY che di base valgono 160, 3930, 210, 3720. Purtroppo la precisione del touch lungo i profili non è molto accurata, per questo motivo vi consiglio, nelle vostre applicazioni, di lasciare un margine di una decina di pixel lungo i bordi da non usare come area sensibile. I valori Raw letti dal touchscreen sono utilizzabili anche in modo diretto nella vostra applicazione per cui è possibile lavorare anche a più basso livello con questi dati.

Il video

Vi ho preparato un video che mostra la mia libreria in funzione, non sono altro che gli esempi inclusi con la libreria mostrati in video. Ovviamente ho usato l’Arduino Uno e la programmazione diretta delle porte per dimostrare la massima velocità ottenibile.

Benchmark

Ho creato uno sketch da usare per il benchmark prestazionale. In questo modo potete valutare almeno a spanne, la differenza che otteniamo fra una scheda e l’altra con i diversi metodi di programmazione. Con base si intende l’uso delle funzioni base di Arduino, con FastArduino l’uso della mia versione modificata della digital read e write, e con directport la programmazione diretta delle porte. Sul versante prestazioni ho lavorato già tantissimo per cui non aspettatevi ulteriori miracolosi miglioramenti nel futuro. Faccio notare che attualmente non ci sono dati sulla Arduino DUE in quanto ci sono delle incompatibilità software che ne impediscono il funzionamento e che cercherò di risolvere nelle prossime versioni.

  Base FastArduino DirectPort
Uno 38026 28178 1920
Mega 51281 28763 4423
74HC595 191718 25052
Due ? ? ?

Altre compatibilità

La libreria molto probabilmente è compatibile anche con altre shield, per cui, dato che io non ho molto hardware a disposizione e non ho certo la disponibilità economica per procurarmi ogni tipo di display sulla faccia della terra, se testate la libreria con una shield diversa con successo mi farebbe piacere saperlo, così potrei scriverlo su queste pagine. Se invece sei un’azienda che produce display (o cloni Arduino) e vorresti vedere questa libreria compatibile con il tuo prodotto non devi far altro che contattarmi. In linea di massima mi accontento di avere due copie omaggio della shield / display / board e non disdegnerei una piccola donazione di ringraziamento :-). Ovviamente, a meno che non si tratti di “donazioni consistenti”, è tutto lavoro che faccio nel tempo libero e come tale richiede alcuni mesi di lavoro.

Download

Come saprete attualmente ho scritto più di una libreria e spesso queste sono fra loro correlate. Ad esempio questa libreria sfrutta sia la Ss_FastArduino che la Ss_hc595 per cui per non farvi fare multipli download e rischiare poi di avere versioni non aggiornate ed incompatibili fra loro, ho deciso di creare un pacchetto di librerie che di volta in volta aggiornerò, in questo modo ci sarà maggior coerenza e minor rischio di errori. Il link è perciò stato spostato a questa pagina.

  2 Responses to “Libreria Ss_TFT – it”

  1.  

    Buongiorno, ieri ho fatto i miei primi acquisti per iniziare a “smanettare” con l’arduino.. Nel frattempo che aspetto che arrivi il tutto ho trovato il tuo sito da cui sicuramente farò tesoro di molte informazioni. Oltre a leggere e basta mi sembrava doveroso iscrivermi per lasciare un ringraziamento per il tempo che dedichi sui questi progetti, davvero complimenti!

    Un saluto,
    Manuel

    •  

      Non posso che ringraziarti. Commenti come questo mi fanno sempre molto piacere, è sempre bello vedere che qualcuno apprezza il lavoro che faccio. Buoni esperimenti allora, e se ti serve una mano fai un fischio, prima o poi rispondo.

      Ciao
      Stefano