Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

Raspberry Pi od Zera do 2 — sterujemy GPIO z linii poleceń

Być może niektórzy z Was mają już od dłuższego czasu malinę, ale używają ją do prostych multimedialnych rzeczy typu odtwarzacz muzyki, czy filmów. Zastanawiałeś się może jak by tu zacząć sterować pinami GPIO w prosty sposób aby posterować jakimiś urządzeniami? Jest przecież tyle bibliotek i możliwości ale nie masz czasu uczyć się zawiłych funkcji bibliotek lub nie jesteś orłem w programowaniu. Nic nie szkodzi, w tym wpisie pokażę Ci jak w prosty sposób za pomocą prostych komend sterować pinami GPIO w dowolnym Raspberry Pi, dzięki czemu posterujesz silniczkami, diodami, serwami, odczytamy stany przycisków itp.

W tym wpisie będę korzystać z dwóch bibliotek mniej popularnej biblioteki GPIO pod nazwą pigpio a przede wszystkim jej rozbudowanym narzędziem pigs oraz popularna mulit-platformową biblioteką WiringPi i jej narzędziem gpio. Wersja maliny nie ma znaczenia, gdyż obydwie biblioteki obsługują wszystkie wersje Raspberry Pi. Tylko ze względu na wersje będziemy mieć różne ilości złącz GPIO.

Zanim zaczniemy zabawę zalecam aktualizację systemu oraz samego firmware'u (przede wszystkim w Zero) sudo apt-get update sudo apt-get upgrade sudo rpi-update Po tym restartujemy system i możemy zacząć instalować biblioteki.

PiGPIO

Biblioteka pigpio pozwala sterować pinami w Raspberry Pi na trzy sposoby. Za pomocą języka C, Python oraz za pomocą prostego polecenia/narzędzia pigs. Dziś przedstawie tą łatwiejszą formę czyli narzędzie pigs, dzięki któremu w prosty sposób możemy z linii poleceń sterować GPIO.

Instalacja biblioteki pigpio

Instalacja biblioteki jest prosta i polega na pobraniu paczki, a następnie jej rozpakowaniu i wykonaniu dwóch poleceń kompilacji i instalacji. wget abyz.co.uk/rpi/pigpio/pigpio.zip unzip pigpio.zip cd PIGPIO make sudo make install

Gdy już mamy zainstalowana bibliotekę możemy zaczynać zabawę i posterować pinami GPIO za pomocą narzędzia pigs.

Aby można było w terminalu wydawać proste polecenia typu pigs w 17 1 musimy uruchomić demona biblioteki za pomocą polecenia sudo pigpiod.

Aby po każdym uruchomieniu systemu nie wpisywać tego polecenia warto je dodać do pliku /etc/rc.local przed linijką exit 0_IP=$(hostname -I) || true if [ "$_IP" ]; then printf "My IP address is %sn" "$_IP" fi sudo pigpiod exit 0

PIGS

Za pomocą narzędzia pigs możemy sterować i ustawiać wiele rzeczy. My będziemy używać podstawowych jego opcji m.in.
  • m - opcja mode pozwalająca ustawić tryb pinu np r -wejściowy oraz w - wyjściowy oraz funkcje alternatywne pinu od 0 do 5
  • w - opcja write pozwalająca ustawić stan pinu na 0 lub 1 czyli go załączyć lub wyłączyć
  • r - opcja read służy do pobierania z pinu jego stanu 0 lub 1
  • p - opcja pwm pozwala sterować programowo wypełnieniem PWM na praktycznie każdym pinie GPIO. Wartość wypełnienia od 0 do 255. Jeśli nie wiesz czym jest PWM polecam zapoznać się z wpisem na Wikipedii oraz filmikiem
  • s - opcja servo pozwala sterować serwomechanizmem. Wartość wypełnienia od 500 do 2500 w zależności od serwa wypełnienie może zawierać się w tym przedziale. Wyłączenie całkowite serwa możliwe jest poprzez ustawienie wartość 0
  • pud - opcja pozwala na podciągniecie pinu do stanu wysokiego (u - pull-up) lub niskiego (d - pull-down) lub wyłączenie wcześniejszych ustawień (o)
  • mils - opóźnienie w milisekundach
Biblioteko korzysta ze standardowej numeryzacji BCM pinów GPIO pokazanej na poniższym obrazku

pigs m

Składnia polecenia ustawienia trybu pinupigs m nr_pinu trybTryb r - wejściowy lub w -wyjściowy
np. pigs m 17 wustawia pin 17 jako wyjściowypigs m 7 rustawia pin 7 jako wejściowy
Reasumując pin wejściowy ustawiamy wtedy gdy na przykład chcemy odczytać wartość z jakiegoś podłączonego urządzenia np przycisku, licznika, które dają jeden ze stanów cyfrowych 0 lub 1. (Tutaj musimy pamiętać że piny Raspberry Pi działają na napięciu 3,3v i podłączenie większego napięcia spali nasze urządzenie)
Zaś jeśli chcemy na przykład sterować zewnętrznymi urządzeniami np serwem, diodą itp. musimy ustawić pin jako wyjściowy.

pigs w

Składnia polecenia ustawiającego stan pinupigs w nr_pinu wartośćWartość 1 - stan wysoki oraz 0 - stan niski
np.pigs w 18 1ustawia pin na stan wysoki czy na pinie ustawiane jest napięcie 3,3Vpigs w 18 0ustawiony jest stan niski czyli GND (brak napiecia)

Za pomocą ustawień stanu pinu możemy np sterować diodą, przekaźnikami itp.

pigs r

Składnia polecenia odczytującego stan pinupigs r nr_pinuPolecenie zwraca nam stan pinu 0 lub 1

Dzięki odczytaniu wartości pinu możemy odczytać np czy przycisk zastał naciśnięty, odczytać impuls z licznika prądu itp.
Przykład:

pigs p

Składnia polecenia sterującym wypełnieniem PWMpigs p nr_pinu wypełnieniegdzie wypełnienie to wartość od 0 do 255 czyli 0 to 0% , 128 to 50% a 255 to 100% wypełnienia. Dzięki wypełnieniu możemy sterować jasnością diody, czy prędkością obrotów silnika.
np.pigs p 23 128ustawi wypełnienie PWM na 50%
Przykład:
Jak widać w przykładzie ustawiamy pin jako wyjściowy, następnie ustawiamy wyełnienie PWM na wartośc 130. Następnie próbujemy odczytać stan pinu za pomocą opcji r i jak widać zwraca nam 1 czyli pin ma stan wysoki. Przykładowo użyłem też opcji gdc (get dutycycle), która obiera ustawione wypełnienie PWM.

pigs s

Składnia polecenia sterująca serwempigs s nr_pinu wartośćGdzie wartość znajduje się od 500 do 2500 i oznacza podobne wypełnienie jak w PWM tyle tylko, że z większą częstotliwością i odstępami. Ustawienie wartości 0 wyłączy serwomechanizm.
np.pigs s 24 1500ustawi wychylenie serwa na mniej więcej połowę w zależności od rodzaju serwa.

Przykład:

W przykładzie ustawiłem pin 21 na stan wyjściowy a następnie ustawiłem pozycje serwa nqa wartość 1750. Do odczytu użyłem opcji odczytującej gpw (get pulsewidth), która pobiera ustawioną częstotliwość dla serwa.

pigs pud

Składnia polecenia podciągający pin na dany stanpigs pud nr_pinu stanGdzie stan może przyjąć wartość u -wysokiego lub d - niskiego. Podciągniecie następuje przez wewnętrzny rezystor.
np.pigs pud 24 u

Przykład:

Ustawiłem pin jako wejściowy a następnie odczytam jego stan. Potem podciągnąłem pin na stan wysoki i ponownie odczytałem jego stan.

pigs mils

Składnia polecenia opóźniającego pigs mils czasGdzie czas podajemy w milisekundach
np.pigs mils 1000odczeka 1 sekundę.

Łączenie poleceń

Oczywiści możliwe jest wydanie jednego polecenia, które wykona kilka operacji naraz.
np.pigs w 22 1 mils 100 w 17 0 mils 200 s 20 1570 r 22 r 17

Dla żadnych wiedzy i możliwości polecenia pigs odsyłam do strony projektu. Sama biblioteka jest moim zdaniem najbardziej rozbudowana i pozwala naprawdę na wiele.

WiringPi

Wiring Pi jest dużo bardziej popularną biblioteką wśród użytkowników mikrokomputerów przeznaczona nie tylko dla Raspberry Pi ale dostępne są jej modyfikacje dla takich platform jak Banana Pi/PRO, Orange Pi , Roseapple Pi czy nowych płytek Lemaker Guitar oraz HiKey.
Biblioteka pozwala sterować pinami GPIO w języku C, Python (osobna wersja tylko dla RPi) jak również z linii poleceń za pomocą narzędzia gpio.

Instalacja biblioteki Wiring Pi

Instalacja biblioteki jest również prosta i wymaga tylko pobrania repozytorium i uruchomienie skryptu budującego i instalacyjnego. Warto zauważyć, że instalacje wykonujemy jako zwykły użytkownik. git clone git://git.drogon.net/wiringPi cd wiringPi ./build

Po instalacji biblioteki możemy zacząć używać narzędzia gpio

GPIO

Narzędzie gpio pozwala sterować w podobny sposób jak narzędziem pigs z tą różnicą że nie musimy uruchamiać żadnego demona. gpio nie pozwoli nam niestety posterować programowym PWM-em czy serwem, ale za to ma obsługę innych ciekawych układów pod SPI i I2C o których pisałem już w ramach wpisów o modułach dla Banana Pro.
Dziś natomiast zaznajomimy się podstawowymi opcjami programu m.in:
  • mode - pozwala ustawić jeden z wielu trybów pinu m.in. in - wejściowy, out - wyjściowy, pwm - tryb pwm (tylko pin 18 oraz 12 dla RPi2) czyli w bibliotece 5 i 26 *info poniżej), up - podciągnięcie pod stan wysoki pull-up, down - podciągnięcie pod stan niski pull-down oraz tri - wyłączenie podciągnięcia
  • write - powala ustawić stan pinu na 1 lub 0
  • read - odczytuje wartość pinu
  • pwm - powala sterować wypełnieniem PWM (tylko na sprzętowym pinie PWM)
  • readall - bardzo przydatna opcja wyświetlająca informacje o ponach
Jak widzimy brakuje tutaj sterowania programowo PWM czy serwomechanizmami, ale sama biblioteka w języku C pozwala na to, brakuje tylko tych opcji w narzędziu gpio.

Warto dodać, że biblioteka korzysta z własnej numeralizacji pinów GPIO pokazana na obrazku poniżej:

Jeśli przyzwyczailiśmy się do standardowej numeralizacji pinów (BCM) możemy użyć flagi -g dzięki czemu zamiast podawać numeralizację biblioteki możemy podać numeralizację BCM.
Przykład:gpio write 4 1gpio -g write 23 1Powyższe przykłady robią to samo tyle tylko, że używamy osobnych numeralizacji pinów, pierwszą z biblioteki wiringpi drugą zaś ze standardowej BCM i używamy przy tym flagi -g.

gpio readall

Polecenie to wyświetli nam stany i informacje o wszystkich pinach GPIOgpio readall

gpio mode

Składnia polecenia ustawiająca tryb pinugpio mode nr_pinu trybTutaj w przeciwieństwie do pigs możemy określać również tryb pwm, oraz pull-up (up), pull-down (down) i wyłącza podciągnięcie (tri) no i oczywiście czy pin ma być wejściowy (in) lub wyjściowy (out). Z czego nie dublujemy trybów dla jednego pinu tj. nie ustawiamy jako wyjściowy a następnie nie ustawiamy zaraz go na pwm.
np.gpio mode 0 outUstawiam pin jako wyjściowy.

gpio write

Składnia polecenia ustawiającego stan pinugpio write nr_pinu stanoczywiście stan pinu ustawić możemy na 0 i 1
np.gpio write 4 1ustawi nam pin na stan wysoki.

gpio read

Składnia polecenia odczytującego stan pinugpio read nr_pinuGdzie odpowiedzią będzie albo wartość 0 czyli stan niski albo wartość 1 czyli stan wysoki.
np.gpio read 4

Przykład:

gpio pwm

Składnia polecenia ustawiającego wypełnienie PWMgpio pwm nr_pinu wartośćgdzie w tym przypadku możemy skorzystać tylko ze sprzętowego pinu GPIO z PWM czyli 5 (18 w BCM) oraz ddatkowo drugiego dla wersji RPi2 26 (12 w BCM) zaś wartość wypełnienia ustawiamy w zakresie 0-1023.
np.gpio pwm 5 512które ustawi nam wypełnienie na 50%

Więcej informacji oraz opcji narzędzia gpio znaleźć można na stronie projektu wiringPi. Jak sami widzicie samo narzędzie nie daje tyle możliwości co pigs ale ma też swoje atuty, chociaż by możliwość sterowania różnymi układami.

W dzisiejszym wpisie to tyle. Przedstawiłem wam trochę teorii i przykładów. Mam teraz nadzieję, że uważacie iż sterowanie GPIO w Rasapberry Pi nie jest takie straszne. Gdy znacie już podstawowe podstawowe polecenia można zacząć pisać skrypty w bash-u. #!/bin/bash PIN=$1 gpio mode $PIN out gpio write $PIN 1 sleep1 gpio write $PIN 0

Zalecam wybranie jednej biblioteki i nie używania ich równocześnie. Oczywiście polecam tu bardziej pigpio ze względu na duże możliwości sterowania z linii poleceń.

Do następnego wpisu. 

linux porady programowanie

Komentarze

0 nowych
tylko_prawda   10 #1 08.12.2015 19:42

Super, ale jakie są zastosowania? Da się do tego coś podłączyć?

TestamenT   11 #2 08.12.2015 21:31

Musze podkraść z bibliotek możliwość aktywowania dodatkowych funkcji w niektórych GPIO. Bo wiem jak edytować odpowiednie komórki pamięci żeby włączać i wyłączać wybrane piny.
Żeby usłyszeć dźwięk z głośnika piezoelektrycznego muszę uruchomić wyższą częstotliwość. A tego nie da się zrobić standardowym pinem.

Ale byłem bardzo zadowolony że udało mi się coś wyświetlić na wyświetlaczu od noki 5510. Czytając dokumentację nic nie byłem wstanie zrozumieć. Dopiero jak zajrzałem do kodu biblioteki dla Arduino to mi się rozjaśniło.
I to wszystko przy pomocy języka Go kompilowanego z poziomu RPi.

Ciero   6 #3 08.12.2015 23:17

Świetny tutek. Dziękuję. :)

  #4 08.12.2015 23:18

@tylko_prawda: https://github.com/F5OEO/rpitx - to tylko jedno z możliwych zastosowań

  #5 08.12.2015 23:39

Ciekawy artykul. Dzieki.

paszczak80   7 #6 08.12.2015 23:47

Cyryllo: trochę z innej baki ale dotyczy maliny, aktualizacja

sudo apt-get update
sudo apt-get upgrade
sudo rpi-update

zawsze tak samo robiłem, a niedawno wyczytałem w sieci, że wystarczą te dwie pierwsze komendy bo rpi-update było potrzebne tylko na początku, a teraz apt-get update, upgrade załatwia wszystko i wręcz niewskazane jest używanie rpi-update (ktoś wręcz twierdził, że jest zabugowane). Szczerze mówiąc do tej pory (kilkanaście update>upgrade>rpi-update) nic się nie stało, ale nie wiem co o tym myśleć.

A i na końcu zasadzam jeszcze

sudo apt-get clean

żeby usunąć śmiecie i stare pakiety z archiwum, trochę miejsca się zawsze odzyskuje :)

cyryllo   16 #7 08.12.2015 23:51

@paszczak80: no w tym przypadku bez rpi_update nie działały gpio pod wiringpi. Być może i zwykły upgrade już to robi

maxxx   3 #9 09.12.2015 10:01

@cyryllo Tak z ciekawości jak wygląda kwestia programowania można przenosić soft z rpi2 ?
Mógłbyś napisać jak się sprawuje zero jako konsolka do staych gierek i przy odtwarzaniu filmów YT i z kodi?

Autor edytował komentarz.
cyryllo   16 #10 09.12.2015 10:14

@maxxx: Zachowuje się podobnie jak rpi b+ tyle tylko, że wydajniej ;)

Oprogramowanie pisane na B+, A+ rpi 2 czy zero powinny być kompatybilne. Co do starszych to zależy czy używał byś tylko pierwszych pinów gpio (pierwsze 26 złącz).

drobok   13 #11 09.12.2015 11:26

@tylko_prawda: tymi pinami wysterujesz wszystko, kwestia odpowiedniego podłączenia, oraz dobrania elementów dodatkowych

maxxx   3 #12 09.12.2015 15:30

@cyryllo: Dzięki, pozostaje tylko zaczekać na dostępność

edmun   12 #13 10.12.2015 16:29

Mam takie pytanie, bo nie wiem czy się zabierać za pisanie. Jeśli chciałbym stworzyć tez kilka wpisów na waszym blogu w tematyce Raspberry Pi, to w jaki sposób to działa na tym portalu? Tyle lat tutaj siedzę i nigdy mnie zbytnio nie interesowało, aby coś dodawać, ale mam trochę więcej teraz czasu i pomyślałem, że może dodam coś od siebie? Np. Raspberry Pi jako server VPN lub serwer Deluge? Cykl miniporadników?

En_der   9 #14 10.12.2015 18:30

@edmun: Piszesz, wstawiasz fotki, edytujesz i jeżeli moderatorzy uznają, że wpis ciekawy publikują go na główenej :)

En_der   9 #15 10.12.2015 18:32

Bardzo maaalinowy wpis. Czekam na więcej :)

Autor edytował komentarz.
  #16 10.12.2015 19:03

@tylko_prawda zobacz http://techfreak.pl/nettemp/
A po za tym wyobraźnia ;-)

edmun   12 #17 10.12.2015 20:38

@En_der: ok, tylko gdzie pisze? Na swoim profilowym blogu? Jest tam jakieś wsparcie bbcode albo HTML żeby załączyć zdjęcia?

En_der   9 #18 10.12.2015 22:00

@edmun: Myślę, że masz na swoim urządzeniu jakiś pakiet biurowy - piszesz, a potem wklejasz do portalowego edytora- Najlepiej załóż temat na forum jak i co robić - Ktoś ci wytłumaczy łopatologicznie. W sumie jest to prosta sprawa, ale tutaj pod wpisem autora - raczej nie miejsce na to.

Autor edytował komentarz.
edmun   12 #20 11.12.2015 09:24

@cyryllo: Dziękuję bardzo :)

edmun   12 #21 11.12.2015 11:45

@En_der: Ok... już widze na czym polegał problem. Wczoraj nie zaczytywał mi się żaden skrypt nad oknem bloga, inaczej mówiąc, wpisując artykuł nie miałem żadnej możliwości jego formatowania czy dodania tagów, bo miałem tylko "Nowy wpis" i "Zapisz". Stąd pewnie moje zdziwienie i pytania jak pisać artykuły.

En_der   9 #22 11.12.2015 13:42

@edmun: W takim razie sukcesów na blogu :)

  #23 19.12.2015 11:49

tak przy okazji cyryllo, kiedy ruszamy z dalsymi przygodami Twoich piBotow?