Blog (83)
Komentarze (2k)
Recenzje (1)
@cyrylloRaspberry Pi od Zera do 2 — sterujemy GPIO z linii poleceń

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

08.12.2015 18:18, aktualizacja: 14.03.2016 20:51

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.

575853

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.

575855

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
575864

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

575873

pigs m

Składnia polecenia ustawienia trybu pinu

pigs m nr_pinu tryb

Tryb r - wejściowy lub w -wyjściowy np.

pigs m 17 w

ustawia pin 17 jako wyjściowy

pigs m 7 r

ustawia 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 pinu

pigs w nr_pinu wartość

Wartość 1 - stan wysoki oraz 0 - stan niski np.

pigs w 18 1

ustawia pin na stan wysoki czy na pinie ustawiane jest napięcie 3,3V

pigs w 18 0

ustawiony 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 pinu

pigs r nr_pinu

Polecenie 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:

575896

pigs p

Składnia polecenia sterującym wypełnieniem PWM

pigs p nr_pinu wypełnienie

gdzie 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 128

ustawi wypełnienie PWM na 50% Przykład:

575903

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 serwem

pigs 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 1500

ustawi wychylenie serwa na mniej więcej połowę w zależności od rodzaju serwa.

Przykład:

575912

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 stan

pigs pud nr_pinu stan

Gdzie 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:

575920

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 czas

Gdzie czas podajemy w milisekundach np.

pigs mils 1000

odczeka 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
575937

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:

575944

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 1
gpio -g write 23 1

Powyż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 GPIO

gpio readall
Odczyt statusu pinów GPIO w RPi B rev2
Odczyt statusu pinów GPIO w RPi Zero

gpio mode

Składnia polecenia ustawiająca tryb pinu

gpio mode nr_pinu tryb

Tutaj 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 out

Ustawiam pin jako wyjściowy.

gpio write

Składnia polecenia ustawiającego stan pinu

gpio write nr_pinu stan

oczywiście stan pinu ustawić możemy na 0 i 1 np.

gpio write 4 1

ustawi nam pin na stan wysoki.

gpio read

Składnia polecenia odczytującego stan pinu

gpio read nr_pinu

Gdzie odpowiedzią będzie albo wartość 0 czyli stan niski albo wartość 1 czyli stan wysoki. np.

gpio read 4

Przykład:

575973

gpio pwm

Składnia polecenia ustawiającego wypełnienie PWM

gpio 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 512

któ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ładam i.

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ń.

575984

Do następnego wpisu.

Wybrane dla Ciebie
Komentarze (27)