Raspberry Pi – Sterowanie jasnością diody na Raspberry, czyli PWM

Bawiąc się Raspberry i szukając nowych ciekawych zastosowań zauważyłem, że na żadnych schematach i pinoutach nie ma pinów opisanych jako PWM, które dobrze znamy z np. Arduino. Postanowiłem zrobić mały research w tym celu i znalazłem ciekawą bibliotekę o nazwie pigpio, która może nam posłużyć nie tylko do sprzętowej kontroli PWM, ale także udostępnia nam szereg innych funkcji takich jak np. kontrolowane sprzętowo monitorowanie stanu pinów.

Instalacja biblioteki

Zgodnie z instrukcjami na stronie autora najpierw należy pobrać archiwum zip z kodem:

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

a następnie rozpakować jego zawartość:

unzip pigpio.zip

Teraz możemy przejść do folderu PIGPIO, w którym znajduje się kod źródłowy biblioteki

cd PIGPIO

i skompilować go poleceniem

make

Procesor w malince demonem prędkości nie jest, więc kompilacja może potrwać nieco dłuższą chwilę. Kiedy wszystko już się skończy możemy zainstalować skompilowany program w systemie przez wydanie polecenia

sudo make install

Teraz powinniśmy móc bez problemu uruchomić daemon pigpio wydając polecenie

sudo pigpiod

Należy pamiętać, że uruchamiając malinkę ponownie daemon nie uruchomi się sam.

Autostart daemona pigpio

Aby deamon pigpio uruchamiał się razem z systemem możemy stworzyć skrypt serwisu taki jak w artykule o przycisku zasilania.

Jednak sporo łatwiejszym sposobem jest dodanie prostego wpisu do systemowego crontaba.

Aby tego dokonać wpisujemy w konsoli polecenie

sudo crontab -e

Jeżeli robimy to po raz pierwszy to system zapyta nas jaki edytor preferujemy. Dla mniej zaawansowanych użytkowników polecam wybranie edytora nano.

Kiedy jesteśmy już w trybie edycji na końcu pliku dopisujemy linijkę o następującej treści:

@reboot         /usr/local/bin/pigpiod

, a następnie zapisujemy zmiany i wychodzimy z edytora (kolejno Ctrl + O, Enter i Ctrl + X).

Od teraz program powinien uruchamiać się razem ze startem systemu.

Kontrola nad PWM

Na stronie producenta mamy masę dostępnych przykładów m.in. takich, które możemy wykorzystać pisząc skrypty Pythona.

Ściągnijmy sobie przykład o nazwie Wave PWM2, który jednocześnie może posłużyć nam jako biblioteka do Pythona.

wget http://abyz.me.uk/rpi/pigpio/code/wavePWM_py.zip
unzip wavePWM_py.zip

Teraz możemy zainstalować pobrany plik jako moduł do Pythona, który będziemy mogli wykorzystywać globalnie w systemie używając dyrektywy import.

sudo python wavePWM.py install

Od teraz możemy wykorzystywać tę bibliotekę importując wavePWM w naszych skryptach.

Dla demonstracji działania modułu napisałęm dla Was prosty skrypt w Pythonie 3:

import time
import pigpio
import wavePWM

RGB_GPIOS = [17, 27, 22]

pi = pigpio.pi()
if not pi.connected:
        exit(0)

pwm = wavePWM.PWM(pi)

# Od tej linii możemy pisać własny kod :)
for pin in RGB_GPIOS:
        pwm.set_pulse_start_in_fraction(pin, 0)
        print("Lighting up LED on pin BCM " + str(pin))
        for duty in range(101):
                if duty%20 == 0:
                        print(str(duty) + "%", end="", flush=True)
                if (duty+1)%2 == 0:
                        print(".", end="", flush=True)
                pwm.set_pulse_length_in_fraction(pin, duty/100.0)
                time.sleep(0.03)
                pwm.update()
        print("")
        pwm.set_pulse_length_in_fraction(pin, 0)


# Te dwie linie poniżej zostawiamy w spokoju :)
pwm.cancel()
pi.stop()

Możemy zapisać go jako np. pwm.py w naszym folderze domowym, a następnie uruchomić, ale najpierw podłączmy diodę RGB, żeby efekt był widoczny dla oka :)

Jeżeli mamy diodę ze wspólną katodą, to podłączamy ją do masy, jeżeli znajduje się w niej jedna anoda, nalezy podłączyć ją do pinu 3.3V.

Teraz pin każdego koloru podłączamy przez odpowiednie rezystory ograniczające prąd (np. 220 Ohm) kolejno czerwony do pinu oznaczonego BCM 17, zielony do BCM 27 i niebieski do BCM 22.

Kiedy kwestie sprzętowe mamy już za sobą możemy uruchomić nasz skrypt za pomocą interpretara Pythona 3:

python3 pwm.py

Każdy kolor powinien się stopniowo rozświetlić do maksymalnego natężenia, a następnie zgasnąć.

Poza początkowymi instrukcjami konfiguracyjnymi kluczową rolę odgrywają tutaj metody

  • set_pulse_start_in_fraction
  • set_pulse_length_in_fraction
  • update

Pierwsze dwie funkcje przyjmują dwa parametry. Są to kolejno numer pinu oraz liczba od 0 do 1 oznaczająca w którym momencie cyklu pin ma przejść w stan wysoki, a w któym w niski.

Ostatnia funkcja zatwierdza zmiany i nie przyjmuje żadnych parametrów. Jeżeli jej nie wykonamy to nie zobaczymy efektów.

Przykładowo wykonując po kolei polecenia

pinNumber = 10

pwm.set_pulse_start_in_fraction(pinNumber, 0)
pwm.set_pulse_length_in_fraction(pinNumber, 0.5)
pwm.update()

na pinie numer 10 uzyskamy sygnał PWM o wypełnieniu 50%.

Jeżeli interesuje nas sygnał PWM o innej częstotliwości niż domyślna, lub z innymi parametrami to w pliku wavePWM.py w komentarzach do klasy znajdziemy masę przydatnych informacji. W artykule przedstawiłem najprostszy sposób wysterowania PWMów dla osób, które chcą tylko pobawić się jasnością diody.