Raspberry Pi posiada jeden sprzętowy port PWM, za pomocą którego możemy sterować serwami czy silnikami. Problemem staje się, gdy chcemy podpiąć już dwa serwa lub silniki przez sterownik. Na szczęście istnieją biblioteki, dzięki którym możemy stworzyć dodatkowe programowe porty PWM. Obecnie dostępne są dwie biblioteki: WiringPi oraz pigpio, które pozwalają na programowe ustawienie pinów GPIO jako PWM na Raspberry Pi.

Działanie skryptu pokazane jest na filmiku:

Przedstawię bibliotekę pigpio, gdyż jest łatwiejsza w obsłudze oraz nie obciąża zbytnio procesora jak ma to miejsce w WiringPi.

Instalacja biblioteki pigpio w Raspbian

Pobieramy archiwum biblioteki za pomocą polecenia

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

następnie rozpakowujemy archiwum

tar -xvf pigpio.tar

przechodzimy do rozpakowanego katalogu

cd PIGPIO

następnie wykonujemy polecenie

cp libpigpio.a-hard libpigpio.a

a następnie budujemy i instalujemy bibliotekę

make & make install

na koniec uruchamiamy program pigpiod, który domyślnie nasłuchuje na porcie 8888 i możliwa jest komunikacja z nim poprzez sieć (więcej na stronie). Program musi być uruchamiany po każdym uruchomieniu systemu. Jeśli ktoś zamierza korzystać z niego na stałe warto dodać go do programów domyślnie uruchamianych z systemem.

sudo pigpiod

Schemat testowego układu

Zbudujemy teraz układ przedstawiony poniżej. Do pinu 17 podłączamy pierwsze serwo, zaś do pinu 21 drugie. Zasilanie w naszym układzie zapewniają 4 baterie AAA dające prąd 4.8V wystarczający do sterowania naszymi serwami. Do naszego przykładu użyjemy dwa mikro-serwa  Redox S90, którymi będziemy sterować za pomocą RPi.

układ serv PWM

Sterowanie serwami z poziomu konsoli

Z biblioteka pigpio dostarczone są dodatkowe programy i usługi m.in. proste narzędzie do sterowania portami IO pigs. Za pomocą tego narzędzia można ustawiać długość impulsów PWM pigs s [długość] (gdzie zakres musi być od 0,5ms do 2,5ms. czyli w naszym przypadku od 500 do 2500). Sama aplikacja wysyła domyślnie 50 impulsów na sekundę. Można również użyć pigs p np do zwiększania obrotów silników lub do sterowania napięciem zasilania diody od 0 do 255. Np. aby dioda świeciła z 50% mocy wystarczy wydać polecenie pigs p [nrpinu] 128

Ustawiamy obydwa serwa pierwsze na maksymalnym obrocie, drugie na początkowym położeniu

pigs s 17 500
pigs s 21 2500

następnie na odwrót:

pigs s 17 2500
pigs s 21 500

następnie ma środkowe położenie:

pigs s 17 1250
pigs s 21 1250

Polecamy przetestować samemu z innymi wartościami z zakresu 500-2500.

Wykonamy teraz prosty skrypt który obracać będzie  serwami w obu kierunkach. Tworzymy plik:

nano serwa.sh

piszemy program:

#!/bin/bash

for ((;;)); do
x=500

while [ $x -le 2500 ]; do
pigs s 17 $x
pigs s 21 $x
sleep 0.05
x=$[x + 50]
done

y=2500

while [ $y -gt 500 ]; do
pigs s 17 $y
pigs s 21 $y
sleep 0.05
y=$[y - 50]
done

done

zapisujemy [CTRL+o] i wychodzimy [CTRL+x]. Następnie ustawiamy nasz skrypt, jako wykonywalny:

chmod +x serwa.sh

i uruchamiamy:

./serwa.sh

Aby zakończyć program wciskamy [CTRL+c]

Sterowanie PWM za pomocą biblioteki pigpio.h

Istnieje również możliwość użycia biblioteki do języka C pigpio.h za pomocą, której możliwe jest sterowanie portami gpio w RPi. Przykładowe aplikacje dostępne są na stronie z przykładami. Opis funkcji oraz więcej informacji na stronie projektu.