Laboratorio: I2C

ESP8266 e BMP280

Questa pagina mostra come utilizzare il bus I2C in laboratorio dal punto di vista del progettista elettronico; in particolare sarà chiesto di analizzare i segnali presenti usando un oscilloscopio digitale, negli esempi è utilizzato un Picoscope 3000A, ma vanno benissimo anche altri strumenti purché dotati di capacità di decodifica dei segnali seriali I2C.

Nel sito potete trovare anche una pagina con simili contenuti che utilizza Arduino Uno.

Per chi non dispone di un un oscilloscopio, ho inserito alcune forme d'onda esemplificative.

ESP8266 in ambiente Arduino-IDE gestisce i dispositivi I2C per mezzo della libreria Wire che contiene i metodi per leggere e scrivere messaggi generici secondo questo protocollo. Ovviamente sono disponibili anche molte librerie specializzate che rendono semplice l'uso di una miriade di dispositivi.

L'hardware

In questa pagina verrà usato un sensore di temperatura e pressione piuttosto diffuso: BMP280. Questo sensore è dotato sia di interfaccia SPI che I2C, solo quest'ultima qui descritta. Per utilizzare SPI: Laboratorio SPI.

A causa delle dimensioni molto piccole è necessario utilizzare una breakout board, cioè un piccolo circuito stampato adatto al collegamento alla breadboard, spesso contenente anche componenti di supporto. La fotografia di apertura mostra una possibile realizzazione (nota 3) e qui sotto è mostrato lo schema della breakout board utilizzata (nota 4):

Schema della scheda di breaout con BMP280

L'hardware da realizzare è piuttosto semplice. I collegamenti necessari sono:

Attività 1

Occorre prestare attenzione al fatto che questo circuito integrato funziona con alimentazione di 3,3 V e tensioni elevate sono distruttive. Inoltre queste operazioni devono essere fatte senza collegare il cavo USB a ESP8266, cioè scollegando l'alimentazione.

  1. Individuare sui fogli tecnici la minima e la massima tensione di alimentazione
  2. Collegare massa ed alimentazione (3.3 V) di ESP8266 ai corrispondenti pin presenti sulla scheda di breakout
  3. Individuare sia su ESP8266 che sulla scheda di breakout i pin SDA e SCL e collegarli direttamente tra di loro
  4. Individuare la presenza o meno dei due resistori di pull-up. Se non presenti, occorre aggiungerli sulla breadboard

Attività 2

In genere la prima operazione da fare è quella di individuare gli indirizzi degli Slave I2C connessi.

Nella pagina 28 del foglio tecnico è descritto quali sono i possibili indirizzi di BMP280.

É anche possibile utilizzare lo sketch I2C_scanner.ino che scansiona tutti gli indirizzi I2C alla ricerca degli indirizzi degli Slave presenti. La ricerca è fatta iniziando una comunicazione verso ciascuno dei 127 indirizzi possibili, da 0x00 a 0x7F, senza poi trasmettere nulla (nota 1):

L'output tipico potrebbe essere qualcosa di simile alla seguente schermata che mostra la presenza di quattro dispositivi con indirizzo (esadecimale) 0x48, 0x4A, 0x4D e 0x4F:

I2C scan

Durante l'esecuzione dello sketch è possibile osservare con l'oscilloscopio i due segnale SDA e SCL. Se l'oscilloscopio lo consente, è decisamente comodo attivare la decodifica dei segnali I2C: (Tools)Serial decoding(Create)I2C. Nel diagramma temporale seguente si vede, ad esempio, come l'indirizzo 0x76 è stato riscontrato (ACK = 0, giallo); l'indirizzo 0x77 non è invece stato riscontrato (ACK = 1, rosso) e quindi non è presente alcun dispositivo con tale indirizzo:

 

  1. Quali sono, in base ai fogli tecnici i possibili indirizzi di BMP280?
  2. Quale è l'indirizzo effettivamente configurato? Come è possibile modificarlo?
  3. Utilizzare uno dei programmi di esempio della libreria Wire (I2C_scanner.ino) per verificare quanto trovato nei precedenti punti 2.1 e 2.2
  4. Collegare un oscilloscopio ai due segnali SDA e SCL ed attivare la decodifica dei segnali I2C.
  5. Individuare all'interno del frame i quattro simboli della codifica I2C: 0, 1, Start e Stop.

Attività 3

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 verificare se il contenuto corrisponde a quanto atteso; 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.

#include <Wire.h>

#define BMP_ADDRESS 0x...
#define ID_REGISTER 0x...

void setup() {
 Wire.begin();
 Serial.begin(115200);
 Serial.println( "" );
 Serial.println("Start");
}

void loop() {
 Wire.beginTransmission( BMP_ADDRESS );
 Wire.write( ID_REGISTER );
 Wire.endTransmission( false );
 Wire.requestFrom( BMP_ADDRESS, 1);
 int ID = Wire.read();
 Serial.print("Chip ID: 0x");
 Serial.println(ID,HEX);

 delay(1000);
}

  1. Individuare l'indirizzo del registro "id"
  2. Individuare il contenuto previsto del registro "id"
  3. Completare lo sketch mostrato, comprenderne il funzionamento e verificare che il Chip ID sia corretto:
  4. Verificare con l'oscilloscopio il frame presente sul bus. Di seguito come dovrebbe apparire:

Lettura del Chip ID di BMP280

Attività 4

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 componenti.

La procedura dettagliata, tutt'altro che semplice, è descritta nei fogli tecnici di BMP280 (paragrafi 3.11), insieme a numerosi esempi di codice adatti per processori a 8, 32 e 64 bit (paragrafo 3.12 e appendici). Numerose sono le librerie disponibili. Di seguito tre:

  1. Installare una o più delle libreria ed utilizzare uno dei programma di esempio
  2. Visualizzare i segnali scambiati sul bus I2C. A seguire un esempio, peraltro di non facile comprensione:

Frame di lettura di pressione e temperatura

Attività 5

TC74 è un sensore di temperatura con modeste caratteristiche: risoluzione di 1 °C, accuratezza a temperatura ambiente di ± 2 °C.

Questo circuito può utilizzare un solo indirizzo I2C, scelto dal produttore e stampato sul contenitore. La documentazione è riportata al termine del foglio tecnico (nota 5).

Il codice per leggere la temperatura è piuttosto semplice: basta leggere il contenuto del registro 0x00.

Attività 6

ESP8266 può essere programmato anche per funzionare come Slave e poter così creare una rete tra un ESP8266 configurato come Master ed uno o più ESP8266 configurati come Slave.

Scrivere il codice corrispondente, utilizzando (almeno) due ESP8266. Il problema nasce dal fatto che il non funzionamento (certo...) potrebbe derivare da un errore nel codice del Master, un errore nel codice dello Slave, un errore di collegamento oppure tutte queste cose messe insieme: in questo l'analisi delle forme d'onda riveste un ruolo essenziale!

Come Master è possibile anche utilizzare Raspberry PI.

Note

  1. Ovviamente è possibile scrivere da sé tale sketch, ma la ricerca di qualcosa di già scritto è estremamente più... comoda
  2. A volte la resistenza di pull-up non è facilmente visibile sulla breakout board. Una eventuale resistenza aggiuntiva non crea in genere problemi mentre l'assenza  determina il non funzionamento del circuito
  3. Le due breakout board di colore nero ed il resistore da 2.2 kΩ non hanno nulla a che fare con I2C
  4. I nomi dei pin fanno riferimento a quanto indicato sui fogli tecnici. Esistono varianti dello schema che possono includere anche i circuiti per permettere il funzionamento con alimentazione a 5 V
  5. La convenzione tipografica adottata dal produttore potrebbe indurvi in errore...


Pagina creata nel marzo 2023
Ultima modifica: 27 marzo 2023


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


Pagina principaleAccessibilitàNote legaliPosta elettronicaXHTML 1.0 StrictCSS 3

Vai in cima