Ściemnianie diod LED i nie tylko: PWM na Raspberry Pi
PWM to coś, czego wszyscy używamy na co dzień, nawet jeśli o tym nie wiemy. Jest to technika, która jest prosta i niezwykle przydatna w wielu zastosowaniach. Co więcej, jest to coś, co Raspberry Pi może zrobić bez wysiłku. Jak? Przyjrzyjmy się temu.
Co to jest PWM?
Termin “modulacja szerokości impulsu”, choć pozornie skomplikowany, odnosi się do czynności szybkiego przełączania sygnału elektrycznego między stanami włączenia i wyłączenia. Technika ta oferuje prosty sposób generowania zmiennych sygnałów analogowych bez konieczności stosowania dodatkowego sprzętu, takiego jak Raspberry Pi HAT lub komponenty zewnętrzne. Rzeczywiście, w przypadku zadań takich jak sterowanie palnikiem kuchenki, obracanie silnika lub regulacja jasności diody LED, sygnał PWM skutecznie naśladuje prawdziwe napięcie analogowe.
Cykle pracy
Proces ten polega na podawaniu sekwencji impulsów do obciążenia, którym jest napędzany obiekt. Choć czynność ta sama w sobie może wydawać się prymitywna, staje się znacznie bardziej znacząca, gdy czas trwania tych impulsów ulega modyfikacji. Zmieniając szerokość impulsów, jesteśmy w stanie zmienić długość czasu, w którym pozostają one aktywne lub “włączone”. Proporcja czasu w każdym cyklu, w którym impuls pozostaje aktywny, jest określana jako cykl pracy.
Rozważmy sygnał modulowany szerokością impulsu (PWM) o napięciu trzech woltów, którego cykl pracy wynosi pięćdziesiąt procent. W tym scenariuszu średnie napięcie przyłożone do diody elektroluminescencyjnej (LED) odpowiadałoby nieprzerwanemu sygnałowi o napięciu półtora wolta. Zwiększając cykl pracy, jasność diody LED wzrośnie, podczas gdy jego zmniejszenie spowoduje odpowiedni spadek jasności. Podobnie, sygnały audio mogą być również generowane przez wykorzystanie PWM, co może prowadzić do zakłóceń wyjścia audio z Raspberry Pi, jeśli inne aplikacje PWM są używane jednocześnie.
PWM na Raspberry Pi
Wykorzystanie programowej modulacji szerokości impulsu (PWM) jest realną opcją dla wszystkich pinów GPIO na Raspberry Pi. Jednak dostęp do sprzętowej funkcji PWM jest ograniczony do określonych pinów, a mianowicie GPIO12, GPIO13, GPIO18 i GPIO19.
Wykorzystanie oprogramowania komputerowego do generowania sygnału może skutkować zwiększonym zużyciem zasobów procesora. Podczas gdy jednostka centralna (CPU) jest zajęta tym zadaniem, może być zajęta innymi obowiązkami, które mogą negatywnie wpłynąć na czas modulacji szerokości impulsu (PWM).
W związku z tym często lepszym pomysłem jest delegowanie tego zadania do wyspecjalizowanych obwodów. W przypadku Raspberry Pi obwód ten znajduje się wewnątrz układu System on Chip, w którym znajduje się procesor.Sprzętowy PWM jest często znacznie bardziej precyzyjny i wygodny, a zatem jest preferowaną opcją w większości przypadków. Jeśli chcesz dowiedzieć się, co dzieje się pod maską układu Broadcom BCM2711 w Raspberry Pi 4, możesz zapoznać się z dokumentacją BCM2711 . Rozdział 8 obejmuje zagadnienia PWM!
Ściemnianie diody LED
Aby nasza dioda LED działała prawidłowo wraz z naszym Raspberry Pi, będziemy musieli wykonać kilka operacji na płytce drukowanej. Proces ten obejmuje podłączenie diody LED i rezystora regulującego prąd w konfiguracji szeregowej. Ważne jest, aby rezystor ten był dołączony, ponieważ służy on do zapobiegania nadmiernemu prądowi diody LED, chroniąc ją w ten sposób przed niefortunną śmiercią charakteryzującą się nieprzyjemnym zapachem emanującym z dymnego rozpadu.
Obliczanie wartości rezystora
Pozycja, w której rezystor jest podłączony do diody LED, nie ma żadnego wpływu na jej działanie; to raczej wartość rezystancji określa przepływ prądu przez urządzenie. Biorąc pod uwagę, że Raspberry Pi 4 może dostarczyć około 16 miliamperów (mA) na pin, można wykorzystać prawo Ohma do obliczenia wartości rezystancji niezbędnej do prawidłowego działania.
Powyższa zasada mówi, że impedancja musi być równoważna różnicy potencjałów na przewodniku w odniesieniu do przepływającego przez niego prądu. Wiadomo, że napięcie dostarczane przez pin GPIO Raspberry Pi wynosi 3,3 V, a zalecany prąd to 16 miliamperów, czyli 0,016 ampera. Po podzieleniu tych wartości otrzymujemy wynik 206. Jednak znalezienie rezystorów o tak dokładnych specyfikacjach może okazać się trudne; dlatego zamiast tego zostanie zastosowana alternatywa 220 omów.
Podłącz dodatni zacisk (anodę) paska LED do GPIO 18, który odpowiada fizycznemu pinowi 12 na Raspberry Pi. Dodatkowo podłącz ujemny zacisk (katodę) paska LED do dowolnego z pinów uziemienia urządzenia. Pamiętaj, aby dołączyć rezystor do obwodu, umieszczając go w dowolnym miejscu wzdłuż ścieżki, w zależności od potrzeb. Po zakończeniu tych przygotowań możesz przystąpić do realizacji projektu.
Implementacja PWM na Raspberry Pi
Aby sprzętowy PWM działał na Raspberry Pi, użyjemy biblioteki rpi-hardware-pwm od Camerona Davidsona-Pilona , zaadaptowanej z kodu autorstwa Jeremy’ego Impsona . Została ona użyta w Pioreactor (bioreaktorze opartym na Pi) - ale jest wystarczająco prosta dla naszych celów.
Rozpoczniemy od dostępu do pliku konfiguracyjnego znajdującego się w folderze “/boot”.Aby kontynuować nasze zadanie, konieczne jest dołączenie pojedynczej linii tekstu, a mianowicie “dtoverlay=pwm-2chan”. Jeśli będziemy potrzebować wykorzystać piny GPIO poza tymi przypisanymi do 18 i 19, możemy dołączyć dodatkowe parametry w razie potrzeby. W tym przypadku jednak zachowamy prostotę.
Uruchom ponownie Pi i uruchom:
lsmod | grep pwm
Niniejsze polecenie daje kompleksowy spis wszystkich modułów, które zostały dołączone do podstawowego komponentu systemu operacyjnego, zwanego jądrem. Aby wskazać wyłącznie komponenty związane z modulacją szerokości impulsu, wykorzystujemy funkcję grep, która oznacza “globalnie stosowaną drukarkę wyrażeń regularnych”.
Jeśli obecność “pwm\_bcm2835” w skatalogowanych modułach wskazuje na udaną instalację, zbliżamy się do zakończenia naszego wstępnego procesu konfiguracji. Ostatnim krokiem jest instalacja właściwej biblioteki za pomocą polecenia z terminala:
sudo pip3 install rpi-hardware-pwm
Jesteśmy teraz gotowi do rozpoczęcia pracy.
Kodowanie obwodu LED PWM
Rzeczywiście, nadszedł czas, aby zagłębić się w świat programowania, wykorzystując język Python w środowisku Thonny. Aby rozpocząć, należy zainicjować platformę Thonny, a następnie odtworzyć dostarczony fragment kodu w jej interfejsie. Po pomyślnym wprowadzeniu kodu należy nacisnąć przycisk “Uruchom”, aby wykonać program.
from rpi_hardware_pwm import HardwarePWM
import time
pwm = HardwarePWM(pwm_channel=0, hz=60) # here's where we initialize the PWM
pwm.start(0) # start the PWM at zero – which means the LED is off
for i in range(101):
pwm.change_duty_cycle(i)
time.sleep(.1) # by introducing a small delay, we can make the effect visible.
pwm.stop()
Rzeczywiście, w normalnych okolicznościach należy zaobserwować, że dioda LED będzie stopniowo świecić coraz jaśniej, aż do momentu, gdy zmienna licznika osiągnie wartość 100. W tym momencie przestanie świecić. Szczegółowe zbadanie tego zjawiska jest uzasadnione.
Importujemy odpowiednią część sprzętowej biblioteki PWM wraz z powiązanym z nią modułem czasowym i definiujemy nową zmienną. Zmiennej pwm\_channel można przypisać wartość 0 lub 1, przy czym 0 odpowiada pinowi GPIO 18 na Raspberry Pi, a 1 jest mapowane na pin GPIO 19.
Można dowolnie przypisać wartość herca (hz) do żądanej częstotliwości, chociaż należy wziąć pod uwagę praktyczne ograniczenia, takie jak szybkość przetwarzania Raspberry Pi. Wartość 60 Hz nie powinna wykazywać zauważalnego migotania modulacji szerokości impulsu (PWM). Zaleca się rozpoczęcie od bardzo niskiej wartości hz, powiedzmy 10, i stopniowe jej zwiększanie, aż dostrzegalne impulsy staną się widoczne. Takie podejście umożliwia bezpośrednią obserwację zjawiska, zamiast polegać na zwykłej akceptacji stwierdzeń.
Nasze obecne zadanie polega na stopniowym zwiększaniu cyklu pracy sygnału modulacji szerokości impulsu (PWM), w zakresie od zera do stu procent, przy użyciu pętli for Pythona.Parametr “time.sleep” można dostosować do osobistych preferencji lub konkretnych wymagań, ponieważ PWM jest przetwarzany sprzętowo i działa niezależnie od opóźnień oprogramowania.
Jest więcej do nauczenia się o PWM
Rzeczywiście, to godne pochwały, że z powodzeniem wykonałeś program PWM na swoim Raspberry Pi. Należy jednak pamiętać, że potencjalne zastosowania modulacji szerokości impulsu są niezwykle rozbudowane, gdy wykorzystuje się odpowiedni sprzęt peryferyjny, taki jak dedykowany PWM HAT. W związku z tym rozsądnie byłoby nie ograniczać się do prostego podświetlenia pojedynczej diody LED, ale raczej zbadać możliwości sterowania silnikami, kodowania informacji i generowania sygnałów audio za pomocą różnych środków modulacji. Dostępne możliwości są naprawdę bogate i czekają na eksplorację.