PIGPIO czyli software'owe PWM na Raspberry Pi



Drugim poziomem wtajemniczenia w sterowaniu, zaraz po podstawowym zmienianiu wartości logicznych na pinach, jest sterowanie za pomocą sygnłu PWM.

Teoria

Nazwa ta jest skrótem od Pulse Width Modulation, czyli tłumacząc na polski, jest to modulacja szerokością impulsu. O co w tym chodzi? Już tłumaczę...

W szerokopojętej elektryce, energetyce czy elektronice rozróżniamy dwie metody transmisji energii, tj. jako sygnał stały DC - direct current i jako sygnał zmienny AC - alternating current. Pierwszy przypadek to taki, który nie zmienia swojej wartości w czasie. W naszym przypadku naszym przykładem są właśnie stany logiczne. Gdy raz ustawimy stan logiczny na np. wysoki, to będzie on tak trwał w niezmienionej formie, aż do momentu gdy nie zmienimy jego wartości. Drugi przypadek to sygnał zmieniający swoją wartość w czasie. Zmiana tej wartości może mieć różną postać. W przypadku np. zasilania 230V w gniazdkach mamy sygnał sinusoidalny. Sygnał PWM jest sygnałem o charakterze prostokątnym. To co łączy te dwa (sinusoidalny i prostokątny) to fakt, że charakteryzuje je ich częstotliwość. Stanowi o tym jak często pojedynczy sygnał, lub charakterystyczna dla przebiegu zmiana wartości, będzie się powtarzać. Oczywiście występują sygnały o zmiennych przebiegach w czasie, np. szum, ale to już inne zagadnienia. To co dla nas jest ważne to to, że jednym z podstawowych parametrów definiujących sygnał PWM jest jego częstotliwość.

Zgodnie z teorią częstotliwość jest to parametr, który mówi nam ile razy dany sygnał np. PWM powtórzy się w 1s, a jego miarą jest Herc, z symbolem Hz. Często słyszymy lub czytamy takie wartości jak kHz, MHz, GHz, co oznacza odpowiednio:
- kilo Hz, czyli tysiąc herców,
- mega Hz, czyli milion herców,
- giga Hz, czyli miliard herców.

Upraszczając dalszy wywód, oznacza to że zazwyczaj sygnały są powtarzane bardzo dużo razy w ciągu trwania każdej, jednej sekundy.

Kolejnym ważnym parametrem jest tzw. okres sygnału. Okres jest odwrotnością częstotliwości i informuje nas ile trwa jeden pełny cykl sygnału, który nam się powtarza. Jego czasy mogą mieć wartość milisekund, mikrosekund, nano- a nawet pikosekund. Są to odwrotności odpowiednio kilo Hz, Mega Hz, Giga Hz i Tera Hz.

Ale w naszym przypadku nie jest najważniejsze ile trwa okres, ale to że próbując zrozumieć czym jest sygnał PWM, musimy wiedzieć że jego podstawą jest jeden sygnał, który jest wielokrotnie powtarzany.

I teraz to najważniejsze, czyli czym jest modulacja szerokości impulsu? Jest to nic innego tylko zmienianie szerokości wypełnienia sygnału w okresie.

Jak należy to rozumieć?

Jak już wspomniałem sygnał PWM ma charakter prostokątny. To co również jest ważne, jest stosowany (w naszym przypadku) w sterowaniu, więc jego wartość zmienia się pomiędzy wartościami logicznymi 1 i 0. Wartość logiczna 1 to 3,3V a wartość logiczna 0 to 0V.


Na powyższym rysunku możecie zobaczyć trzy różne wartości sygnału PWM. Pierwszy to 10% wypełnienia w okresie, drugi to 50% wypełnienia w okresie, a trzeci to 90% wypełnienia w okresie. Parametrem charakteryzującym sygnał PWM jest tzw. duty cycle. Jest to wielkość która mówi nam ile procent sygnału w danym okresie stanowiła wartość logiczna 1, czyli jaki udział w całym okresie miała wartość logiczna 1.


Reasumując, w operowaniu sygnałem PWM musimy świadomie ustalić dwie rzeczy, tj. częstotliwość sygnału i jego poziom wypełnienia czyli duty cycle.

Instalacja PIGPIO

Pigpio jest biblioteką spełniającą funkcję software'owego generatora sygnałów PWM. Innymi słowy jest to program, który matematycznie wylicza sygnał PWM.

Pigpio nie jest elementem systemu maliny i należy ją zainstalować. Do tego posłużymy się dosłownie kilkoma komendami, które wprowadimy w lxterminal'u.

wget abyz.co.uk/rpi/pigpio/pigpio.zip

Powyższym ściągamy na naszą malinę spakowane pliki biblioteki.

unzip pigpio.zip

Rozpakowujemy paczkę.

cd PIGPIO

wchodzimy do katalogu i wpisujemy dwie komendy.

make
sudo make install

Instalujemy bibliotekę.

Praca z PIGPIO

Po każdym włączeniu maliny, jeżeli chcemy skorzystać z biblioteki PIGPIO należy wpisać komendę

sudo pigpiod

Jeżeli kończymy pracę z biblioteką należy wpisać komendę

sudo killall pigpiod

Prosty program z PIGPIO

A teraz krótki kod pokazujący jak łatwo możemy uruchomić nasze PWM na malinie.

To o czy musimy pamiętać. Chcąc uruchamiać programy wykrzystujące pracę na pinach należy je odpalać z lxterminal'a ponieważ startujemy je komendami dającymi nam status superużytkownika.

Fajnie brzmi a chodzi tylko o to, że uruchamiając program posługujemy się komendą sudo. :)

Sterowanie silnikiem

		import pigpio	# importujemy bibliotekę
		
		PWM=pigpio.pi() 	# inicjujemy bibliotekę
		
		PWM.set_PWM_frequency(12,50)	# określamy częstotliwość sygnału PWM
		PWM.set_PWM_dutycycle(12,100)	# podajemy wartość wypełnienia sygnału
		
		
Kilka uwag do stosowania pigpio:
- biblioteka posługuje się identyfikacją pinów według metody BCM. Dla mniej wtajemniczonych odsyłam do wpisu o pinach.
- w powyższym przykładzie wybraliśmy pin 12, ale jak widać definiowanie tego jest połączone już z innymi kwestiami. Biblioteka w tym przypakdu stosuje funkcje dwuargumentowe, gdzie podajemy pin i np. częstotliwość lub poziom wypełnienia.
- wartości duty cycle podawane są w przedziale od 0 do 255. Dla przykładu wartość 128 odpowiada za 50% wypełnienie sygnału.

Powyższy kod można zastosować do sterowania silnika. Jeżeli chcemy sterować servomechanizmem, komendy są nieco inne.

Sterowanie servo

		import pigpio	# importujemy bibliotekę
		
		servo=pigpio.pi() 	# inicjujemy bibliotekę
		
		servo.set_servo_pulsewidth(12,1500)	# podajemy wartość wypełnienia sygnału
		
		
W przypadku servomechanizmów wartości jakie definiujemy podawane są z przedziału od 0 do 2500. Dobrze jest jednak nie pracować na skrajnych wartościach i przyjmować zakres np. od 500 do 2300. Jest to o tyle ważne że podawanie skrajnych wartości, a co gorsza wartości z poza zakresu prowadzi do uszkodzenia servo.

Cała lista komend jakie można zastosować jest opisana pod tym linkiem:

http://abyz.co.uk/rpi/pigpio/python.html.

Teraz sterowanie z wykorzystaniem PWM na malinie nie powinno już sprawiać problemów. :)

:)