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.
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):
L'hardware da realizzare è piuttosto semplice. I collegamenti necessari sono:
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.
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:
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:
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);
}
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:
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.
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.
Pagina creata nel marzo 2023
Ultima modifica: 27 marzo 2023
Appunti scolastici - Versione 0.1022 - ottobre 2023
Copyright 2012-2023, Vincenzo Villa (https://www.vincenzov.net)
Quest'opera stata rilasciata con licenza Creative Commons | Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)