#ArduinoGuider 13: BMP180 barométer. I2C busz.

Ez a #ArduinoGuider kiadvány nagyon fontos, mert ma sokkal s sokkal kifinomultabb érzékelővel ismerkedünk meg, mint a múltkor. Nehézségük, hogy nagyon rugalmas és nagyszámú beállításuk és mérésük van. Ezenkívül egyes érzékelők képesek elvégezni néhány számítást és kész eredményeket adni (például az MPU6050 meg tudja számlálni a forgásszögeket). Ezért az ilyen eszközzel való kommunikáció nem csak az analóg feszültség értékének leolvasásával történhet. Ez felvetette egy új módszer kifejlesztésének kérdését az eszközök között. Így jelentek meg az adatbuszok: I2C, SPI, One-Wire stb. Ma a BMP180 barométer példáján ismerkedünk meg az I2C adatbusszal.

Először is meg kell értenie az I2C busz működését, kezelését és az adatcsere létrehozását az érzékelő és a bemutató kártya között. Így az I2C (más néven IIC – Inter-Integrated Circuit ) következetes aszimmetrikus adatbusz. Az üzeneteket két kétirányú vonal továbbítja – egy adatsor ( SDA – soros DAta ) és egy órajel ( SCL – soros óra ). Az óra (master) üzenetet küld az adatátvitel kezdetéről / végéről, az adatsor pedig adatokat küld. A Slave (másodlagos eszköz) viszont sikeres vagy sikertelen adatkeresést jelent. Mindkét vezetéket 10 kО ellenállásra táplálják. Bizonyos memória címek, úgynevezett regiszterek, csatlakoznak a buszhoz. Ők felelősek a beállításokért, vagy bizonyos információkat tartalmaznak (adatok, aktuális konfiguráció, működési módok stb.). Egyes regiszterek csak olvashatók ( csak olvasható ), egyesek egyaránt olvashatók és írhatók ( olvashatók / írhatók ). Alapvetően ennyit kell tudni erről az adatbuszról (bővebben a Wikipédián olvashat)

Nyilvánvaló, hogy egy kezdő (és egy tapasztalt felhasználó) számára az I2C buszon végrehajtott adatcsere-protokoll meglehetősen félelmetes feladat. Van egy kész könyvtár az Arduino számára, a Wire.h néven. Segítségével megvalósul az I2C buszon lévő eszközzel való kommunikáció. Mivel barométerünk ezen a buszon kommunikál, összekapcsoljuk az Arduino-val, és megpróbálunk néhány információt leolvasni belőle. Ha magát az érzékelőt nézzük, akkor 4 habot látunk: 5V, “földelt”, SDA és SCL. Már tudjuk, mi a felelős az utolsó két habért, most csatlakoznunk kell a bemutató táblához. Az Arduino-ban az A5 tű felel az SCL-ért, az A4 pedig az SDA-ért. Ennek megfelelően a következő sémát készítjük el:

Az egyértelműség kedvéért bedobok egy darab kódot, és megmutatom, hogyan működik pontosan a kommunikáció a Wire.h könyvtár szintjén

A bal oldali kép (amelyet a hivatalos dokumentációból vettünk) mutatja a hőmérséklet és a nyomás megtalálásának algoritmusát. Ezért először el kell olvasni bizonyos regisztrációkat információkkal, majd bizonyos regisztereket, amelyek felelősek a hőmérséklet és a nyomás “nyersértékéért”, amelyet aztán a megadott képletek kiszámítanak. Hiányzott bizonyos regiszterek elolvasása ebben a kódrészletben, a második szakasz megvalósítása, nevezetesen a hőmérséklet “nyers adatainak” beolvasása. Tehát először össze kell kapcsolnia a Wire.h könyvtárat, és létre kell hoznia egy I2C busz kapcsolatot. Az utolsó műveletet a Wire.begin () módszer hajtja végre a void setup () függvényben. Ezért az adatcsere megkezdése a Wire.beginTransmission (BMP180_ADDRESS) módszert valósítja meg, ahol a BMP_ADDRESS a barométer busz I2C címe (esetünkben 0x77). Ezt követően a dokumentáció szerint be kell írnia a 0x2E számot a 0xF4 regiszterbe. A kezelés és az írás a Wire.write () módszerrel történik. Ezt követően be kell fejeznie az adatcserét, és várnia kell legalább 4,5 ezredmásodpercet (a dokumentáció szerint). Ezt követően az eszköz készen áll arra, hogy elküldje nekünk az érdeklődésre számot tartó adatokat. El kell olvasnunk a 0xF6 és 0xF7 regiszteradatokat. Ezért újrakezdjük az adatcserét, lásd a 0xF6 regisztert. Fejezze be a cserét, és használja a Wire.requestFrom (BMP_ADDRESS, 2, true) metódust annak megadásához, hogy hány regisztert szeretne olvasni az aktuálisból. Jelenleg 0xF6 van, illetve 2 regisztert kell elolvasnod – 0xF6 és 0xF7.Mivel az adatnak 16 bit hosszúnak és a regisztereknek csak 8 bitnek kell lennie (a dokumentáció szerint), akkor az adategység két regiszterre oszlik. Ezért egy 16 bites két 8 bites szám megszerzéséhez el kell olvasni az elsőt, bitenként kell eltolni 8 bitre balra, a másodikat pedig el kell olvasni. A kódban így néz ki: Wire.read () & lt; & lt; 8 | Wire.read (). Így kapunk “nyers” hőmérsékleti adatokat.

Természetesen mindezt különösebb képzettség és tudás nélkül nehéz megírni, ezért olyan könyvtárat fogunk használni, amely mindezt megteszi helyettünk, és ahol a regiszterek tartalmát olvassák, és mindezeket a képleteket kiszámítják a nyomás és a hőmérséklet pontos leolvasásához. A könyvtár letölthető innen: https://github.com/sparkfun/BMP180_Breakout_Arduino_Library

Nyissa meg az Arduino IDE-t, és írja be a következő kódot:

Fordítsa le, töltse ki, nyissa ki a konzolt és nézze meg a nyomásadatokat, amelyeket mm.r.st. Megpróbáljuk megjeleníteni a hőmérséklet értékét.