W tej krótkiej lekcji zajmiemy się PWM (Pulse Width Modulation), czyli modulacją szerokości impulsów. Jest to metoda regulacji sygnału polegającą na zmianie jego wypełnienia. Żeby było łatwiej to wyjaśnić, posłużę się grafiką z tutoriala do Arduino.
‘
W dużym skrócie polega to na naprzemiennym podawaniu stanów 0 i 1 na wyjście. Stosunek czasu trwania stanu wysokiego do całego okresu wyrażony w procentach jest właśnie wspomnianym wcześniej wypełnieniem. Częstotliwość sygnału PWM powinna być na tyle wysoka, żeby np. przy zaświecaniu diody LED ludzkie oko nie mogło dostrzec, że w rzeczywistości dioda naprzemiennie zapala się i gaśnie. Sygnału PWM używa się między innymi też do sterowania prędkością obrotową silników DC, ale nie próbuj tego robić bez dodatkowego układu, tzw. mostka H lub chociażby tranzystora (jeśli nie chcesz zmieniać kierunku obrotów silnika).
Program
Moduł Micropythona machine
, z którego korzystaliśmy poprzednio pozwala na generowanie sygnału PWM na pinach 0, 2, 4, 5, 12, 13, 14 i 15. Jak pewnie pamiętasz z ostatniej lekcji, wbudowana dioda podłączona jest do pinu 16, więc nie sprawdzimy na niej działania PWM. Podłączmy ją więc do pinu GPIO0 (D3 na płytce) zgodnie z poniższym rysunkiem (dla diody czerwonej idealnie jest zastosować rezystor o wartości około 100Ω):
Na ESP8266 wgrajmy zaś taki skrypt o nazwie main.py
:
1 2 3 4 5 | import machine led = machine.Pin(0) led_pwm = machine.PWM(led) led_pwm.freq(10) led_pwm.duty(512) |
Jeśli już kiedyś miałeś do czynienia z PWM to zapewne wiesz, co się stanie. Dioda będzie migać z częstotliwością 10 Hz i jest to zbyt niska częstotliwość, żeby ludzkie oko potraktowało to jako ciągłe świecenie. Stanie się tak dopiero gdy ustawisz częstotliwość 50 Hz lub nawet więcej (nawet przy 50 Hz można zaobserwować zmiany jasności). Za pomocą metody duty
ustawić możesz wypełnienie sygnału od 0 (ciągły sygnał 0) do 1023 (ciągły sygnał 1). Zauważ też, że obiekt PWM
tworzy się inicjując go obiektem Pin
.
Dopiszmy teraz kod odpowiedzialny za płynną zmianę jasności diody – rozwiniemy w ten sposób poprzednią lekcję dotyczącą migania diodą.
6 7 8 9 10 11 12 | while True: for i in range(1024): led_pwm.duty(i) time.sleep_us(500) for i in range(1023,-1,-1): led_pwm.duty(i) time.sleep_us(500) |
Funkcja range(1024)
tworzy nam listę elementów od 0 do 1023 (ostatni element nie jest wliczany) z domyślnym krokiem 1, zaś range(1023,-1,-1)
listę od 1023 do 0 (drugi argument) z krokiem -1. Pętle for
przypisują kolejne wartości z list do zmiennej i
i wykonują swoją zawartość. A taki będzie efekt jego działania:
W kolejnej lekcji pokażę obsługę wejść cyfrowych i analogowych. Do zobaczenia!