Arduino 6: Oggetti e display I2C

A. Costantini | (la videolezione) Il display LCD a caratteri è ideale per la visualizzazione di testo, numeri e caratteri speciali. Gli LCD I2C incorporano un piccolo circuito aggiuntivo montato sul retro del modulo. Il circuito è dotato di un chip di controllo per la gestione delle comunicazioni I2C e di un potenziometro regolabile per modificare l'intensità della retroilluminazione a LED. Un vantaggio dell'LCD I2C è che il cablaggio è semplice e richiede solo due pin per controllare l'LCD. Un LCD standard richiede più di dieci connessioni, il che può essere un problema se Arduino non ha molti pin di In/Out disponibili.  Il collegamento di Arduino UNO all'interfaccia I2C del display LCD richiede solo quattro connessioni: due per l’alimentazione e due per la comunicazione.

Immagine1jpg

I2C (Inter Integrated Circuit) è un protocollo digitale di comunicazioni tra circuiti integrati  con due sole linee e, malgrado non sia uno standard recente, è oggi usato in un'ampia gamma di applicazioni. I2C bus è uno standard seriale che permette di collegare sullo stesso bus un numero elevato di dispositivi, ognuno individuato da un proprio indirizzo. La possibilità di poter collegare più periferiche sullo stesso bus è garantita anche dal bus CAN. Quest'ultimo protocollo è stato ideato per operare in ambienti particolarmente rumorosi e in cui si debba raggiungere un grado di sicurezza nella trasmissione dati particolarmente elevata. Per tali ragioni il bus CAN è ormai accettato come standard in ambito automobilistico, per mettere in comunicazione i vari dispositivi elettronici che sempre più frequentemente vengono installati a bordo. Un notevole vantaggio dei dispositivi che fanno uso del bus I2C è quello della loro semplicità d'uso. Infatti tutte le regole del protocollo che bisogna rispettare per una corretta comunicazione vengono gestite a livello hardware, dunque il progettista non si deve preoccupare di nulla. Da quando è nato, ad opera della Philips, tale protocollo è stato aggiornato al fine di adeguarlo alle diverse esigenze che il mondo dell'elettronica andava mostrando. Tutte le modifiche apportate sono sempre state compatibili dall'alto verso il basso, ovvero gli integrati che soddisfano gli ultimi standard possono comunicare sempre con gli integrati della generazione precedente. La prima versione del bus I2C permette di trasmettere fino a 100Kbit/s (modalità standard). Questa velocità è stata portata a 400Kbit/s nelle modifiche apportate nel 1992 (modalità veloce). Nel 1998 la velocità è stata portata fino a 3.4Mbit/s (modalità ad alta velocità). Non necessariamente gli integrati di ultima generazione devono rispettare la modalità ad alta velocità. I dispositivi che fanno uso del bus I2C per comunicare con un'unità di controllo sono: memorie, real time clock calendar, LCD, potenziometri digitali, convertitori A/D, sintonizzatori radio, sensori per la temperatura e molto altro. Si capisce dunque che le possibilità di scelta da parte del progettista sono notevoli. Un altro vantaggio che permette di raggiungere il bus I2C è quello di poter aggiungere o togliere delle periferiche dal bus senza influenzare il resto del circuito. Questo si traduce in una facile scalabilità verso l'alto del sistema, ovvero si può migliorare un sistema aggiungendo nuove caratteristiche senza dover rivoluzionare tutto l'hardware. Il bus I2C è un bus seriale che necessita di sole due linee nominate SDA (Serial Data) e SCL (Serial Clock) più la linea di massa. Ambedue le linee sono bidirezionali. La prima è utilizzata per il transito dei dati che sono in formato ad 8 bit, mentre la seconda è utilizzata per trasmettere il segnale di clock necessario per la sincronizzazione della trasmissione. Il bus I2C permette la connessione di più periferiche su uno stesso bus ma permette la comunicazione tra due soli dispositivi alla volta. Chi trasmette le informazioni è chiamato trasmettitore mentre chi le riceve è chiamato ricevitore. L'essere il trasmettitore o il ricevitore non è una posizione fissa, ovvero, un trasmettitore può anche divenire ricevitore in una differente fase della trasmissione dati. In ogni comunicazione è invece fissa la posizione del cosiddetto Master (Padrone) e del cosiddetto Slave (Schiavo). Il Master è il dispositivo che inizia la comunicazione ed è lui a terminarla, lo slave può solo ricevere o trasmettere informazioni su richiesta del Master. Non tutti i dispositivi possono essere dei Master del bus I2C. Per esempio una memoria non sarà un Master del bus, mentre è ragionevole supporre che un microcontrollore lo possa essere. Su uno stesso bus è inoltre possibile la presenza di più Master, ma solo uno alla volta ricoprirà questo ruolo. Se per esempio due microcontrollori iniziano una comunicazione, anche se potenzialmente potrebbero essere ambedue dei Master, solo uno lo sarà, in particolare il Master sarà quello che ha iniziato la comunicazione, mentre l'altro sarà uno slave. Ogni dispositivo inserito nel bus I2C possiede un indirizzo che sul bus la individua in modo univoco. Questo indirizzo può essere fissato dal produttore in sede di fabbricazione o parzialmente fissato dal progettista. L'indirizzo è costituito da 7 bit nelle versioni standard o da 10 bit nelle versioni estese. Nel caso di indirizzamento a 7 bit si avrebbe potenzialmente la possibilità di indirizzare 128 periferiche mentre nel caso di 10 bit si avrebbe la possibilità di indirizzare fino a 1024 periferiche. Non tutte le periferiche ora citate sono raggiungibili, dal momento che alcuni indirizzi sono riservati a funzioni speciali. Un limite sul numero massimo di periferiche che è possibile connettere sul bus è dunque imposto dall'indirizzo. Un vincolo molto più stringente è imposto dalla capacità totale della linea che deve essere limitata a non più di 400 pF. Il valore di questa capacità viene a dipendere dal numero di dispositivi e dalla lunghezza del bus stesso. Potenzialmente, dal momento che una linea tipicamente introduce una capacità parassita di circa 80 pF/m, potrà essere lunga fino a 5m. Il limite imposto dalla capacità viene a dipendere dalla velocità con cui devono avvenire le transizioni dei bit dal livello basso al livello alto (rise time). Qualora si debbano raggiungere distanze maggiori, o il numero dei dispositivi è cosi elevato da superare tale capacità, è possibile spezzare il bus, in due o più parti, per mezzo di circuiti integrati ripetitori. Per mezzo di questi integrati sarà possibile avere 400 pF per ogni semi parte del bus. Per mezzo del P82B96, si ha invece la possibilità di raggiungere distanze di 100m alla frequenza di 71Kbit/s e di ben 1Km alla frequenza di 31Kbit/s. Da quanto appena esposto si comprende che un bus che possa funzionare a 100Kbit/s non necessariamente deve lavorare a tale frequenza. Sarà il Master, opportunamente impostato, a scandire il sincronismo e dunque la velocità di trasmissione. La necessità di dividere il bus in due la si può avere anche nel caso in cui siano presenti dispositivi con diversi standard di velocità. La divisione del bus è necessaria solo nel caso in cui si voglia far comunicare le periferiche a più alta velocità al loro massimo. Nel caso ci si adeguasse alla periferica più lenta non è necessario dividere il bus. Gli integrati che sfruttano I2C possono lavorare a diverse tensioni, dai tipici 5V a 3.3V ed anche 2.5V, permettendo consumi cosi ridotti da poter essere montati anche sui dispositivi portatili alimentati a batteria. Nel caso si debba far comunicare periferiche, che certamente staranno in due distinti bus, che lavorano a tensioni differenti, è necessario porre un ponte tra i due bus al fine di permettere un corretta comunicazione. Le linee SDA e SCL devono essere implementate per mezzo di uscite open drain o open collector. Questa nota è particolarmente importante qualora si voglia implementare il protocollo I2C interamente per via software. Tale caratteristica rende necessaria una resistenza di pull- up per ogni linea, ovvero di una resistenza collegata tra la linea e Vcc, come riportato in Figura. 

Immagine2jpg

Questo significa che quando le linee SDA e SCL non sono utilizzate, sono a livello alto. Valori tipici per le resistenze di pull up sono compresi tra 2KΩ e 10KΩ. Il primo valore è utilizzato per un bus fino a 400Kbit/s mentre il secondo per velocità fino a 100Kbit. Il valore corretto viene comunque a dipendere, oltre che dalla frequenza di trasmissione, anche dalla capacità totale di linea.
Qui il Circuito Tinkercad:
- senza iscrizione é possibile simularlo, consultare la lista dei componenti, copiare il codice e scaricare il pdf dello schema;
- con l'iscrizione gratuita è possibile anche copiarlo e modificarlo a proprio piacimento.