Komunikacja poprzez I2C - mikrokontroler rozmawia z pehametrem i steruje kolorową diodą LED

BlinkM to płytka z trójkolorową diodą LED porozumiewająca się z mikrokontrolerem za pomocą protokołu/magistrali I2C. Tą samą magistralę wykorzystuje np. minipH - płytka z cyfrowym pehametrem dla elektrod BNC. W świecie zaawansowanych układów elektronicznych magistrala ta jest bardzo popularna. Znajdziemy ją także w Arduino, Raspberry Pi, pyMCU i wielu innych płytkach z mikrokontrolerami.

W tym artykule przedstawię komunikację po I2C pomiędzy pyMCU (i ogólnie mikrokontrolerami) a dwoma wspomnianymi płytkami - BlinkM i MinipH.

BlinkM

BlinkM podłączone do pyMCU z wykorzystaniem rezystorów pullup

Płytka ta wyposażona jest w bardzo jasną wielobarwną diodę. Składa się ona z diody czerwonej, zielonej i niebieskiej - czyli standardowy zestaw RGB pozwalający uzyskać dowolny kolor z różnych mieszanek tych trzech kolorów (wliczając w to biały). Poprzez magistralę I2C możemy sterować zmianą kolorów diody, albo tworzyć własne sekwencje zmian (skrypty). Nie jest to zbyt zaawansowana elektronika, ale może być poręczne w nauce wykorzystywania I2C albo testowania tej magistrali na mniej popularnych platformach z mikrokontrolerem. Ze strony producenta możemy pobrać dokumentację, a samą płytkę w jednej z trzech odmian można kupić w niektórych europejskich sklepach.

Dokumentacja zawiera opis całego protokołu komunikacji - jakie dane można wysłać i jaki efekt będą one miały na diodę. Znajdziemy też przykładowy kod dla Arduino.

Komunikacja I2C odbywa się na dwóch pinach - danych i zegara. W przypadku pyMCU komunikacja ta obsługiwana jest przez pin D4 (dane) i D11 (zegar). Dodatkowo trzeba doprowadzić do diody zasilanie (VCC/GND). pyMCU niestety nie jest najmilszym układem do sterowania elektroniką po I2C. Proste układu łatwo samemu oskryptować wraz z dokumentacją. Przy większych może być to strasznie nurzące. Także API wystawiane przez bibliotekę różni się od współczesnego zaprezentowanego przez Arduino. Różnica polega na tym że pyMCU używa dwóch argumentów (i2cWrite(control, {address,} writeData)), a API Arduino jednego (będącego niejako skróconą formą podwójnego adresu stosowanego w pyMCU). W przypadku problemów trzeba prosić o pomoć twórcę pyMCU.

Prosty skrypt wykorzystujący interfejs opisany w dokumentacji wygląda tak:
import pymcu

mb = pymcu.mcuModule()


class BlinkM(object):
    ADDRESS = 0x12
    BLINK_TO_COLOR = 0x63
    STOP_SCRIPT = 0x6f
    RED = 0xff
    GREEN = 0x30
    BLUE = 0xc4

mb.i2cWrite(BlinkM.ADDRESS, BlinkM.STOP_SCRIPT)
mb.pausems(200)

while True:
    mb.i2cWrite(BlinkM.ADDRESS, [BlinkM.BLINK_TO_COLOR, BlinkM.RED, 0x00, 0x00])
    mb.pausems(1000)
    mb.i2cWrite(BlinkM.ADDRESS, [BlinkM.BLINK_TO_COLOR, 0x00, 0x00, BlinkM.BLUE])
    mb.pausems(1000)

Komunikacja po I2C zaczyna się od zatrzymania automatycznej zmiany kolorów (odpala się sama po podłączeniu zasilania). Po tym w pętli zmieniam kolory z czerwonego na niebieski. Adresy w klasie BlinkM wziąłem z dokumentacji. Adres samego urządzenia 0x12 zamiast 0x09 to właśnie dostosowanie na potrzeby pyMCU (kwestia przesunięć bitowych. Biblioteka Arduino robi to za ciebie, pyMCU nie).

Pullup resistors

W przypadku różnych płytek z mikrokontrolerami może pojawić się potrzeba zastosowania rezystorów pull-up (ang. pullup resistors). Niektóre płytki mogą je oferować, inne, jak pyMCU, będą wymagały własnoręcznego dołączenia rezystorów. Potrzebne jest to do prawidłowej komunikacji niektórych układów poprzez I2C. BlinkM tego wymaga, a cała sztuka polega na podłączeniu dwóch rezystorów (4,7 kilooma lub ew. wiecej) VCC (+) do lini zegaru i VCC do linii danych. Przedstawia to poniższy rysunek:

I2C z rezystorami pullup

W przypadku pyMCU nie zastosowania takiego układu spowoduje iż próba komunikacji skończy się zablokowaniem wykonywania skryptu. W przypadku innych mikrokontrolerów pullup resistors wypłyną prędzej czy później w jednym z tutoriali, czy przykładów. Niektóre mają je wbudowane i/lub sterowane poprzez API (czy użyć, czy nie).

MinipH

MinipH z elektrodą BNC

MinipH to ciekawa płytka pozwalająca podłączyć elektrodę pH na złączu BNC (i dokonująca pomiaru pH za jej pomocą). Pośród czujników oferowanych przez sklepy z elektroniką dość trudno o te dotyczące sprzętu laboratoryjnego. SparkFun oferuje co prawda zestawy Atlas Scientific do pomiaru pH, stężenia rozpuszczonego tlenu, czy przewodności (konduktywności) cieczy, lecz są to zestawy dość drogie bo robione przez firmę zajmującą się sprzętem laboratoryjnym dobrej jakości. MinipH, czy akwarystyczne tarcze do Arduino pozwalają nieco liznąć pomiarów jakie dokonuje się w szkolnym laboratorium za niższą cenę.

Płytka MinipH wykorzystuje elektrody na złączu BNC. Można je kupić w Polsce, np. na Allegro i w niektórych sklepach akwarystycznych. Tanie elektrody stosowane są w akwarystyce, droższe w laboratoryjnych pehametrach.

Obsługa płytki jest prosta. Znajdziemy ją na magistrali I2C pod adresem 0x4D. Odczytując dwa bity otrzymamy rejestrowaną obecnie wartość pH:

from time import sleep

import pymcu

mb = pymcu.mcuModule()
ADDRESS = 0x4D
R = 1
W = 0
while True:
    result = mb.i2cRead((ADDRESS << 1) + R,  2)
    sleep(0.1)

mb.i2cWrite()
Wyniki jakie uzyskałem z elektrodą "akwariową":
  • Woda demineralizowana: [7, 94]
  • Roztwór kalibracyjny pH 4,003: [4, 141]
  • Domowy roztwór kwasu cytrynowego: [3, 77]
  • Domowy roztwór sody oczyszczonej (wodorowęglanu sodu): [8, 111]

Na dokładność pomiaru wpływ ma sama elektroda jak i napięcie jakie na wejściu dostaje MinipH - czy to będzie 5V, czy nieco mniej. Jeżeli zależy ci na uzyskiwaniu dokładnych wartości trzeba taki układ skalibrować mierząc pH roztworów o znanym dokładnie odczynie.

RkBlog

Elektronika i Python, 9 October 2013

Comment article
Comment article RkBlog main page Search RSS Contact