Abbiamo presentato una panoramica sulle più comuni tipologie di display per Arduino in ambito maker nella prima parte di questa lezione. Abbiamo, inoltre, redatto e analizzato il codice di controllo e verifica di funzionamento per lo LCD.
In questa seconda parte della lezione vedremo come utilizzare i pin analogici di Arduino in modalità digitale. Andremo quindi a collegare lo LCD 16x2 a tali pin rivedendo il piano del cablaggio e il codice di controllo. Questo consentirà di collegare al nostro allarme laser una quantità maggiore di sensori.
Pin analogici o digitali
Arduino Uno, e in genere qualsiasi scheda Arduino, dispone di una serie di GPIO digitali e analogici. Ad esempio per controllare l'accensione di un led si usa un GPIO digitale mentre, per leggere il valore restituito da una foto resistenza, si usa un piedino analogico.
Su Arduino Uno i pin analogici sono quelli con nome da A0 a A5.
Una caratteristica molto interessante di questi pin è la possibilità di essere adoperati in modo esattamente identico a normali pin digitali. Quindi potremo usare il pin analogico A0 come il pin digitale 8. È sufficiente inizializzarlo all'interno della funzione setup.
void setup() {
// imposta il pin A0 come digital output
pinMode(A0, OUTPUT);
digitalWrite(A0, HIGH);
}
Il pin A0 ora è impostato a OUTPUT. Può essere, inoltre, impostato a HIGH o LOW con il metodo digitalWrite come un qualsiasi GPIO digitale.
In modo analogo è possibile anche impostare il pin A0, o qualsiasi altro pin analogico, come input digitale e abilitare anche la resistenza di pull-up.
void setup() {
// imposta il pin A0 come digital input
// abilita la resistenza di pull-up interna
pinMode(A0, INPUT_PULLUP);
}
In questo caso abbiamo impostato il pin A0 come un normale pin digitale in input, possiamo usarlo, ad esempio, per leggere lo stato di pressione di un pulsante. Da notare come anche i pin analogici siano dotati di resistenza di pull-up interna esattamente come un qualsiasi pin digitale.
Controllo di un LCD Alfanumerico con pin analogici
Dato che i pin A0-A5 analogici sono del tutto analoghi ai pin digitali 0-13 allora è possibile sfruttarli per pilotare lo LCD 16x2.
Vediamo ora le modifiche da apportare al circuito e al codice di controllo,
Guardando il display LCD dall'alto, con il connettore orientato verso il basso, partendo dalla destra del connettore, i pin sono disposti quest'ordine: BL+, BL-, #1, #2, #3, #4, #5, #6, #7, #8, #9, #10, #11, #12, #13, #14.
Esistono variazioni nella disposizione di questi pin ma, rispetto al nome e alla numerazione, la funzionalità di ogni pin rimane invariata. Il circuito e i collegamenti da effettuare sono mostrati in figura.
Per connettere in maniera ottimale lo LCD ai pin analogici di Arduino effettuiamo i collegamenti seguenti.
Arduino pin +5V | linea + rossa sulla breadboard |
Arduino pin GND | linea - blu sulla breadboard |
Arduino pin #A0 | LCD pin #14 [DB7] |
Arduino pin #A1 | LCD pin #13 [DB6] |
Arduino pin #A2 | LCD pin #12 [DB5] |
Arduino pin #A3 | LCD pin #11 [DB4] |
Arduino pin #A4 | LCD pin #6 [E] |
GND - blu sulla breadboard | LCD pin #5 [R/W] |
Arduino pin #A5 | LCD pin #4 [RS] |
LCD pin #3 [Vo] | pin centrale del potenziometro |
LCD pin #2 [Vdd] | linea + rossa sulla breadboard (+5V) |
LCD pin #1 [Vss] | linea - blu sulla breadboard (GND) |
LCD pin #BL- | linea - blu sulla breadboard (GND) |
LCD pin #BL+ | piedino della resistenza da 220 Omh |
altro piedino resistenza | linea + rossa sulla breadboard (+5V) |
piedino destro potenziometro | linea + rossa sulla breadboard (+5V) |
piedino sinistro potenziometro | linea - blu sulla breadboard (GND) |
Anche in questo caso il potenziometro serve per regolare il contrasto dello LCD e può essere rimosso collegando il pin #3 [Vo] dello LCD direttamente a GND (linea - blu sulla breadboard).
Software di controllo
Per pilotare il display LCD tramite pin analogici, usiamo la libreria LiquidCrystal.
Di seguito il codice commentato del programma di controllo.
#include <LiquidCrystal.h>
// definizione PIN di controllo e dato
#define RS A5
#define EN A4
#define D4 A3
#define D5 A2
#define D6 A1
#define D7 A0
// instanziazione oggetto lcd
LiquidCrystal lcd(RS, EN, D4, D5, D6, D7);
void setup() {
// definzione tipo display LCD 16x2 caratteri
lcd.begin(16, 2);
// posizionamento cursore in alto a sinistra
// colonna 0, linea 0
lcd.setCursor(0, 0);
// stampa messaggio statico
lcd.print("ciao da Arduino!");
// posizionamento cursore in basso a sinistra
// colonna 0, linea 1
lcd.setCursor(0, 1);
lcd.print("UpTime: ");
}
void loop() {
// posizionamento cursore dopo la scritta UpTime
lcd.setCursor(8, 1);
// visualizzazione messaggio dinamico
lcd.print(millis() / 1000);
delay(1000);
}
Confrontando questo codice con quello della lezione precedente si può facilmente notare che il codice di controllo rimanga invariato.
Cambia solo la definizione dei pin nella parte alta del codice. Quindi il pin 8 è sostituito dal pin A0, il 9 da A1, il 10 da A2 e così via per i rimanenti piedini.
Eseguendo il codice sul display sarà presente una visualizzazione equivalente a quella riportata nella lezione precedente.
Conclusioni
In questa lezione, suddivisa in due parti, abbiamo visto come collegare un LCD 16x2 ad Arduino andando a sfruttare i pin analogici in modo da lasciare liberi i pin digitali per altri usi.
Abbiamo presntato il codice di controllo per visualizzare un messaggio statico e uno dinamico che potrà poi essere utilizzato come base di partenza per le vostre implementazioni dell'allarme laser.
L'uso dello LCD consente di utilizzare un dispositivo di output sul nostro l'allarme laser allo scopo di comunicare con l'utente finale.
Anticipazioni
Nella prossima lezione vedremo come dotare il nostro allarme di un dispositivo di input (tastierino 4x4) per inserire comandi o configurazioni.