Laboratorio I2C: Raspberry

Le attività descritte in questa pagina analizzano i segnali SDA e SCL e la struttura del frame bus I2C usando un oscilloscopio; negli esempi è utilizzato un Picoscope 3000A, ma sono adeguati anche altri strumenti purché dotati di capacità di decodifica dei segnali seriali I2C. Se non disponete di un un oscilloscopio, trovate alcune forme d'onda esemplificative.

Prima di proseguire è utile leggere la pagina che descrive il protocollo I2C.

Attività 1

Come Master I2C verrà utilizzato Raspberry Pi. Questo SBC permette di collegare dispositivi I2C al suo connettore GPIO e gestirli attraverso alcuni strumenti standard presenti su molte distribuzioni Linux. Un vincolo importante: l'alimentazione degli Slave deve essere a 3.3 V.

In questa pagina verrà usato come Slave I2C un sensore di temperatura e pressione piuttosto diffuso: BMP280.

A causa delle dimensioni molto piccole del sensore è necessario utilizzare una breakout board, un circuito stampato che rende agevole il collegamento e spesso contiene anche componenti di supporto. La fotografia di apertura mostra un esempio di questi circuiti stampati collegati al Raspberry Pi; qui sotto, è mostrato il suo schema (nota 3):

Schema della scheda di breaout con BMP280

Configurare Raspberry Pi

Innanzitutto occorre verificare che Raspberry sia configurato per usare l'hardware I2C e che sia presente il software necessario. Se usate una versione di Raspberry Pi OS decentemente aggiornata i moduli relativi sono già presenti nell'installazione standard, anche se non sono attivi.

La strada più semplice è l'attivazione tramite raspi-config (3 Interface Options → I2C → Yes

vv@raspberrypi:~ $ sudo raspi-config

Dopo il riavvio:

vv@raspberrypi:~ $ ls -l /dev/i2c-*
crw-rw---- 1 root i2c 89, 1 Mar 8 23:25 /dev/i2c-1
crw-rw---- 1 root i2c 89, 20 Mar 8 23:25 /dev/i2c-20
crw-rw---- 1 root i2c 89, 21 Mar 8 23:25 /dev/i2c-21

Serviranno inoltre alcuni pacchetti:

vv@raspberrypi:~ $ sudo apt install libi2c-dev i2c-tools

Infine, se serve, occorre aggiungere gli utenti che utilizzeranno il bus I2C al gruppo i2c, automaticamente creato.

vv@raspberrypi:~ $ sudo usermod -a -G i2c USERNAME

Collegare uno Slave

Per verificare il funzionamento del bus i2C è necessario collegare almeno un dispositivo Slave. È possibile condurre i primi "esperimenti" con qualunque circuito I2C, purché alimentato a 3.3 V.

Alcune considerazioni preliminari, valide per qualunque circuito:

Attenzione! Occorre prestare attenzione al fatto che:

Vivamente consigliato procedere alle seguenti operazioni senza l'alimentazione, cioè scollegando il cavo USB da Raspberry Pi:

  1. collegare massa (GND, pin 9 del GPIO) ed alimentazione (3.3 V, pin 1 del GPIO) di Raspberry ai corrispondenti pin presenti sulla breakout board del BMP280, rispettivamente il filo nero e quello rosso nella fotografia di apertura
  2. collegare SDA (pin 3 del GPIO) e SCL (pin 5 del GPIO) del Raspberry Pi direttamente ai corrispondenti pin della breakout board, rispettivamente il filo giallo e quello verde nella fotografia di apertura
  3. normalmente sono sufficienti le sole resistenze di pull-up già presenti su Raspberry Pi e sulla breakout board: non serve aggiungerne altre

Cercare i dispositivi presenti

La prima operazione da fare è quella di individuare gli indirizzi degli Slave I2C connessi al Master. Nella pagina 28 del foglio tecnico del BMP280 è descritto quali sono i possibili indirizzi di BMP280.

Possiamo utilizzare il comando i2cdetect -y 1

L'output fornito dal programma potrebbe essere una tabella simile alla seguente:

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: 20 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- 4b -- -- -- 4f
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

Attività 2

Non è certo sufficiente saper che uno Slave esiste e quale è il suo indirizzo! Occorre anche conoscere il tipo di dispositivo. Purtroppo non esiste un metodo standard per avere questa informazione. A volte è necessario leggere il contenuto di uno dei tanti registri dello Slave e da questo risalire al modello; altre volte è necessaria la verifica fisica della sigla del componente.

Nel caso di BMP280 questa informazione è contenuta nel registro "id", come descritta alla pagina 24 del foglio tecnico. Leggiamolo utilizzando il comando standard Linux i2cget:

vv@raspberrypi:~ $ i2cget -y 1 SLAVE_ADDR ID_REGISTER b|w

Qualche dettaglio sul comando, ben sapendo che man i2cget è più esaustivo; come dice il nome, i2cget serve per leggere il contenuto di un registro dello Slave. I cinque parametri sono rispettivamente:

Per esempio il comando:

vv@raspberrypi:~ $ i2cget -y 1 0x55 0x66 b
0x77

Legge dal registro esadecimale 0x66 dello Slave con indirizzo esadecimale 0x55 il byte esadecimale 0x77.

Se lo Slave è effettivamente un BMP280, dovrebbe essere mostrato il codice riportato nel foglio tecnico.

Per visualizzare i segnali SDA e SCL con un oscilloscopio è comodo realizzare il circuito su breadboard; i segnali generati sono i seguenti:

Dall'immagine sono stati cancellati alcuni dettagli...

Possiamo riconoscere due frame:

Approfondimento - Attività 3

La lettura dei valori di temperatura e pressione è piuttosto complessa a causa della presenza all'interno del sensore di numerosi parametri di calibrazione, diversi per ciascun componente.

Reperire in rete un esempio di libreria adatto al linguaggio che si intende utilizzare e verificarne il funzionamento.

Di seguito l'esecuzione di un codice d'esempio:

(env) vv@raspberrypi:~/my_project/bmp280-python/examples $ python temperature-and-pressure.py
temperature-and-pressure.py - Displays the temperature and pressure.
Press Ctrl+C to exit!
17.65*C 965.33hPa
17.66*C 965.32hPa
17.66*C 965.33hPa
17.66*C 965.33hPa

Note

  1. Ovviamente la ricerca di qualcosa di già scritto è sempre comoda...
  2. A volte la resistenza di pull-up non è facilmente visibile sulla breakout board e potrebbero sorgere dubbi sulla sua presenza. Una eventuale resistenza aggiuntiva non crea in genere problemi
  3. I nomi dei pin fanno riferimento a quanto indicato sui fogli tecnici. Esistono varianti dello schema che possono includere anche i circuiti che permettono il funzionamento con alimentazione a 5 V
  4. La convenzione tipografica adottata dal produttore potrebbe indurvi in errore...


Pagina creata nel marzo 2025
Ultima modifica: 8 marzo 2025


Licenza "Creative Commons" - Attribuzione-Condividi allo stesso modo 3.0 Unported


Pagina principalea>  AccessibilitàNote legaliPosta elettronicaXHTML 1.0 StrictCSS 3

Vai in cima