#ArduinoGuider 13: barometro BMP180. Bus I2C.

Questo numero di #ArduinoGuider è molto importante, perché oggi faremo conoscenza con un sensore s molto più sofisticato di quelli trattati in passato. La loro difficoltà è che hanno un numero molto flessibile e ampio di impostazioni e misurazioni. Inoltre, alcuni sensori sono in grado di effettuare alcuni calcoli e fornire risultati già pronti (ad esempio, MPU6050 può contare gli angoli di rotazione). Pertanto, la comunicazione con un tale dispositivo non può essere eseguita solo leggendo il valore della tensione analogica. Ciò ha sollevato la questione dello sviluppo di un nuovo modo per lo scambio di dati tra i dispositivi. Ecco come apparivano i bus di dati: I2C, SPI, One-Wire, ecc. Oggi faremo la conoscenza del bus dati I2C sull’esempio del barometro BMP180.

Prima di tutto, devi capire come funziona il bus I2C, come gestirlo e come stabilire lo scambio di dati tra il sensore e la scheda demo. Pertanto, I2C (chiamato anche IIC – Inter-Integrated Circuit ) è un bus dati asimmetrico coerente. I messaggi vengono trasmessi da due linee bidirezionali: una linea dati ( SDA – Serial DAta ) e una linea orologio ( SCL – Serial CLock ). L’orologio (master) invia un messaggio sull’inizio / fine della trasmissione dei dati e la linea dati invia i dati. Lo slave (dispositivo secondario) a sua volta segnala il recupero dei dati riuscito o non riuscito. Entrambe le linee sono alimentate a resistenze da 10 kO. Alcuni indirizzi di memoria, chiamati registri, sono collegati al bus. Sono responsabili delle impostazioni o contengono determinate informazioni (dati, configurazione corrente, modalità operative, ecc.). Alcuni registri possono essere solo letti ( sola lettura ), altri possono essere sia in lettura che in scrittura ( lettura / scrittura ). Fondamentalmente, questo è tutto ciò che devi sapere su questo bus di dati (leggi di più su Wikipedia)

Ovviamente, per un principiante (e un utente esperto) implementare il protocollo di scambio dati sul bus I2C è un compito piuttosto scoraggiante. Esiste una libreria già pronta per Arduino chiamata Wire.h . Con il suo aiuto si realizza la comunicazione con il dispositivo sul bus I2C. Poiché il nostro barometro comunica su questo bus, lo colleghiamo ad Arduino e proviamo a leggere alcune informazioni da esso. Se guardi il sensore stesso, vediamo 4 schiume: 5V, “terra”, SDA e SCL. Sappiamo già di cosa sono responsabili le ultime due schiume, ora dobbiamo collegarci alla scheda demo. In Arduino, il pin A5 è responsabile per SCL e A4 per SDA. Di conseguenza, creiamo il seguente schema:

Ora, per chiarezza, inserirò un pezzo di codice e vi mostrerò esattamente come funziona la comunicazione a livello di libreria Wire.h.

L’immagine a sinistra (che è stata presa dalla documentazione ufficiale) mostra l’algoritmo per trovare la temperatura e la pressione. Pertanto, è necessario prima leggere alcuni registri con informazioni, quindi alcuni registri che sono responsabili del “valore grezzo” di temperatura e pressione, che viene quindi calcolato dalle formule fornite. Mi sono perso la lettura di alcuni registri in questo pezzo di codice, implementando la seconda fase, ovvero la lettura dei “dati grezzi” della temperatura. Quindi, per prima cosa, devi connettere la libreria Wire.h e implementare una connessione bus I2C. L’ultima operazione viene eseguita dal metodo Wire.begin () nella funzione void setup (). Pertanto, l’inizio dello scambio dati implementa il metodo Wire.beginTransmission (BMP180_ADDRESS) , dove BMP_ADDRESS è l’indirizzo I2C del bus barometro (nel nostro caso è 0x77). Dopodiché, secondo la documentazione, è necessario scrivere il numero 0x2E nel registro 0xF4. La gestione e la scrittura vengono eseguite utilizzando il metodo Wire.write () . Dopodiché, è necessario completare lo scambio di dati e attendere almeno 4,5 millisecondi (secondo la documentazione). Dopodiché, il dispositivo è pronto per inviarci i dati a cui siamo interessati. Dobbiamo leggere i dati del registro 0xF6 e 0xF7. Quindi ricominciamo lo scambio dati, ci rivolgiamo al registro 0xF6. Termina lo scambio e utilizza il metodo Wire.requestFrom (BMP_ADDRESS, 2, true) per specificare quanti registri devi leggere da quello corrente. Al momento abbiamo 0xF6, rispettivamente è necessario leggere 2 registri: 0xF6 e 0xF7.Poiché i dati devono essere lunghi 16 bit e i registri solo 8 bit (secondo la documentazione), l’unità dati viene divisa in due registri. Pertanto, per ottenere un numero a 16 bit di due a 8 bit è necessario leggere il primo, spostarlo bit per bit su 8 bit a sinistra e leggere il secondo. Nel codice, ha questo aspetto: Wire.read () & lt; & lt; 8 | Wire.read (). È così che otteniamo dati di temperatura “grezzi”.

Ovviamente è difficile scrivere tutto questo senza una formazione e una conoscenza speciali, quindi useremo una libreria che fa tutto per noi e dove vengono letti i contenuti dei registri e tutte queste formule vengono calcolate per ottenere letture accurate di pressione e temperatura. Puoi scaricare la libreria qui: https://github.com/sparkfun/BMP180_Breakout_Arduino_Library

Apri l’IDE di Arduino e scrivi il codice seguente:

Compila, riempi, apri la console e guarda i dati di pressione, che sono misurati in mm.r.st. Stiamo cercando di visualizzare il valore della temperatura.