Skip to Content

Interfacciare Arduino con un Display E-ink

Interfacciare Arduino con un Display E-ink

In questo tutorial imparerai come interfacciare un display E-ink a tre colori con un Arduino o un ESP32.

L’E-Ink, o carta elettronica (E-Paper), è una tecnologia di display che imita l’aspetto dell’inchiostro su carta. Utilizza piccole microcapsule riempite con particelle colorate. Quando viene applicato un campo elettrico, le particelle si spostano verso la superficie, creando testo e immagini.

La carta elettronica offre diversi vantaggi. Il suo basso consumo energetico permette ai dispositivi di funzionare per settimane o mesi con una singola carica. Il display imita la carta tradizionale, offrendo un’eccellente leggibilità alla luce diretta del sole e ampi angoli di visualizzazione senza riflessi. Inoltre, l’E-Paper è sottile e leggero. Tuttavia, ha un refresh lento, una gamma di colori limitata ed è relativamente costoso.

Componenti necessari

Ti servirà un display E-Paper e per questo tutorial ho scelto un display a 3 colori, da 2,9 pollici, con risoluzione 296×128 pixel. Tuttavia, potresti anche usare un E-Paper monocromatico di dimensioni diverse.

Collegheremo l’E-Paper a un Arduino e a un ESP32. Praticamente qualsiasi modello di Arduino o ESP32 funzionerà, ma l’ESP32 è la scelta migliore. L’ESP32 lite elencato qui sotto è particolarmente adatto, poiché ha un’interfaccia per batteria e gli E-Paper sono ideali per progetti alimentati a batteria.

Display E-Paper tri-color da 2,9″

Arduino

Arduino Uno

USB Data Sync cable Arduino

Cavo USB per Arduino UNO

ESP32 lite Lolin32

ESP32 lite

USB data cable

Cavo dati USB

Dupont wire set

Set di fili Dupont

Half_breadboard56a

Breadboard

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Nozioni di base sui display e-Paper

La tecnologia e-paper si basa sulla tecnologia Microcapsule Electrophoretic Display (EPD). Il foglio di e-paper è composto da uno strato trasparente di polimero conduttivo che funge da elettrodo frontale, insieme a milioni di microcapsule, ciascuna circa del diametro di un capello umano, incorporate in un materiale polimerico. Queste microcapsule contengono particelle o pigmenti colorati (nero, bianco, …) in un fluido trasparente. Il foglio di e-paper è poi laminato su un substrato, che funge da elettrodo inferiore.

e-Paper System
Sistema E-Paper (source)

L’elettrodo inferiore è tipicamente diviso in segmenti o pixel, permettendo il controllo indipendente della tensione su ciascun segmento. Questa capacità consente al display di formare varie immagini. Una volta creata un’immagine, la tensione può essere rimossa e le particelle rimarranno nelle loro posizioni attuali. Questa caratteristica permette a un e-paper di mantenere un’immagine statica senza consumare energia.

Sistema a due pigmenti

In un sistema di inchiostro elettronico a due pigmenti, ogni microcapsula contiene particelle bianche caricate negativamente e particelle nere caricate positivamente sospese in un fluido trasparente. Quando viene applicato un campo elettrico, positivo o negativo, le particelle corrispondenti migrano verso la parte superiore della microcapsula. Questo movimento rende le particelle visibili, facendo apparire la superficie bianca o nera in quel punto specifico.

Two Pigment System
Sistema a due pigmenti (source)

Controllando i campi elettrici applicati a ogni microcapsula, il display può mostrare una gamma di sfumature di grigio, tuttavia la maggior parte degli E-Paper monocromatici supporta solo bianco e nero.

Sistema a tre pigmenti

Un sistema di inchiostro elettronico a tre pigmenti amplia i principi del sistema a due pigmenti incorporando un colore aggiuntivo. In questo sistema, le microcapsule o microcupole contengono particelle bianche caricate negativamente, particelle nere caricate positivamente e un terzo set di pigmenti carichi positivamente, tipicamente rossi o gialli.

Three Pigment System
Sistema a tre pigmenti (source)

Quando viene applicato un campo elettrico, le particelle rispondono in base alla loro carica. Per esempio, un campo elettrico negativo farà salire le particelle rosse cariche positivamente in superficie. Una carica divisa farà salire le particelle nere in cima. E una carica positiva porterà le particelle bianche in primo piano.

Modulo display E-Paper tri-color da 2,9″

Se vuoi controllare un E-Paper da un microcontrollore, ti serve un driver che gestisca i campi elettrici per il display. Puoi acquistare l’E-Paper e il driver separatamente o come modulo che integra E-Paper e driver in un’unica unità.

Il modulo display che usiamo in questo tutorial è un display tri-color (bianco, nero, rosso) da 2,9 pollici, con risoluzione 296×128 pixel e un controller integrato con un’interfaccia SPI per la comunicazione. L’immagine sotto mostra il fronte e il retro del modulo display:

Fronte e retro del modulo display e-Paper

Nota che il modulo ha un piccolo jumper/interruttore sul retro per passare da SPI a 4 fili a SPI a 3 fili. Useremo il default a 4 fili SPI qui. Quindi non dovresti dover cambiare nulla.

Back of e-Paper module with SPI-interface and controller
Retro del modulo e-Paper con interfaccia SPI e controller

Il modulo display funziona a 3,3V o 5V, con un consumo in standby di 0,017mW e consuma circa 26,4mW durante il refresh. Il tempo per un refresh completo è di 15 secondi e il refresh parziale non è supportato. Se vuoi saperne di più sulle differenze tra refresh completo e parziale, dai un’occhiata al nostro Partial Refresh of e-Paper Display tutorial.

Pinout del display e-Paper

Il modello display ha un connettore a 8 pin per SPI comunicazione e alimentazione con i seguenti pin:

Pinout of e-Paper Display
Pinout del display e-Paper

BUSY indica che il display è occupato a rinfrescare il contenuto. RST sta per Reset. DC è il pin Data Command, CS è il Chip Select, e CLK è il pin Clock. DIN è il pin Data Input. VCC e GND sono per l’alimentazione. Il display ha un regolatore di tensione integrato e puoi alimentarlo a 3,3V o 5V.

Installazione della libreria GxEPD2 per e-Paper

Prima di poter disegnare o scrivere sull’E-Paper dobbiamo install two libraries. La libreria Adafruit_GFX è una libreria grafica di base che fornisce un set comune di primitive grafiche (testo, punti, linee, cerchi, ecc.). E la libreria GxEPD2 fornisce il driver grafico per controllare un E-Paper via SPI.

Apri il Library Manger, cerca “Adafruit_GFX” e “GxEPD2” e premi “INSTALL”. Dopo l’installazione le librerie dovrebbero apparire nel Library Manager come segue.

Adafruit_GFX and GxEPD2 libraries in Library Manager
Librerie Adafruit_GFX e GxEPD2 nel Library Manager

Nelle due sezioni seguenti ti mostrerò come collegare il display E-Paper a un ESP32 o a un Arduino. L’ESP32 è preferibile all’Arduino, poiché ha una memoria molto più grande, che semplifica il codice.

Collegamento del display e-Paper all’ESP32

L’immagine sotto mostra come collegare un ESP32 lite al display E-Paper. Mentre la maggior parte dei pin può essere configurata, devi conoscere i pin SPI di default per la tua scheda ESP32, in particolare per i segnali DIN e CLK. Nel caso dell’ESP32 lite, DIN è al pin 23 e CLK al pin 18.

Connecting e-Paper to ESP32 via SPI
Collegamento E-Paper a ESP32 via SPI

Se hai bisogno di aiuto per trovare i pin SPI di default, dai un’occhiata al Find I2C and SPI default pins tutorial.

La tabella seguente mostra tutte le connessioni da effettuare. Nota che puoi alimentare il modulo display con 3,3V o 5V ma l’ESP32-lite ha solo un’uscita a 3,3V.

Display e-PaperESP32 lite
CS/SS5
SCL/SCK 18
SDA/DIN/MOSI23
BUSY15
RES/RST2
DC0
VCC3.3V
GNDG

Puoi usare una breadboard per collegare tutto. Ma io ho collegato il display direttamente all’ESP32 con fili Dupont. L’immagine sotto mostra come era il mio setup.

Wiring of E-Paper with ESP32 lite
Collegamento E-Paper con ESP32 lite

Codice di test per e-Paper con ESP32

Ora scriviamo un codice semplice per testare il funzionamento del display. Mostreremo il testo “Makerguides”, con “Maker” in nero e “guides” in rosso.

#include "GxEPD2_3C.h"

#define EPD_CS 5  
#define EPD_DC 0  
#define EPD_RST 2  
#define EPD_BUSY 15  
// SCL/SCK/CLK  = 18,
// SDA/DIN/MOSI = 23

GxEPD2_3C<GxEPD2_290_C90c, GxEPD2_290_C90c::HEIGHT> 
  epd(GxEPD2_290_C90c(EPD_CS , EPD_DC, EPD_RST, EPD_BUSY));

void setup() {
  epd.init(115200);
  epd.setRotation(1);
  
  epd.setTextSize(2);
  epd.setFullWindow();
  epd.fillScreen(GxEPD_WHITE);     

  epd.setCursor(80, 60);
  epd.setTextColor(GxEPD_BLACK);
  epd.print("Maker"); 

  epd.setCursor(140, 60);
  epd.setTextColor(GxEPD_RED);
  epd.print("guides");   

  epd.display();
  epd.hibernate();
}

void loop() {}

Suddividiamo il codice nelle sue parti per una migliore comprensione.

Inclusione librerie

Iniziamo includendo la libreria necessaria per controllare il display E-Paper. La libreria GxEPD2_3C.h fornisce le funzioni per interagire con il display tri-color.

#include "GxEPD2_3C.h"

Se hai un display a 4 colori includeresti GxEPD2_4C.h o GxEPD2_7C.h per un display a 7 colori. Se hai un e-Paper bianco e nero (BW), includi GxEPD2_BW.h

Definizione pin

Poi definiamo i pin usati per collegare il display all’ESP32 tramite l’interfaccia SPI:

#define EPD_CS 5  
#define EPD_DC 0  
#define EPD_RST 2  
#define EPD_BUSY 15  

Creazione oggetto display

Creiamo un’istanza dell’oggetto display E-Paper usando i pin definiti. I parametri template specificano anche il tipo di display e la sua altezza.

GxEPD2_3C<GxEPD2_290_C90c, GxEPD2_290_C90c::HEIGHT>
  epd(GxEPD2_290_C90c(EPD_CS , EPD_DC, EPD_RST, EPD_BUSY));

Questa è la riga più critica del codice. Se il display non mostra nulla o testo/immagini corrotte, significa che il display non è cablato correttamente o è stato scelto il driver sbagliato.

La Readme for GxEPD2 libreria elenca tutti i display supportati e puoi trovare i dettagli nei file header, ad esempio GxEPD2.h. Trova il driver specifico per il tuo display. Potrebbe richiedere qualche tentativo.

Funzione setup

Nella funzione setup() inizializziamo la comunicazione con il display con baud rate 115200. Impostiamo anche la rotazione del display a 1 (90 gradi), cioè modalità Landscape.

epd.init(115200);
epd.setRotation(1);

Configuriamo la dimensione del testo e prepariamo il display per il disegno.

epd.setTextSize(2);
epd.setFullWindow();
epd.fillScreen(GxEPD_WHITE);     

Impostiamo la posizione del cursore e il colore del testo a nero prima di stampare “Maker” sul display.

epd.setCursor(80, 60);
epd.setTextColor(GxEPD_BLACK);
epd.print("Maker"); 

Poi cambiamo la posizione del cursore e il colore del testo a rosso per stampare “guides”.

epd.setCursor(140, 60);
epd.setTextColor(GxEPD_RED);
epd.print("guides");   

Entrambi i comandi di stampa insieme stamperanno il testo “Makerguides” al centro del display. L’output sul tuo display dovrebbe apparire così:

Output on e-Paper display
Output sul display E-Paper

Infine, chiamiamo epd.display() per rendere il testo sullo schermo e mettere il display in modalità ibernazione per risparmiare energia.

epd.display();
epd.hibernate();

Funzione loop

La funzione loop() è vuota in questo esempio, poiché dobbiamo solo inizializzare e mostrare il testo una volta. Il display rimarrà in uno stato a basso consumo e continuerà a mostrare il testo, anche se l’alimentazione viene completamente rimossa.

void loop() {}

Se carichi ed esegui il codice vedrai il display lampeggiare per circa 15 secondi, mentre il testo emerge lentamente (vedi il breve video qui sotto).

Refresh completo del display E-Paper

Questo si chiama “refresh completo” e pulisce l’intero schermo ridisegnando tutti i pixel. Questo processo assicura che eventuali immagini residue o ghosting vengano eliminati.

Un “refresh parziale”, invece, aggiorna solo aree specifiche dello schermo. Questo metodo è molto più veloce (< 0,3 sec) e evita il lampeggiamento. Per esempi, vedi il Partial Refresh of e-Paper Display tutorial.

Mentre i refresh parziali sono comunemente supportati dai display e-Paper monocromatici, molti display tri-color, incluso quello usato in questo progetto, non li supportano. Questo limita il loro uso a casi in cui gli aggiornamenti sono rari, ad esempio una volta all’ora. Altrimenti il lampeggiamento e il refresh lento risultano troppo fastidiosi.

Collegamento del display E-Paper ad Arduino

In questa sezione colleghiamo il display E-Paper a un Arduino Uno invece che a un ESP32. Il numero di connessioni da fare è lo stesso, cambiano solo i pin. Come detto, la maggior parte dei pin può essere configurata, ma per le linee DIN e CLK dobbiamo usare i pin SPI specifici. Nel caso di Arduino Uno, DIN è al pin 11 e CLK al pin 13.

Connecting E-Paper to Arduino Uno via SPI
Collegamento E-Paper ad Arduino Uno via SPI

La tabella seguente elenca tutte le altre connessioni da fare. Per l’alimentazione puoi usare 5V invece di 3,3V.

Display e-PaperArduino UNO
CS/SS4
SCL/SCK/CLK13
SDA/DIN/MOSI11
BUSY7
RES/RST6
DC5
VCC3.3V
GNDG

Codice di test per E-Paper con Arduino Uno

Il codice per testare l’E-Paper con Arduino Uno è simile a quello per ESP32, con due differenze importanti dovute alla limitata memoria di Arduino Uno.

Dai prima un’occhiata veloce al codice e magari leggi l’esempio ESP32 per contesto. Poi discuteremo le differenze.

#include "GxEPD2_3C.h"

#define EPD_CS 4
#define EPD_DC 5
#define EPD_RST 6
#define EPD_BUSY 7
// SCL/SCK/CLK  = 13,
// SDA/DIN/MOSI = 11

#define MAX_BUFF 1024
#define MAX_HEIGHT(EPD) ((MAX_BUFF / 2) / (EPD::WIDTH / 8))

GxEPD2_3C<GxEPD2_290_C90c, MAX_HEIGHT(GxEPD2_290_C90c)>
   epd(GxEPD2_290_C90c(EPD_CS, EPD_DC, EPD_RST, EPD_BUSY));

void setup() {
  epd.init(115200);
  epd.setRotation(1);
  epd.setTextSize(2);
  epd.setFullWindow();

  epd.firstPage();
  do {
    epd.fillScreen(GxEPD_WHITE);

    epd.setCursor(80, 60);
    epd.setTextColor(GxEPD_BLACK);
    epd.print("Maker");

    epd.setCursor(140, 60);
    epd.setTextColor(GxEPD_RED);
    epd.print("guides");

  } while (epd.nextPage());
  epd.hibernate();
}

void loop() {}

Come prima, il codice scrive il testo “Makerguides” in nero e rosso sul display. Tuttavia, il modo in cui viene creato l’oggetto display è diverso. In particolare, dobbiamo definire l’altezza (MAX_HEIGHT) del display:

#define MAX_BUFF 1024
#define MAX_HEIGHT(EPD) ((MAX_BUFF / 2) / (EPD::WIDTH / 8))

GxEPD2_3C<GxEPD2_290_C90c, MAX_HEIGHT(GxEPD2_290_C90c)>
   epd(GxEPD2_290_C90c(EPD_CS, EPD_DC, EPD_RST, EPD_BUSY));

Il display E-Paper ha una risoluzione di 296 * 128 pixel, quindi un totale di 37888 pixel da impostare per aggiornare il contenuto mostrato. Tipicamente, il contenuto viene scritto prima in un buffer e poi inviato al display. Tuttavia, Arduino Uno ha solo 2KB di SRAM = 2048 byte, troppo poco per contenere il buffer completo. Definiamo quindi un buffer display più piccolo MAX_BUFF = 1024.

Con il buffer più piccolo non possiamo inviare il buffer completo ma solo una striscia di MAX_HEIGHT, che deriva da MAX_BUFF e dalla larghezza (EPD::WIDTH) del display. Calcoliamo l’altezza del display tramite MAX_HEIGHT(GxEPD2_290_C90c).

Disegno a pagine

Il display viene aggiornato usando una modalità di disegno a pagine. Questo metodo divide il display in sezioni più piccole o strisce chiamate “pagine”. Invece di caricare tutto il contenuto, Arduino elabora una pagina alla volta.

Puoi vedere questo nel ciclo dowhile nel setup, dove le pagine vengono disegnate ripetutamente finché tutto il contenuto del display è aggiornato.

  epd.firstPage();
  do {
     ...
  } while (epd.nextPage());

Quando aggiorna il display, Arduino disegna il contenuto della pagina corrente in memoria, poi invia quella pagina al display E-Paper. Dopo l’aggiornamento della pagina, Arduino può svuotare il buffer e caricare la pagina successiva.

Nota che il buffer del display e il codice dello sketch condividono la stessa memoria. Se il tuo codice diventa più grande potresti dover ridurre MAX_BUFF per farli stare entrambi nella SRAM. Se ricevi questo messaggio di errore durante la compilazione, significa che MAX_BUFF è impostato troppo alto:

Not enough memory; see https://support.arduino.cc/hc/en-us/articles/360013825179 for tips on reducing your footprint. 
data section exceeds available space in board.
Compilation error: data section exceeds available space in board

Il ciclo esplicito do-while per il disegno a pagine è piuttosto scomodo e poco elegante. Fortunatamente la libreria GxEPD2 offre un’altra opzione. Puoi definire una funzione di disegno e poi chiamare epd.drawPaged(...) per il disegno a pagine. Il seguente esempio mostra come appare per il codice di test sopra:

...

void draw(const void* pv) {
  epd.fillScreen(GxEPD_WHITE);

  epd.setCursor(80, 60);
  epd.setTextColor(GxEPD_BLACK);
  epd.print("Maker");

  epd.setCursor(140, 60);
  epd.setTextColor(GxEPD_RED);
  epd.print("guides");
}

void setup() {
  ...
  epd.drawPaged(draw, 0);
  epd.hibernate();
}

void loop() {}

La funzione di disegno draw() prende un puntatore pv, che ti permette di passare parametri, anche se qui non lo usiamo. Quando chiamiamo epd.drawPaged(draw, 0), passiamo semplicemente 0 come puntatore parametro.

L’uso di funzioni di disegno per il ridisegno a pagine rende il codice più leggibile ed estendibile. Puoi avere più funzioni di disegno, particolarmente utili per eseguire refresh parziali e completi. Vedi il tutorial Digital Clock on e-Paper Display per un esempio.

Nota che puoi usare il disegno a pagine anche se il tuo microcontrollore è abbastanza grande da contenere il buffer completo. Per esempio, il codice di test per Arduino Uno funzionerebbe senza modifiche (a parte il cablaggio) su un ESP32 e in generale il disegno a pagine è consigliato.

Raccomandazioni

La Waveshare Manual fornisce le seguenti raccomandazioni per l’uso di un display E-Paper (riassunte e riformulate da me):

Refresh completo: Il display e-Paper lampeggia più volte durante il processo di refresh (il numero di lampeggi dipende dal tempo di refresh), e il lampeggio serve a rimuovere le immagini residue per ottenere il miglior effetto visivo.

Refresh parziale: In questo caso il display non lampeggia durante il refresh. Dopo diverse operazioni di refresh parziale, si dovrebbe eseguire un refresh completo per rimuovere l’immagine residua. Altrimenti l’immagine residua potrebbe diventare permanente.

Si raccomanda di impostare l’intervallo di refresh dello schermo e-ink ad almeno 180 secondi (tranne per prodotti che supportano il refresh parziale).

Dopo un’operazione di refresh, si consiglia di spegnere o mettere in ibernazione il display. Questo prolunga la vita del display e riduce il consumo energetico.

Quando si usa uno schermo e-ink a tre colori, si raccomanda di aggiornare lo schermo almeno una volta ogni 24 ore.

I display E-Paper sono consigliati per uso interno e non per uso esterno. Se vuoi usare il display all’aperto, posizionalo in un’area ombreggiata e copri completamente la parte con colla bianca del nastro di connessione dello schermo e-Paper con nastro 3M.

Conclusioni

I display e-paper offrono diversi vantaggi che li rendono interessanti per vari progetti. Consumano pochissima energia, specialmente quando mostrano immagini statiche, ideale per dispositivi a batteria. La loro eccellente leggibilità alla luce solare diretta li rende adatti per applicazioni esterne, mentre gli ampi angoli di visualizzazione garantiscono chiarezza da diverse prospettive. Inoltre, i display e-paper sono sottili e leggeri, facilitando l’integrazione in vari design.

Tuttavia, i display e-paper hanno un refresh lento rispetto a LCD o OLED, il che può limitarne l’uso in progetti con contenuti dinamici. Le opzioni di colore sono limitate; i display bianco e nero mostrano solo due colori, mentre quelli tri-color sono limitati a tre colori, influenzando la flessibilità del design. Inoltre, i display e-paper possono essere più costosi di altri tipi di display, specialmente per dimensioni maggiori.

I display e-paper monocromatici hanno tempi di refresh molto più rapidi (< 3 secondi) rispetto ai tri-color e tipicamente supportano il refresh parziale per un aggiornamento ancora più veloce e senza lampeggiamenti. Sono abbastanza veloci per display di orologi, per esempio. Vedi i nostri tutorial Digital Clock on e-Paper Display e Analog Clock on e-Paper Display.

Il tempo di refresh molto lento (15 secondi) dei display tri-color limita le loro applicazioni. L’uso più comune sono le etichette elettroniche per prezzi. Ma potresti usarlo anche per altre applicazioni con cicli di aggiornamento lenti. Per esempio, i dati meteo devono essere aggiornati solo ogni 15 minuti circa.

Il nostro tutorial Weather Station on e-Paper Display usa un E-Paper monocromatico ma un E-Paper tri-color sarebbe un’opzione. E se ti servono ancora più colori, dai un’occhiata al tutorial 4-color E-paper display with ESP32.

Se hai domande, sentiti libero di chiedere nella sezione commenti.

Buon tinkering ; )