Visualizziamo un testo su un display LCD con la scheda NucleoF401RE

Visualizziamo un testo su un display LCD

CC BY-SA 4.0 https://creativecommons.org/licenses/by-sa/4.0/

Workspace: Getting-started-with-NUCLEO-F401RE-and-mbedOS
Progetto: stm32nucleof401re_05_lcd
Materiale: Scheda NucleoF401RE - Cavo micro USB - DisplayLCD - Interfaccia I2C - cavi dupont

In questo progetto di esempio, vedremo come visualizzare messaggi su un display LCD.

Utilizziamo la toolchain già vista qui. Apriamo il progetto con un doppio click.

Il progetto contiene la cartella con il codice sorgente mbed-os, il file main.cpp, il nostro file entry-point, ed una libreria aggiuntiva, TextLCD disponibile on line su mbed e realizzata da Simon Ford per il supporto della stampa di messaggi su un display LCD.

 

Oltre ad includere la libreria mbed

#include "mbed.h"

dobbiamo includere la libreria per il supporto della stampa di messaggi di testo sul display LCD.

#include "TextLCD.h"

In questo esempio supponiamo che il display sia provvisto di una interfaccia hardware  I2C come quella in figura.

Il display viene venduto con o senza interfaccia hardware. Le due parti possono anche essere acquistate separatamente ed essere poi saldate.

Il protocollo I2C utilizza due linee, una per il clock che sincronizza la comunicazione tra i due sistemi (SCL), ed una linea dati (SDA).

I pin della scheda Nucleo dedicati al bus I2C, sono PB_9 per SDA, ed PB_8 per SCL.

Quindi dovremo collegare i pin della interfaccia I2C del display serigrafati con SDA ed SCL, rispettivamente con i pin PB_9 e PB_8 della scheda Nucleo.

NucleoF401REInterfaccia I2C display
PB_9SDA
PB_8SCL
5VVcc
GNDGND

Realizzate opportunamente le connessioni, continuiamo ad analizzare il codice sorgente.

Creiamo una istanza del driver I2C di basso livello, passando come parametri le etichette relative ai pin utilizzati.

I2C i2c_lcd(PB_9,PB_8); // SDA, SCL

Creiamo una istanza del driver di più alto livello. A questo, oltre a passare come parametri, il puntatore al driver I2C, dovremo passare l’indirizzo dello slave I2C del display, ed il tipo di display che stiamo utilizzando, nel nostro caso un display LCD16x2, ossia di 16 caratteri per ciascuna delle 2 righe.

TextLCD_I2C lcd(&i2c_lcd,SLAVEADDRESS,  TextLCD::LCD16x2); // I2C exp: I2C bus, PCF8574AT Slaveaddress, LCD Type

Per quanto riguarda l’indirizzo, questo è necessario essendo il bus I2C indirizzabile, ossia il master può raggiungere gli slave connessi al bus (SCL, SDA) in base al loro indirizzo.

L’indirizzo che utilizziamo per il nostro display è.

#define SLAVEADDRESS 0x4E 

L’indirizzo è codificato dai pin  A0,A1,A2 sulla interfaccia secondo le tabelle 4 e 5 disponibili nel datasheet

Può essere necessario regolare il contrasto del display utilizzando il trimmer evidenziato nella seguente figura.

Nella funzione main(), l’entry-point del nostro codice, troviamo l’invocazione di alcuni metodi dell’istanza lcd.

Spegniamo il cursore, non vedremo il cursore lampeggiare.

lcd.setCursor(TextLCD::CurOff_BlkOff);

Puliamo il display, rimuovendo eventuali messaggi precedenti.

lcd.cls();

Stampiamo un messaggio sulla prima riga

lcd.printf("   Welcome to");

Spostiamo il focus sul primo carattere della seconda riga

lcd.setAddress(0, 1);

Stampiamo quindi un secondo messaggio sulla seconda riga. Non avendo ripulito lo schermo vedremo entrambe i messaggi.

lcd.printf("LCD display demo");

A questo punto possiamo passare alla compilazione con un click sull’icona che rappresenta un martello 

Se tutto è andato a buon fine, tra i messaggi nella console sarà indicato il path del file binario ottenuto dalla compilazione

Per programmare la scheda Nucleo, dopo averla connessa al PC via USB, copiare il file stm32nucleof401re_05_lcd.bin, nel drive NODE_F401RE.

Una volta programmata la scheda, il messaggio verrà stampato sul display.