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.
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):
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
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:
Occorre prestare attenzione al fatto che:
Vivamente consigliato procedere alle seguenti operazioni senza l'alimentazione, cioè scollegando il cavo USB da Raspberry Pi:
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: -- -- -- -- -- -- -- --
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:
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
Pagina creata nel marzo 2025
Ultima modifica: 8 marzo 2025
Appunti scolastici - Versione 0.1031 - Marzo 2025
Copyright 2012-2025, Vincenzo Villa (https://www.vincenzov.net)
Creative Commons | Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)