- osiem kanałów GPIO sterowanych przez interfejs I²C,
- wbudowane rezystory pull-down,
- wbudowane diody LED sygnalizujące stan poszczególnych linii GPIO,
- możliwość kaskadowego połączenia do 8 koncentratorów (łącznie do 64 linii GPIO),
- adres I²C ustawiany za pomocą mostków lutowniczych,
- wbudowane mikroprzełączniki do mostkowania linii GPIO,
- złącza zgodne ze standardem Grove,
- napięcie zasilania: 3,3…5,5 V.
Koncentrator zrealizowany jest w oparciu na układzie programowalnego ekspandera GPIO typu MCP23008, za pomocą którego możemy monitorować lub sterować poprzez magistralę I²C nawet ośmioma dodatkowymi liniami GPIO. Ekspander ma trzy wyprowadzenia A0, A1 i A2 ustalające adres, dzięki czemu umożliwia podłączenie do 8 koncentratorów na jednej magistrali I²C oraz rozszerzenie zestawu linii GPIO o maksymalnie 64 dodatkowe wyprowadzenia. Schemat koncentratora pokazano na rysunkach 1a i 1b.
Sygnały GPIO doprowadzone są do 8 złączy I0...I7 w standardzie Grove oraz do gniazd w standardzie Arduino Sensor S0, S4. Każde z gniazd ma podłączone zasilanie (GND, VCC), a wszystkie linie GPIO wyposażone zostały w rezystory pull-down R4...R11, ustalające stan niewykorzystanych w aplikacji wyprowadzeń. Bufory U3...U6 sterują diodami LD0...LD7 sygnalizującymi fizyczne stany wyprowadzeń linii GPIO, co okazuje się bardzo przydatne podczas uruchamiania układu. Przełączniki SW03, SW47 umożliwiają zmostkowanie sygnałów ze złączy I0/I1, I2/I3, I4/I5, I6/I7, co okazuje się przydatne w przypadku czujników lub elementów wykonawczych korzystających z obu sygnałów GPIO złącza Grove, bez konieczności używania nietypowych przewodów. W tym przypadku do podłączenia modułów stosowane są odpowiednio złącza I0, I2, I4, I6. Normalnie przełączniki powinny znajdować się w pozycji OFF, wtedy każde z wyprowadzeń GPIO doprowadzone jest tylko do jednego złącza Grove. Rezystory RP1,2 separują U1 od złączy i zapobiegają jego ewentualnemu uszkodzeniu w wyniku błędnych połączeń lub konfiguracji. Układ U2 zapewnia poprawny reset U1 po włączeniu zasilania. Magistrala I²C wraz z zasilaniem doprowadzona jest do złączy I²CA/B, umieszczonych przelotowo, co ułatwia kaskadowe łączenie kilku koncentratorów. Dodajmy, że układ działa poprawnie w zakresie napięcia zasilania 3,3…5,5 V. Dioda LD8 sygnalizuje obecność zasilania.
Grove_SensorHUB zmontowany jest na dwustronnej płytce drukowanej mechanicznie zgodnej ze standardem Grove – rozmieszczenie elementów zaprezentowano na rysunkach 2 a i 2b. Montaż jest typowy i nie wymaga szczegółowego opisu, a sam układ nie narzuca konieczności specjalnego uruchamiania – należy tylko ustalić położenie zwór adresowych. Adres bazowy koncentratora to 0x20, gdy wszystkie zwory są zalutowane w położeniach „0”. Gotowy układ pokazuje fotografia tytułowa.
Sprawdzenie działania koncentratora najłatwiej wykonać za pomocą Raspberry Pi. Po podłączeniu do magistrali I²C, poleceniem i2cdetect –y 1 sprawdzamy obecność układu na magistrali, zgodnie z rysunkiem 3.
Konfiguracja GPIO MCP23008 ustalana jest w rejestrach wewnętrznych. Do obsługi GPIO wystarcza konfiguracja trzech rejestrów:
- IODIR – 0x00 (ustala kierunek GPIO: 0 – wyjście, 1 – wejście),
- IOPOL – 0x01 (neguje stan pinu wejściowego GPIO: 0 – proste, 1 – negowane),
- GPPU – 0x06 (aktywuje rezystory pull-up GPIO: 0 – wyłączone, 1 – załączone).
W przypadku aktywacji rezystorów pull-up, wyprowadzenie podciągnięte zostaje poprzez rezystor wbudowany w U1 do napięcia VCC, co sygnalizowane jest w module poprzez zaświecenie odpowiadającej diody GPIO – należy o tym pamiętać.
Stan linii wejścia/wyjścia odczytywany jest z rejestru GPIO – 0x09, a zmiana stanu wyjść odbywa się poprzez rejestr OLAT – 0x0A.
Przykładowo: konfigurujemy GPIO0...3 jako wejścia, a GPIO4...7 jako wyjścia.
Po zmianie stanu wyprowadzeń 0...3 (poprzez połączenie ich do masy lub zasilania) możemy odczytać stan linii GPIO poleceniem:
Stan wyjść ustawiamy z użyciem komendy:
Jeżeli wszystko działa poprawnie, moduł można zastosować we własnej aplikacji. W przypadku kaskadowego łączenia koncentratorów, szczególnie przy dłuższych połączeniach, należy zwrócić uwagę na pojemności rozproszone, zdolne zakłócić działanie magistrali – w takich przypadkach rekomendowane jest zastosowanie buforów I²C np. na bazie układu TCA9511.
Adam Tatuś, EP
- R1, R2: 10 kΩ (SMD 0603, 5%)
- R3: 2,2 kΩ (SMD 0603, 5%)
- R4...R11: 1 MΩ (SMD 0603, 5%)
- RP1, RP2: 100 Ω (drabinka CRA06S08)
- RP3, RP4: 2,2 kΩ (drabinka CRA06S08)
- C1, C2: 1 μF
- C3, C5, C6: 100 nF
- C4: 10 μF
- LD0...7: dioda LED zielona (SMD 0603)
- LD8: dioda LED czerwona (SMD 0603)
- U1: MCP23008SS (SSOP20_230)
- U2: MCP100T-315I/TT (SOT-23)
- U3...U6: 74LVC2G34GW.125 (SC88)
- G0, G4: złącze SIP4 niebieskie
- I0...I7: złącze Grove proste
- I²CA, I²CB: złącze Grove kątowe
- S0, S4: złącze SIP4 białe
- SW03, SW47: mikroprzełącznik DIP2 Omron (A6H-2101)
- V0,V4: złącze SIP4 czerwone