In questo articolo impareremo a pilotare un popolarissimo diplay LCD 1602A basato su driver Hitachi HD44780.
Il display in questione viene solitamente venduto nella versione a 5v (per via del voltaggio usato dal driver Hitachi), ma molti non sanno che è possibile convertirlo in modo abbastanza semplice in versione 3.3v, per essere utilizzato ad esempio con Arduino Nano, Arduino Pro Mini, Arduino Micro, o qualsiasi board originale o clone che funzioni a 3.3v.

Perchè 3.3v? Perchè al giorno d’oggi, molti nuovi sensori pensati per applicazioni IoT funzionano a 3.3v, e se volessimo aggiungere un display LCD, dovremo convertire il 1602A per essere utilizzato a tale voltaggio.

MATERIALI

  • 1 x board arduino (qualunque versione)
  • 1 x display 16×2 LCD 1602A
  • 1 x breadboard
  • 1 x potenziometro 50k ohm (opzionale, anche altri valori di resistenza vanno bene)
  • 1 x ICL7660 SMD o compatibili (opzionale, per conversione a 3.3v)
  • 2 x condensatore ceramico SMD 10uF (opzionale, per conversione a 3.3v)

IL 1602A

1602A_front

Quello che vediamo è un classico display LCD 16×2 1602A. Possiede 16 contatti, 8 dei quali (da D0 a D7, pin da 7 a 14) sono riservati al bus dati digitale. Gli altri svolgono varie funzioni che andremo a vedere di seguito:

  • VSS (1): ground
  • VDD (2): +5v
  • V0 (3): contrasto. Viene collegato a una resistenza o potenziometro per variare il contrasto, regolando la tensione da 0 a 5v
  • RS (4): segnale Registry Select, utilizzato per il controllo dell’LCD
  • RW (5): segnale di Read/Write, per selezionare la modalità di funzionamento; nel nostro caso verrà colegato a GND per permettere la scrittura sul display LCD
  • E (6): segnale Enable, per abilitare la scrittura nel registro
  • D0-D7 (7-14): Data bus; può funzionare a 4 bit utilizzando solo D4-D7 o a 8 bit utilizzando D0-D7
  • A (15): anodo per il LED della retroilluminazione
  • K (16): catodo per il LED della retroilluminazione

Come si vede, il funzionamento può essere a 4bit o 8bit, a seconda dei piedini usati. La differenza è che a 8bit la velocità di aggiornamento sarà superiore, ma con lo “svantaggio” di consumare 8 porte della scheda Arduino invece che 4 per il bus dati. A seconda quindi dell’applicazione, preferiremo una modalità piuttosto che un’altra.

CONVERTIRE IL 1602A a 3.3v

1602A_back

Nella sua versione standard il 1602A funziona a 5v. Guardando attentamente il lato componenti però, vediamo sul lato sinistro alcune piste non collegate, in particolare quelle relative a U3, C1 e C2.

Per convertire il 1602A dovremo installare su U3 un convertitore di livello come ICL7660 o compatibili (es. MAX660, MAX1044, ecc.), e su C1 e C2 due condensatori che servono al funzionamento dello stesso (un buon valore per C1 e C2 è 10uF).

Vi sono diverse versioni di board ma purtroppo non le possiedo per poterle fotografare; la posizione di tali componenti può essere spostata ma studiando bene il lato componenti si può facilmente ricavare per analogia dove vanno posizionati.

Un paio di note aggiuntive:

  1. sul lato componenti vi sono anche 3 “jumper” J1, J2 e J3. Per il funzionamento a 5v, J1=closed, J2=J3=open, mentre per il funzionamento a 3.3v abbiamo J1=J2=open, J3=closed.
  2. in dipendenza dai modelli, R8 può essere presente o assente. Tale resistenza serve per il led della retroilluminazione; se assente, è possibile saldare una resistenza SMD su R8 (100-330 ohm) in modo da non doverne utilizzare una esterna al display.

Andiamo allora a saldare i componenti sopra elencati, ad aprire J1 e chiudere J3. La board risultante dovrà avere questo aspetto:

1602A_3.3v

Come nota di chiusura, prima di passare alle connessioni e al codice, sulla striscia di piedini da 1 a 16 possiamo saldare una stripline con i piedini che “spuntano” dal lato componenti, in modo da poter fissare il display alla breadboard.

COLLEGAMENTI

Nell’esempio che segue il bus dati utilizzato è a 4bit, per poter risparmiare 4 porte di Arduino. Il collegamento a 8bit è riservato ad applicazioni che richiedono una refresh rate più elevato, e può essere ricavato per analogia.

Nota aggiuntiva: nelle foto la scheda Arduino utilizzata è una Cactus Micro Rev2 basata su ATMega32U4, con modulo ESP8266 integrato, della quale avremo modo di parlare nei prossimi articoli. Può comunque essere utilizzata qualunque scheda Arduino. Inoltre, sono presenti sulla breadboard altri componenti (un lettore RFID e un lettore di impronte digitali) che analogamente verranno trattati in articoli successivi.

Per poter pilotare il display LCD (a 4bit) dovremo collegare i suoi pin come segue:

  • LCD 1 / LCD 5 / LCD 16 -> GND
  • LCD 2 -> +5v
  • LCD 3 -> potenziometro (gli altri due pin del potenziometro collegati a +5v e GND)
  • LCD 4 / LCD 6 / LCD 10-13 -> porte digitali di Arduino
  • LCD 15 -> porta analogica di Arduino (oppure a +5v per retroilluminazione fissa)

Di seguito lo schema grafico:

Senzanome

Nello schema del circuito, ho utilizzato una board Arduino Uno rev3 standard per semplicità; tuttavia potete utilizzare quello che preferite. Le porte Arduino utilizzate in questo esempio sono da D2-D3-D4-D5 per il bus dati, D12 per RS, D11 per E e la porta A0 per la retroilluminazione.

Di seguito un’immagine del collegamento reale su breadboard (Nota 1: il potenziometro in questo circuito é stato omesso e il pin 3 é N/C, lasciando quindi il contrasto al minimo. Nota 2: le porte utilizzate sono leggermente diverse poichè la board è differente e sono collegate altre periferiche, ma questo verrà trattato nei successivi articoli).

cactus-micro_LCD_RFID_FPS

CODICE

Per poter pilotare il display LCD utilizzeremo la libreria LiquidCrystal.h fornita con la distribuzione standard di Arduino IDE.

Scriveremo una frase sul display e faremo accendere e spegnere la retroilluminazione. Vediamo nel dettaglio il codice commentato:

/* Pilotare un LCD 16x2 con Arduino
Collegamenti dell'LCD per funzionamento a 4 bit:
VSS -> GND
VDD -> +5v
V0 -> al potenziometro
RS -> Arduino D12
R/W -> GND
E -> Arduino D11
D0 -> N/C
D1 -> N/C
D2 -> N/C
D3 -> N/C
D4 -> Arduino D2
D5 -> Arduino D3
D6 -> Arduino D4
D7 -> Arduino D5
A -> Arduino A0
K -> GND
*/

// includiamo la libreria
#include <LiquidCrystal.h>;

// Creiamo l'oggetto "lcd" inizializzandolo come richiesto dalla libreria, ovvero:
// LiquidCrystal(rs, enable, d4, d5, d6, d7)
LiquidCrystal lcd(12, 11, 2, 3, 4, 5);


void setup() {

// impostiamo ad output l'uscita per la retroilluminazione
pinMode(A0, OUTPUT);

//impostiamo numero di colonne e righe dell'lcd a (colonne, righe)
lcd.begin(16, 2);

// Visualizziamo un messaggio sul display
lcd.print("RobotStore.it");

}

void loop() {

// posizioniamo il cursore a (colonna, riga)
// nota: (0, 1) significa prima colonna e seconda riga, poichè il conteggio parte da 0
lcd.setCursor(0, 1);

// Visualizziamo il conteggio dei secondi
lcd.print(millis()/1000);

// Accendiamo la retroilluminazione per 1 secondo
digitalWrite(A0, HIGH);
delay(1000);

// Spegniamo la retroilluminazione per 1 secondo
digitalWrite(A0, LOW);
delay(1000);

}

Una volta caricato il programma e inizializzato l’Arduino, vedremo la scritta “RobotStore.it” apparire nella prima riga, mentre nella seconda riga apparirà il conteggio dei secondi, con la retroilluminazione che si accenderà e spegnerà ad intervalli di 1 secondo.

La libreria LiquidCrystal contiene molte altre funzioni con cui è possibile sperimentare; al link proposto troverete la library reference che contiene anche molti esempi di quello che è possibile fare.

Alla prossima puntata, dove vedremo come utilizzare un lettore di RFID / NFC con Arduino… Stay Tuned!

teohell