Laboratorio I2C: ESP8266

ESP8266 e BMP280

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.

La fotografia di apertura mostra, da destra, un Master I2C (ESP8266) e diversi Slave: un sensore di pressione e temperatura (BMP280), un sensore di temperatura ed umidità (HTU21D) ed una memoria EEPROM seriale (24LC16).

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

Attività 1

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

In questa pagina verrà usato come Slave I2C 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 del sensore è necessario utilizzare una breakout board, un circuito stampato che rende agevole il collegamento alla breadboard e spesso contiene anche componenti di supporto. La fotografia di apertura mostra una possibile realizzazione fisica di una breakout board (il piccolo circuito stampato di colore violetto vicino a ESP8266); qui sotto, è mostrato il suo schema (nota 3):

Schema della scheda di breaout con BMP280

Collegare un sensore BMP280 ad un microcontroller ESP8266. Grazie alla breakout board l'hardware da realizzare è piuttosto semplice. I collegamenti necessari sono:

Occorre prestare attenzione al fatto che entrambi questi circuiti integrati funzionano con alimentazione di 3,3 V: tensioni più elevate sono distruttive! Vivamente consigliato procedere alle seguenti operazioni senza l'alimentazione, cioè scollegando il cavo USB da ESP8266:

  1. collegare massa ed alimentazione (3.3 V) di ESP8266 ai corrispondenti pin presenti sulla breakout board del BMP280, rispettivamente il filo nero e quello rosso nella fotografia di apertura.
  2. individuare su ESP8266 i pin SDA e SCL e collegarli direttamente ai corrispondenti pin della breakout board, il filo giallo e quello blu nella fotografia di apertura
  3. normalmente sono sufficienti le sole resistenze di pull-up già presenti sulla breakout board. Se sono presenti più circuiti integrati potrebbe essere utile aggiungere due resistori esterni da qualche kΩ.

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

É comodo utilizzare lo sketch seguente o uno simile presente nelle librerie; esso scansiona tutti gli indirizzi I2C alla ricerca degli indirizzi degli Slave presenti. La ricerca è fatta iniziando una comunicazione verso gli indirizzi da 0x01 a 0x7F, senza poi trasmettere nulla (nota 5):

#include <Wire.h>
void setup() {
  Wire.begin();
  Serial.begin(115200);
}

void loop() {
  byte error, address;
  Serial.println("Scanning...");
  for (address = 1; address < 127; address++) {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
    if (error == 0) {
      Serial.print("I2C device found at address 0x");
      Serial.println(address, HEX);
      }
    }
  Serial.println("done\n");
  delay(1000);
}

L'output tipico potrebbe, per esempio, 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: Serial decodingI2C. Nel diagramma temporale seguente si vede, ad esempio, come l'indirizzo 0x40 è stato riscontrato (ACK = 0, giallo); gli indirizzi 0x41 e 0x42 non sono invece stati riscontrati (ACK = 1, rosso) e quindi non sono presenti dispositivi con tali indirizzi:

 

  1. quali sono, in base ai fogli tecnici, i possibili indirizzi di BMP280?  Come è eventualmente possibile configurarlo?
  2. utilizzare il codice sopra riportato verificare quanto trovato nel punto precedente
  3. collegare un oscilloscopio ai due segnali SDA e SCL, visualizzarli ed attivare la decodifica I2C. Eventualmente modificare il codice per rendere più agevole la visualizzazione di indirizzi particolari
  4. individuare nel diagramma temporale i quattro simboli della codifica I2C: 0, 1, Start e Stop.

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 con il seguente codice:

#include <Wire.h>

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

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

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" nei fogli tecnici di BMP280
  2. individuare il contenuto previsto del registro "id"
  3. completare lo sketch mostrato, comprenderne il funzionamento e verificare che il Chip ID letto sia corretto
  4. verificare con l'oscilloscopio il frame presente sul bus. Di seguito come dovrebbe apparire:

Lettura del Chip ID di BMP280

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.

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

Approfondimento - Attività 4

Collegare al Master un altro Slave I2C in aggiunta a BMP280 ed analizzarne il funzionamento con le librerie (se disponibili) e scrivendo il codice con i metodi della libreria wire.

Un esempio: 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 4).

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

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. Una eventuale resistenza aggiuntiva di qualche kΩ non crea in genere problemi mentre l'assenza  determina il non funzionamento del circuito
  3. I nomi dei pin fanno riferimento a quanto indicato sui fogli tecnici. Esistono varianti dello schema che includono i circuiti necessari al funzionamento con alimentazione a 5 V, utile per esempio nel collegamento ad Arduino UNO
  4. La convenzione tipografica adottata dal produttore potrebbe indurvi in errore...
  5. Il codice mostrato scansiona anche gli indirizzi riservati 00000xx e 1111xxx


Pagina creata nel marzo 2023
Ultima modifica: 8 marzo 2025


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


Pagina principaleAccessibilitàNote legaliPosta elettronicaXHTML 1.0 StrictCSS 3

Vai in cima