Display LCD SPI a colori

Da raspibo.

Qualche tempo fa, per poco più di tre euro, presi questo micro display. L'idea è ovviamente di usarlo per avere un feedback visivo da un Raspberry Pi (o di un Arduino). La dicitura del prodotto era '1.44" Red Serial 128X128 SPI Color TFT LCD Module Display'. Sul retro, a parte una scritta che ci avverte che la risoluzione è 128x128 e che usa l'interfaccia SPI, non c'era nulla. Niente datasheet, niente indicazioni su come farlo funzionare, niente di niente. Le uniche informazioni disponibili erano quindi le seguenti:

  • utilizza l'SPI
  • è un display
  • è rosso

Poiché mi piacciono le sfide, ho deciso che non sarei andato a letto senza prima averlo fatto funzionare.

Disp termosifone.jpg

TADÀ ecco il display che mostra con orgoglio un termoconvettore.

Premetto che, prima di arrivare alla conclusione, ho fatto innumerevoli tentativi a caso. Prima o poi riproverò partendo da zero e segnerò tutti i passi. Per contro, è necessario che io scriva questa guida prima che mi passi di mente il percorso. Visto che non c'è molta documentazione a riguardo (o almeno: IO non l'ho trovata) specialmente in italiano, non arrabbiatevi con me se qualcosa non funziona, ma scrivetemi sul social [1].

Indice

Pinout

Chiunque abbia dimestichezza con la SPI sa che i pin di comunicazione sono fondamentalmente quattro: SCLK, MOSI, MISO e SS. In pratica sono il clock, la comunicazione dal Master allo Slave, la comunicazione dallo Slave al Master e un pin che il master usa per decidere chi comunica fra i due (Slave Select). Guardate su Wikipedia se volete approfondire riguardo a questa sadomasochistica interfaccia [2]. Notate che le sigle che indicano i pin possono cambiare anche di molto. Il nostro Raspberry Pi possiede l'interfaccia SPI nella GPIO. Nel dettaglio:

  • pin fisico 19 (GPIO10 wiringpi 12) è MOSI
  • pin fisico 21 (GPIO9 wiringpi 13) è MISO
  • pin fisico 23 (GPIO11 wiringpi 14) è CLOCK
  • pin fisico 24 (GPIO8 wiringpi 10) e 26 (GPIO7 wiringpi 11) sono rispettivamente CE (chip enable) 0 e 1

A quanto pare il Raspberry può controllare device SPI con due chip. Tant'è, non ci servirà questa volta. Maggiori info [3]

Il nostro aggeggio invece ha:

Pinout display.jpg

Ecco, come potete vedere non corrisponde quasi niente.

  • LED è il pin della retroilluminazione. Andrebbe collegato preferibilmente al pin fisico 12 (GPIO18 wiringpi 1) perché è l'unico ad essere PWM fisico sul RPi. In questo modo si potrà regolare la luminosità. Se non ci interessa questa feature, si può collegare anche a uno dei due pin a 3,3v.
  • SCK, clock, va collegato al fisico 23, come sopra.
  • SDA eh? Un po' di trial and error e ho scoperto che è il MOSI. Di fatto il nostro display non comunica mai con il master, riceve solo dati.
  • A0, di nuovo eh? Questo pin va collegato a un pin libero del Rasbperry. Mi sembra di aver capito che sia il pin che stabilisce se al display sta arrivando un comando o dei dati. In altri device troverete DC (data/command).
  • RESET, autoesplicativo. Anche questo va collegato a un pin libero del Raspberry.
  • CS, forse sarà da collegare al CE0? Sì!
  • GND e VCC, i più facili. Dovete fare molta attenzione perché il display va a 3,3v. Se lo attaccate a un Arduino avrete bisogno di un convertitore di livelli logici.

Abilitare l'SPI su Raspbian

La porta SPI è disabilitata di default. Per abilitarla bisogna togliere dalla lista nera dei moduli da non caricare il modulo spi-bcm2708. Aprite con il vostro editor preferito il file /etc/modprobe.d/raspi-blacklist.conf (dovrete usare sudo). Questo è quello che vi si parerà davanti.

# blacklist spi and i2c by default (many users don't need them)

blacklist spi-bcm2708
blacklist i2c-bcm2708

Many users non ne avranno bisogno. Noi sì. Aggiungete un cancelletto davanti a "blacklist spi-bcm2708". Già che ci siete potreste abilitare anche la porta I²C.

# blacklist spi and i2c by default (many users don't need them)

#blacklist spi-bcm2708
blacklist i2c-bcm2708

Et voilà! Non siete più uno dei "many users". Visto com'è facile far parte di un'elite? Salvate il file e riavviate il Raspberry.

Abilitare il modulo fbtft

Raspbian non possiede questo modulo. Dovrete prima installarlo. Qui trovate la guida ufficiale dell'autore [4]. Io ho scelto la prima opzione, quello di rendere i moduli fbtft caricabili con modprobe. Quindi:

sudo REPO_URI=https://github.com/notro/rpi-firmware rpi-update
sudo reboot

Nella stessa pagina consigliano di cambiare /dev/fb0 in /dev/fb1 in questo file:

sudo nano /usr/share/X11/xorg.conf.d/99-fbturbo.conf

ma non sono sicuro di capire perché.

Nella guida indicata ci sono anche le istruzioni su come caricare il modulo a ogni boot e fare mille altre magie. Leggetela! [5]

Usare il modulo fbtft

Il modulo fbtft crea un device framebuffer al quale è possibile inviare immagini ma anche l'output di X Windows. Caricate quindi il modulo con modprobe

sudo modprobe fbtft_device name=s6d02a1 gpios=reset:25,dc:24,led:18

La variabile "name" è il tipo del vostro display. Ce ne sono diverse decine. Se il display è totalmente bianco, ha le righe o le immagini sono distorte allora non è il tipo giusto. Io li ho provati quasi tutti prima di scoprire che era "s6d02a1". Se volete vedere tutti i modelli supportati allora caricate il modulo con "name=list" poi guardate dentro dmesg. Darà un errore che elencherà tutti i "name" caricabili.

L'altra variabile importante è gpios. Ricordate nel capitolo pinout, i collegamenti che possono essere messi ovunque? Ecco: dovrete specificarli in questa variabile. Reset è collegato a RESET, dc ad A0 e led a LED.

Ci sono molte altre variabili. Sono tutte nella guida[6]. In particolare "width" e "height", se precedute da "custom" servono per indicare la dimensione massima delle immagini. Per questo display ho usato 128x128.

Visualizzare un'immagine

È molto semplice. Quando caricate un programma che scrive sul framebuffer dovrete anteporre la variabile di ambiente FRAMEBUFFER. Per visualizzare un'immagine funziona bene il comando fim (se non ce l'avete fate "sudo apt-get install fim"). La sintassi è molto semplice:

FRAMEBUFFER=/dev/fb1 fim <nome immagine>

Se volete risparmiarvi di scrivere la variabile FRAMEBUFFER ogni volta allora potete fare

export FRAMEBUFFER=/dev/db1

da quel momento in avanti è come se lo scriveste ogni volta.

Il comando fim è molto interessante. Permette di zoomare, spostare e ruotare le immagini, nonché di vederle in sequenza. Per maggiori informazioni "man fim".

Visualizzare un video

È molto facile, serve mplayer (potete installarlo con apt-get).

mplayer -vf scale -zoom -xy 128 -vo fbdev2:/dev/fb1 <nome del video>

Le prime opzioni (-vf scale -zoom -xy 128) servono per scalare il video a una risoluzione minore o uguale a 128x128. Ovviamente è una misura che dipende dal display.

Sì, ma X Windows?

FRAMEBUFFER=/dev/fb1 startx

Ecco X che compare nel display... se aveste un display più grande del mio! Con questo si vede solo un'icona e il puntatore.


Riferimenti (da verificare)

Strumenti personali
Namespace

Varianti
Azioni
Navigazione
Strumenti