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.