LN Digital — klon modułu PiFace dla Banana PRO
Chciał bym dziś zaprezentować i pokazać sterowanie modułem LN Digital dedykowanym dla Banana PRO, którego przedstawiałem krótko we wpisie o dedykowanych modułach dla Banana PRO. Do sterowanie pinami GPIO użyjemy biblioteki WiringBP dla Banana , która została przeportowana z biblioteki WiringPi dla Raspberry Pi.
Moduł posiada układ MCP23S17 na SPI oraz UNL2803A. Na płytce znajduje się 8 wejść oraz 8 wyjść ( z użyciem UNL2803A). Pierwsze dwa wyjścia podłączone maja dwa przekaźniki za pomocą których możemy sterować zasilaniem 230V/10A. Każdy pin wyjściowy posiada podłączona diodę aby zobaczyć status pinu. Dodatkowo obok złącz przekaźników wyprowadzone jest zasilanie 5V.
Natomiast w pinach wejściowych cztery pierwsze piny maja podłączone przyciski , które podciągnięte są pod GND przez rezystor. Wykrywanie przyciśniętego przycisku polega na podciągnięciu pinu na stan wysoki za pomocą funkcji pull_up. Gdy przycisk zostanie naciśnięty przy odczycie wartości pinu otrzymamy 0.
Jak już wcześniej wspomniałem moduł komunikuje się z bananem za pomocą SPI dlatego musimy załadować moduł spi-sun7i najlepiej dodając go do pliku /etc/modules. Pełny opis jak włączyć SPI i nadać uprawnienia dla użytkownika znajdziecie na githubie Lemakera. Reszta pinów GPIO z Banana nie jest używana dlatego możemy je swobodnie używać.
Program testowy test.c
#include <stdio.h> #include <wiringPi.h> #include <mcp23s17.h> #define BASE 100 int main (void) { int i, wart; wiringPiSetup () ; mcp23s17Setup (BASE, 0, 0) ; printf ("LN Digital - Test\n") ; for (i = 0 ; i < 8 ; ++i){ pinMode (BASE + i, OUTPUT) ; } for (i = 0 ; i < 8 ; ++i){ digitalWrite (BASE + i, 1) ; delay (300); } delay (500); for (i = 7 ; i >= 0 ; --i){ digitalWrite (BASE + i, 0) ; delay (400); } for (i = 8 ; i > 16 ; ++i){ pinMode (BASE + i, INPUT) ; pullUpDnControl (BASE + i, PUD_UP) ; } for (i = 8 ; i < 16 ; ++i){ wart = digitalRead (BASE + i); printf ("Pin input nr %d wartosc: %d\n", i - 8 , wart) ; delay (100) ; } return 0 ; }
Kompilacja
gcc -Wall -o test test.c -lwiringPi
Program ustawia kolejno piny wyjściowe na stan wysoki (zapalają się diody), a następnie na stan niski. Potem ustawia piny wejściowe i odczytuje ich wartość wypisując ich status.
W funkcji mcp23s17Setup (x:x:x) pierwsza wartość to startowa numeracja pinów, druga wartość oznacza numer SPI (moduł podłączony jest do SPI0) zaś kolejna służy do rozróżniania kolejnych modułów spi (adresowanie pinów A1‑A3). Więcej informacji na stronie projektu WiringPi.
Oprócz pisania własnej aplikacji z wykorzystaniem biblioteki można skorzystać również z narzędzia gpio biblioteki Wiring BP, za pomocą której z poziomu terminala możemy sterować pinami GPIO
gpio -x mcp23s17:100:0:0 mode 100 out gpio -x mcp23s17:100:0:0 mode 101 in gpio -x mcp23s17:100:0:0 mode 101 up gpio -x mcp23x17:100:0:0 read 101 gpio -x mcp23x17:100:0:0 write 100 1
Do prostych czynności narzędzie gpio całkowicie powinno wystarczy. Pisanie własnego programu opłacalne jest jeśli chcemy reagować w jak najkrótszym czasie na zdarzenia bo jak wiadomo aplikacje pisane w bash-u nie są demonami prędkości.
Przygotuje jeszcze wpis o tym module prezentując prosty interfejs www do sterowania modułem.