Parte 4 di 5 configuriamo il touch
In questa lezione, dopo la aver configurato la parte grafica, passiamo al setup del touch.
La lezione è divisa in due parti, una di configurazione e calibrazione molto breve, ed una seconda dedicata alla compilazione un semplice sketch.
Materiale Necessario
Se siete interessati al materiale, cliccate su questo e sarete indirizzati alla pagina Amazon
Come per la parte grafica anche per il touch la cosa non è immediata, inoltre occorre ottenere dal display dei dati, che serviranno per la calibrazione, questo lo si fa tramite un esempio presente nella libreria MCUFRIEND.
Carico lo sketch in Arduino (TouchScreen_Calibr_native.ino), seguo i comandi sul display ed a fine calibrazione ho i dati che ci serviranno per lo sketch.
Le righe che mi interessano sono:
const int XP=8,XM=A2,YP=A3,YM=9; //240×320 ID=0x9341
const int TS_LEFT=187,TS_RT=976,TS_TOP=227,TS_BOT=913;
La prima riga: const int XP=8,XM=A2,YP=A3,YM=9; //240×320 ID=0x9341
indica che il touch del display è collegata ai pin analogici A2 ed A3 di Arduino.
Mentre nella seconda: const int TS_LEFT=187,TS_RT=976,TS_TOP=227,TS_BOT=913;
Indica i valori minimi e massimi dell’asse X ed Y.
La parte di Setup è terminata e posso passare alla compilazione dello sketch, come prima cosa installo la libreria Adrafruit touchscreen, che verrà inserita nello sketch con il nome TouchScreen.h.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
#include <MCUFRIEND_kbv.h> MCUFRIEND_kbv tft; #include <TouchScreen.h> char *name = "My LCD"; const int XP=8,XM=A2,YP=A3,YM=9; //240x320 ID=0x9341 const int TS_LEFT=187,TS_RT=976,TS_TOP=227,TS_BOT=913; TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); TSPoint tp; #define MINPRESSURE 200 #define MAXPRESSURE 1000 #define BLACK 0x0000 #define BLUE 0x001F #define RED 0xF800 #define GREEN 0x07E0 #define CYAN 0x07FF #define MAGENTA 0xF81F #define YELLOW 0xFFE0 #define WHITE 0xFFFF void setup() { int id = tft.readID(); if (id == 0xD3D3) id = 0x9486; tft.begin(id); tft.setRotation(0); tft.fillScreen(BLACK); } void loop() { tp = ts.getPoint(); pinMode(YP, OUTPUT); pinMode(XM, OUTPUT); digitalWrite(YP, HIGH); digitalWrite(XM, HIGH); if ((tp.z > MINPRESSURE) && (tp.z < MAXPRESSURE)) { int px = map(tp.x, TS_LEFT, TS_RT, 0, tft.width()); int py = map(tp.y, TS_TOP, TS_BOT, 0, tft.height()); tft.fillCircle(px, py, 5, WHITE); } } |
Analizziamo il codice:
1 2 3 4 5 6 7 8 9 |
char *name = "My LCD"; const int XP=8,XM=A2,YP=A3,YM=9; //240x320 ID=0x9341 const int TS_LEFT=98,TS_RT=918,TS_TOP=75,TS_BOT=888; TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); TSPoint tp; #define MINPRESSURE 200 #define MAXPRESSURE 1000 |
Salto la parte dove inserisco le librerie e passo a quella successiva.
Inserisco una variabile di tipo char, che serve a dare il nome al display, una cosa un pò strana ma richiesta dalla libreria.
Copio ed incollo le due righe precedenti ed infine “creo” il touch inserendo un oggetto di nome touchScreen che è formato dai pin dati da una delle righe.
Creo un secondo oggetto per salvare i punti premuti sul display, come ultima cosa inserisco i valori di pressione massima e minima che posso essere letti dal touch ed inserisco dei colori.
1 2 3 4 5 6 7 8 |
void setup() { int id = tft.readID(); if (id == 0xD3D3) id = 0x9486; tft.begin(id); tft.setRotation(0); tft.fillScreen(BLACK); } |
Nel setup, come per la parte grafica chiedo l’ID al display e lo salvo nella variabile “id”.
Imposto il monitor in verticale (setRotation(0)), e lo sfondo nero.
1 2 3 4 5 6 7 8 9 |
void loop() { tp = ts.getPoint(); pinMode(YP, OUTPUT); pinMode(XM, OUTPUT); digitalWrite(YP, HIGH); digitalWrite(XM, HIGH); tft.fillCircle(px, py, 5, WHITE); |
Passo al void, leggo lo stato del touch, successivamente visto che i pin del display e del touch sono condivisi, dopo aver letto il pin dal touch, indico gli stessi (YP e XM) come uscite e in modalità HIGH, così da permettere al display di poterli usare.
Senza questo passaggio, non avendo permesso ad Arduino di inviare la parte grafica al display, ci sarebbe solo una lettura della pressione e niente altro, senza quindi un ritorno grafico nel display.
1 2 3 |
if ((tp.z > MINPRESSURE) && (tp.z < MAXPRESSURE)) { int px = map(tp.x, TS_LEFT, TS_RT, 0, tft.width()); int py = map(tp.y, TS_TOP, TS_BOT, 0, tft.height()); |
Il touch del display è di tipo resistivo, questo volendo fare un esempio pratico, è come se ai due pin di Arduino ci fossero dei potenziometri, che mandano ad Arduino, se non usati, dei valori massimi e dei valori variabili se usati.
All’interno di if, inserisco una variabile tp.z questo è il valore di pressione sul touch, se questo è compreso tra il valore minimo e massimo impostati ad inizio sketch, Arduino procede con i comandi contenuti dentro l’if.
I comandi dentro l’if non sono altro che la mappatura del punto premuto, alla pressione del touch Arduino non legge le coordinate sullo schermo, ma legge due valori (uno per x ed uno per Y), che vanno da 0 a 1024, che vanno poi convertiti in coordinate in formato pixel.
La coordinata per l’asse X è data dal valore tp.x, compreso tra i valori dichiarati ad inizio sketches (TS_LEFT e TS_RT), convertito in un valore pixel compreso tra 0 e tft.width() (la larghezza dello schermo).
Stessa cosa avviene per l’asse Y usando però i valori TS_TOP e TS_BOT, e convertito in un valore compreso tra 0 e tft.height (l’altezza dello schermo).
L’ultima riga del loop da la forma del segno che lascio sul touch alla pressione, in questo caso è di forma circolare con centro del segno dato dai valori px e py, il segno avrà raggio 5px e sarà di colore bianco.
Riporto i link delle altre lezioni collegate a questo tipo di display:
- Lezione 1 di 5 dedicata alla configurazione generale: Parte generale
- Lezione 2 di 5 dedicata alla configurazione del display: Parte Grafica
- Lezione 3 di 5 dedicata al disegno e coordinate: Disegno e coordinate
- Lezione 5 di 5 dedicata alla configurazione del lettore SD: in lavorazione
Nella pagina sono presenti link di affiliazione su cui si ottiene una piccola quota dei ricavi, senza variazioni dei prezzi.