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.
Przekaźniki 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.
złącza wyjściowe oraz diody złącza wejściowe oraz przyciski 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.