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.