Kurs ESP8266 & MicroPython #3: PWM i ulepszony LED blink

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.

pwm

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Ω):

esp8266_led

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!

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Rozwiąż równanie: *

This site uses Akismet to reduce spam. Learn how your comment data is processed.