Onion Omega 2 — sterujemy pinami GPIO
W pierwszym wpisie zaprezentowałem i opisałem samą płytkę Onion Omega2. Zaś w tym wpisie zaprezentuję jak steruje się pinami GPIO z poziomu CLI. Do samej Cebuli mam dokupioną płytkę rozszerzającą Onion Expansion Doc i do niej podłączyłem główny moduł. Teraz sterowanie i obsługa Cebuli jest wygodna i możemy to robić bezpośrednio przez konsolę za pomocą kabla USB od smartfona, bo jak czytaliście we wcześniejszym wpisie cebula nie współpracuje z moim routerem od Mikrotika.
Specyfikacja Onion Expansion Dock
- port microUSB - do zasilania i komunikacji
- port USB A
- wbudowana dioda LED RGB
- przyciski Reset oraz włącznik Power
- 30 pinowe złącze umożliwiające podłączenie nakładek
Złącza GPIO
30 piniowe złącze posiada wyprowadzenia z cebuli ale również dodatkowo piny 5V zasilane z microUSB.
Jak widać mamy wszystko przedstawione co znajduje się na danych pinach. Warto tutaj dodać, że 2 piny PWM znajdujące się na 18 i 19 pinie i mają swoje kanały oscylatora. Sterowanie samymi pinami możemy wykonywać podając ich numery zaś jeśli chcemy użyć PWM musimy posłużyć się numerami kanałów czyli CH0 > 0 i CH1 > 1.
fast-gpio
Narzędzie fast-gpio powala sterować pinami cyfrowymi oraz generować tylko programowo PWM. Generowanie PWM odpala nam osobny proces, który generuje nam wskazany sygnał na wybranym pinie. Taki PWM być może nada się np do LEDów i jeśli nie będziemy zbytnio niczym innym obciążać procesora to nada się też do sterowania silnikami, ale o płynnym sterowaniu serwami możemy zapomnieć. Z mojego komputera połączyłem się do płytki za pomocą kabla usb‑microusb a następnie za pomocą programu PuTTY podłączyłem się do portu COM13 (jaki ustawił mi system) z prędkością 115200. Po wydaniu polecenia fast-gpio w putty otrzymamy informację o dostępnych poleceniach tego narzędzia.
Opcja set-input ustawia nam pin jako wejściowy
fast-gpio set-input 0
powyższe polecenie ustawi nam pin 0 jako wejściowy, dzięki czemu możemy np. odczytywać sygnał naciśnięcia przycisku. Opcja set-output ustawi nam dany pin jako wyjściowy tak abyśmy mogli np zapalać diodę itd.
fast-gpio set-output 1
Polecenie to ustawia pin 1 jako wyjściowy. Teraz za pomocą opcji get-direction możemy sprawdzić jak dany pin jest ustawiony
fast-gpio get-direction 0
otrzymamy informacji na konsoli czy pin jest w stanie wejścia input czy wyjścia output.
Następną opcja jest read, która odczytuje stan pinu zwracając 0 (stan niski) lub 1 (stan wysoki)
fast-gpio read 0
Natomiast za ustawianie pinów na stan wysoki lub niski odpowiada opcja set podając jako pierwszy parametr nr pinu a drugi parametr 0 jako stan niski lub 1 jako wysoki
fast-gpio set 1 1
Wreszcie dotarliśmy do programowego PWM a za sterowanie jego odpowiada opcja pwm z trzema parametrami. Pierwszy parametr to nr pinu, drugi to ilość sygnałów na sekundę (w Hz) zaś kolejny to procent wypełnienia od 0‑100
fast-gpio pwm 2 50 100
Polecenie to ustawia PWM na pinie 2 z częstotliwością sygnału 50Hz i wypełnieniem 100% jako osobny proces, który możemy zobaczyć np. za pomocą programu top
Aby wyłączyć programowy PWM na pinie 2 musimy go ustawić na stan niski
fast-gpio set 2 0
O ostatniej opcji pulses nie znalazłem informacji jak tego używać
fast-gpio pulses <gpio><path_pulses_file><repeats>
Ale służy zapewne do asynchronicznego sterowania stanami danego pinu i ich powtórzeń.
Sprzętowy PWM
Do sterowania sprzętowym PWM w konsoli służy narzędzie pwm-exp. Jak wspominałem wcześniej tutaj posługujemy się numerami kanałów oscylatora wbudowanego w układ cebuli.
Sama cebula posiada 2 kanały CH0 (na pinie 18) i CH1 (na pinie 19) zaś do sterowania używamy numerów 0 i 1. Przed korzystaniem z oscylatora i generowania PWM musimy go w pierwszej kolejności uruchomić wydając polecenie
pwm-exp -i
Konstrukcja polecenia wygląda tak
pwm-exp [Opcje] <kanał><Procent wypełnienia>
Opcje jakie mamy dostępne to
- -i - włączenie oscylatora
- -s - wyłączenie oscylatora
- -p - pozwala na ustawienie na określony czas w ms
- -f - ustawia częstotliwość impulsów w Hz
- -q - nie wyświetla informacji po wydaniu polecenia
- -v - wyświetla dodatkowe informacje po poleceniu
Kanał możemy podać albo konkretny lub wybierając wszystkie dodając zamiast nr kanału all
pwm-exp all 50
Powyższe polecenie ustawia wszystkie kanały z częstotliwością 50Hz (domyślna gdy nie podajemy parametru z opcja -f) z wypełnieniem 50%. Sterowanie pojedynczym kanałem z ustawieniem np. częstotliwości 100Hz i wypełnieniu 70% wygląda tak
pwm-exp -f 100 0 70
Jak widać wykonałem również ustawienie 1 kanału z opcją -q dzięki czemu polecenie nie zwróciło nam informacji zwrotnych. Jak wspominałem gdy nie podajemy parametru -f odpowiadającego za częstotliwość polecenie ustawia jego wartość domyślną na 50Hz
Wyłączenie oscylatora możemy wykonać za pomocą opcji -s co wiąże się z zatrzymaniem ustawionych sprzętowych PWM‑ów.
pwm-exp -s
omega2-ctrl
Za pomocą narzędzia omega2-ctrl możemy przełączyć tryby pinów GPIO przełączając np. funkcje UART, SPI czy I2C na zwykłe piny GPIO. Za pomocą poniższego polecenia możemy sprawdzić jak w obecnej chwili są ustawione grupy pinów funkcyjnych.
omega2-ctrl gpiomux get
Ustawione obecnie tryby znajdują się w nawiasach kwadratowych []. Aby zmienić tryb danych grup należy wykonać polecenie
omega2-ctrl gpiomux set <Grupa><Tryb>
Czyli np. gdy chcemy zmienić tryb dla pinów I2C na gpio musimy wykonać polecenie
omega2-ctrl gpiomux set i2c gpio
i analogicznie dla pozostałych.
Podsumowanie
Mam nadzieję, że przybliżyłem wam informację jak w prosty sposób sterować GPIO w cebulach. Pominąłem we wpisie narzędzie gpioctl, które ma dość małą funkcjonalność i jest wolniejsze niżeli fast-gpio. Myślę, że w późniejszym czasie przygotuje kolejny wpis już z konkretnym działającym przykładem. Muszę przyznać że cebula pomimo moich problemów z routerem wciągnęła mnie mocno i zamierzam zagłębiać się w jej możliwości z wykorzystaniem również bibliotek dla C, Javascript i Python-a. A więc do następnego wpisu.