Przejdź do treści
Raspberry Pi Pico od zera: MicroPython w praktyce
Podgląd za darmo

Pierwsza dioda: Pin, sleep i toggle

Cel

Zamigasz diodą na płytce, podłączysz trzy zewnętrzne diody z rezystorami i napiszesz „biegnące światło”. Poznasz klasę Pin, funkcje sleep oraz sposób na miganie kilkoma diodami w różnym tempie bez blokowania programu.

Potrzebne części

  • Pico podłączone do komputera (albo tylko symulator)
  • diody LED: czerwona, żółta, zielona
  • 3 rezystory 330 Ω
  • płytka stykowa, 4 przewody

2.1. Dioda na płytce

Pico ma wbudowaną zieloną diodę. W MicroPythonie ma nazwę "LED":

MicroPython
from machine import Pin
from time import sleep

led = Pin("LED", Pin.OUT)   # pin jako wyjście

while True:
    led.on()                # stan wysoki: 3,3 V, dioda świeci
    sleep(0.5)              # czekaj pół sekundy
    led.off()               # stan niski: 0 V
    sleep(0.5)

Co tu się dzieje:

  • Pin("LED", Pin.OUT) konfiguruje pin jako wyjście. Na Pico i Pico 2 to GP25. Na Pico W i Pico 2 W dioda jest podłączona do układu radiowego, a nie do GP25, dlatego zawsze pisz "LED", nie 25. Ta nazwa działa na każdym modelu.
  • on() i off() to skróty dla value(1) i value(0).
  • sleep() z modułu time przyjmuje sekundy (także ułamki). Są też sleep_ms() i sleep_us() dla milisekund i mikrosekund.

Krócej, z toggle(), które odwraca aktualny stan:

MicroPython
from machine import Pin
from time import sleep_ms

led = Pin("LED", Pin.OUT)

for i in range(10):
    led.toggle()
    print("krok", i)
    sleep_ms(300)

led.off()
print("Koniec.")

Ten program kończy się sam po dziesięciu krokach (pięć mrugnięć), a na końcu gasi diodę.

2.2. Rezystor do diody

Dioda LED przewodzi prąd tylko w jedną stronę i ma prawie stały spadek napięcia U_F (ok. 2 V dla czerwonej). Resztę napięcia musi przejąć rezystor, a jego wartość wyznacza prąd:

tekst
R = (U_pin − U_F) / I = (3,3 V − 2,0 V) / 0,004 A ≈ 325 Ω  →  330 Ω
I = (3,3 V − 2,0 V) / 330 Ω ≈ 3,9 mA

4 mA wystarcza, żeby zwykła dioda 5 mm świeciła wyraźnie, i mieści się w domyślnej wydajności pinu Pico (4 mA). Cały układ RP2040 może oddać ze wszystkich pinów łącznie ok. 50 mA, więc trzy diody po 4 mA to bezpieczny zapas.

Rezystor Prąd (U_F = 2,0 V) Komentarz
220 Ω ≈ 5,9 mA jaśniej, nadal bezpiecznie dla pojedynczej diody
330 Ω ≈ 3,9 mA wartość kursowa
1 kΩ ≈ 1,3 mA słabiej, ale nowoczesne diody nadal widać

⚠️ Diody niebieskie, białe i jasne zielone mają U_F ok. 3 V. Przy 3,3 V z pinu zostaje na rezystorze tylko 0,3 V, więc świecą bardzo słabo. Do kursu wybierz zwykłą zieloną diodę (U_F ok. 2,1 V).

2.3. Podłączenie trzech diod

Każda dioda ma własny rezystor. Obwód: pin GP → rezystor 330 Ω → anoda (dłuższa nóżka) → katoda (krótsza nóżka, ścięta krawędź obudowy) → GND.

Schemat: GP15, GP14 i GP13, każdy przez rezystor 330 Ω do anody diody (czerwonej, żółtej, zielonej), katody połączone z masą

Rys. 2.1. Trzy diody z rezystorami. Te same piny i kolory są w symulatorze.

Pin GP Pin fizyczny Element
GP15 20 rezystor 330 Ω → anoda czerwonej diody
GP14 19 rezystor 330 Ω → anoda żółtej diody
GP13 17 rezystor 330 Ω → anoda zielonej diody
GND 18 lub 23 szyna „−” płytki stykowej ← katody wszystkich diod

Na płytce stykowej: wepnij Pico okrakiem nad rowkiem środkowym, tak żeby każdy pin trafił do osobnego rzędu otworów. Połącz pin GND z szyną „−”, a katody diod wepnij bezpośrednio w szynę „−”. Rezystor może stać po dowolnej stronie diody, ważne, żeby był połączony szeregowo.

2.4. Biegnące światło

MicroPython
from machine import Pin
from time import sleep_ms

leds = [Pin(15, Pin.OUT), Pin(14, Pin.OUT), Pin(13, Pin.OUT)]  # czerwona, żółta, zielona

try:
    while True:
        for led in leds:
            led.on()
            sleep_ms(200)
            led.off()
except KeyboardInterrupt:
    for led in leds:
        led.off()           # po Stop zgaś wszystkie
    print("Zatrzymano.")

Stop (w symulatorze, przeglądarce i Thonny) wysyła Ctrl+C, a MicroPython zgłasza wtedy wyjątek KeyboardInterrupt. Bez bloku try/except diody zostałyby w ostatnim stanie, bo pin po zakończeniu programu trzyma ustawioną wartość.

2.5. Miganie bez blokowania: ticks_ms

sleep() zatrzymuje cały program. Jeśli chcesz migać dwiema diodami w różnym tempie, a w następnych lekcjach jeszcze reagować na przycisk, lepiej sprawdzać, ile czasu minęło:

MicroPython
from machine import Pin
import time

red = Pin(15, Pin.OUT)
green = Pin(13, Pin.OUT)

t_red = t_green = time.ticks_ms()

while True:
    now = time.ticks_ms()
    if time.ticks_diff(now, t_red) >= 500:     # co 500 ms
        red.toggle()
        t_red = now
    if time.ticks_diff(now, t_green) >= 150:   # co 150 ms
        green.toggle()
        t_green = now
    time.sleep_ms(5)                           # krótka przerwa, pętla i tak kręci się 200 razy na sekundę

ticks_ms() to licznik milisekund od startu płytki. Po pewnym czasie „przekręca się” do zera, dlatego różnicę zawsze licz przez ticks_diff(nowszy, starszy), a nie zwykłym odejmowaniem.

2.6. Timer: miganie w tle

machine.Timer wywołuje funkcję co zadany czas, niezależnie od głównego programu:

MicroPython
from machine import Pin, Timer

led = Pin("LED", Pin.OUT)

def mrugnij(t):
    led.toggle()

timer = Timer(period=250, mode=Timer.PERIODIC, callback=mrugnij)
print("Program się skończył, a dioda dalej miga. Zatrzymaj ją przyciskiem Stop.")

Program kończy się od razu, ale timer działa dalej, aż do Stop (w symulatorze) albo timer.deinit(). Funkcja wywoływana przez timer powinna być krótka: bez sleep i bez długich obliczeń.

Typowe błędy

  • Pin(25) nie miga na Pico W / Pico 2 W: tam dioda nie jest na GP25. Pisz Pin("LED", Pin.OUT).
  • sleep(500) zamiast sleep_ms(500): program czeka 500 sekund. sleep() przyjmuje sekundy.
  • Dioda nie świeci: odwrotnie wpięta (obróć ją, przy 3,3 V nic jej się nie stanie), rezystor i nóżka diody w różnych rzędach płytki stykowej, brak połączenia GND z szyną „−”.
  • Dioda świeci cały czas, niezależnie od programu: przewód w pinie 3V3(OUT) albo VBUS zamiast w pinie GP. Sprawdź numer pinu fizycznego na rysunku 1.1.
  • Brak rezystora: dioda świeci bardzo jasno i się grzeje. Natychmiast odłącz USB i dodaj rezystor.
  • Zły numer GP: Pin(20) to GP20, a nie pin fizyczny 20. W kodzie zawsze numer GP.

Zadania

  1. SOS: nadaj diodą czerwoną alfabetem Morse'a SOS (3 krótkie po 200 ms, 3 długie po 600 ms, 3 krótkie, przerwa 1,5 s).
  2. Sygnalizacja świetlna: czerwone (3 s) → czerwone + żółte (1 s) → zielone (3 s) → żółte (1 s) → od początku.
  3. Licznik binarny: pokaż na trzech diodach liczby od 0 do 7 (zielona = bit 0, żółta = bit 1, czerwona = bit 2). Podpowiedź: (n >> 1) & 1 daje bit nr 1 liczby n.
  4. Przerób program z 2.5 tak, żeby trzecia dioda (żółta) migała co 1 s.

Podsumowanie

Pin(numer, Pin.OUT) robi z pinu wyjście, a on(), off(), value() i toggle() zmieniają jego stan. Wbudowaną diodę adresuj nazwą "LED". Zewnętrzną diodę zawsze łącz przez rezystor: 330 Ω daje przy 3,3 V ok. 4 mA. Do kilku niezależnych rytmów używaj ticks_ms() i ticks_diff() zamiast sleep(), a do pracy w tle Timer.

Napisz