Arduino e i suoi display. Parte Seconda

Dopo la prima parte vediamo in questo articolo come utilizzare un altro tipo di display. Un display OLED, molto risoluto, 128 x 64 pixels, ma molto piccolo, 0,96 pollici. Vuol dire uno schermettino dove la parte visibile è circa 2.5 cm per 1.3 cm. Il tipo di tecnologia utilizzato consente di avere questi display molto luminosi, molto sottili e dal consumo ridotto. Non funzionano con una fonte luminosa come la retroilluminazione dei display lcd ad esempio, ma hanno una luminescenza propria data dal materiale di costruzione. Sono particolarmente adatti come piccoli schermi per apparecchiature di test o strumentazione. La buona risoluzione fa si che anche delle scritte con caratteri molto piccoli restino ben visibili.

Il display utilizzato in questa prova e del tipo con interfaccia a due fili I2C . Nella documentazione di Arduino si fa riferimento all’interfaccia TWI. Ne parlerò diffusamente in un articolo dedicato, per il momento diciamo che è una interfaccia seriale, con una linea che trasposta i dati e una che gestisce il clock per il trasferimento fra il micro e le periferiche (nel nostro caso il display). Le varie periferiche collegate al bus sono identificate da un numero caratteristico, vedremo come questa caratteristica ci servirà a far funzionare correttamente il display.

Cercando display oled 0.96″ ne troverete in vendita dappertutto, sia sui mercati tradizionali che su quelli asiatici. Sono monocromatici ma ci sono bianchi, blu, gialli, e anche con delle fascie bicolore. Quello che li caratterizza è il circuito interno al modulo che fa il driver. Quello più diffuso è il SSD1306 e in questa prova utilizzeremo uno di questi. Assicuratevi che il driver sia uguale se volete seguire questo tutorial. Nel caso di driver differente ci sarà da settare la libreria software in modo diverso, o addirittura cercare una libreria apposita, diversa da quelle che vedremo in seguito. Il nostro modulo ripeto è del tipo I2C, esistono anche con bus SPI o con tutti e due i bus a scelta.

oled (Medium)

si possono vedere i collegamenti necessari, solo quattro. Positivo (VCC) e massa (GND) di alimentazione a 5 volt dc, e i due fili dell’interfaccia seriale SCL (serial clock) e SDA serial data.

Se guardiamo il retro del display possiamo vedere l’indicazione dell’indirizzo, con la possibilità di cambiarlo. Parliamo dell’indirizzo relativo al bus I2C, di cui si parlava sopra.

oled_retro (Medium)

in realtà questa indicazione potrebbe essere fuorviante e provocare errori di interpretazione. Vedremo dopo come identificare con certezza l’indirizzo che ci servirà.

Lo schema di collegamento ad Arduino è semplicissimo. Basta collegare il positivo VCC al +5 di Arduino, i pins GND insieme, il pin SCL al corrispondente SCL di Arduino (pin indicato come A5) e il pin SDA allo stesso modo verso il pin di Arduino SDA (pin indicato come A4). Vediamo lo schema nel caso di collegamento tramite breadboard.

oledDisplay

Vediamo come verificare con esattezza l’indirizzo I2C del nostro modulo. Scaricate questo semplice programma (o sketch) che fa la scansione dei possibili oggetti collegati sul bus e ne stampa l’indirizzo.

Lo trovate in Arduino Playground, basta copiare lo sketch e incollarlo in una nuova finestra dell’editor.

Caricatelo su Arduino e aprite la finestra del monitor seriale, impostate 9600 baud e dovreste avere una cosa simile a questa:

scani2c

viene indicato l’indirizzo in formato decimale (60) e esadecimale (0x3C) del nostro modulo display. Come vedete è diverso da quello riportato sulla basetta (ox78).

Solo un accenno per spiegare questa differenza. Controllando il data sheet del circuito integrato SSD1306 si vede che l’indirizzo I2C può assumere due valori a seconda dello stato di un piedino. Tali valori sono indicati da 7 bit. e questi 7 bit valgono in un caso 0x3C e nell’altro 0x3D. Siccome si ragiona in byte normalmente, e un byte sono 8 bit, il byte completo ha un altro bit. Quindi se si vuole indicare il byte quello che era 0x3C diventa 0x78, e quello che era 0x3D diventa ox7A. Ne parlerò più diffusamente in un articolo dedicato all’interfaccia I2C. Normalmente comunque nelle librerie e negli sketch relativi si utilizza la codifica a 7 bit e quindi l’indirizzo da usare è 0x3C.

Ora possiamo scaricare la libreria per gestire il nostro display. Ce ne sono molte in circolazione, per adesso utilizziamo quella della Adafruit, generica per il driver SSD1306 che funziona con diversi microcontroller. La potete trovare qui:

Adafruit_SSD1306

per l’esempio che utilizzeremo è necessaria anche la libreria grafica GFX della Adafruit, la potete scaricare da qui:

Adafruit GFX

una volta installata utilizziamo l’esempio fornito, quello che si chiama

ssd1306_128x64_i2c

il nome è evocativo… parliamo del driver ssd1306, con un display di risoluzione 128 x 64 pixels, nella versione con interfaccia I2C.

Nel setup dello sketch di esempio troviamo la chiamata display.begin, che ha il secondo argomento che indica l’indirizzo I2C del modulo. Di default è impostato come 0x3D, dobbiamo cambiarlo con il nostro indirizzo, in questo caso 0x3C.

 


void setup()   {                
  Serial.begin(9600);

  // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3D (for the 128x64)
  // init done

 

Ecco il filmato dell’esempio fornito con la libreria della Adafruit. L’effetto di “sfarfallamento” che si vede è dovuto al video, in realtà il display funziona perfettamente.

Un’altra libreria grafica molto interessante è la U8GLIB. E’ adatta per un grandissimo numero di display di tutti i generi, fra cui anche questi Oled I2C. La libreria si può scaricare da qui:

Una volta installata controllate fra gli esempi forniti, e scegliete ad esempio Graphics Test.

All’inizio dello sketch sono riportati, commentati, tutti i possibili modi di inizializzazione a seconda del tipo di driver/modulo.

Per scegliere quello che vogliamo è necessario togliere i segni // di commento, solo ed esclusivamente alla linea che identifica il nostro modello.

Nel caso di questo display scegliamo

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0) 

e togliamo il commento davanti.


//U8GLIB_SSD1306_128X64 u8g(4, 5, 6, 7);	// SW SPI Com: SCK = 4, MOSI = 5, CS = 6, A0 = 7 (new white HalTec OLED)
//U8GLIB_SSD1306_128X64 u8g(10, 9);		// HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are  SCK = 13 and MOSI = 11)
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);	// I2C / TWI 
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_NO_ACK|U8G_I2C_OPT_FAST);	// Fast I2C / TWI 
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK);	// Display which does not send AC

 

Caricando il tutto su Arduino abbiamo questo risultato:

Nell’immagine sotto vediamo un display utilizzato per la lettura dei valori di Temperatura e Umidità di un sensore SHT20

20160811_151650 (Medium)

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *