Základy v CircuitPythonu

Krok za krokem od prvního blikání LEDky až po vlastní mini hru. Žádné předchozí zkušenosti s Pythonem nepotřebujete – jdeme polopaticky.

Co je CircuitPython #

CircuitPython je verze Pythonu od firmy Adafruit, navržená přímo pro mikrokontroléry. Píšete v ní normální Python, ale váš kód běží přímo v Picopadu. Po nahrání firmwaru se Picopad chová jako USB flash disk s názvem CIRCUITPY – stačí na něj přetáhnout soubor code.py, ten se automaticky spustí a po každém uložení Picopad sám restartuje. Žádný „upload" knoflík, žádné zvláštní nástroje.

Picopad podporuje tři způsoby programování. Tabulka pomůže vybrat:

Jazyk Pro koho Tempo
CircuitPython Začátečníci. Bohaté Adafruit knihovny, pohodlná editace přes USB disk. Pomalejší, ale na hry a senzory bohatě stačí.
MicroPython Velmi podobný CircuitPythonu, drobně menší a bez Adafruit ekosystému. Srovnatelný s CircuitPythonem.
C / C++ Pokročilí, kteří chtějí maximální výkon (např. emulátory). Nejrychlejší, ale složitější nastavení projektu.

V tomhle tutoriálu jdeme cestou CircuitPythonu. Hlavní výhoda: vysokoúrovňové knihovny (displayio, adafruit_display_text, simpleio, keypad) a editace souborů přímo přes USB disk – žádné nahrávání tlačítkem v editoru. Ideální pro začátky.

Co budete potřebovat: sestavený Picopad, USB kabel typu Micro-USB, počítač s Windows / macOS / Linuxem a libovolný textový editor (skvělý je Thonny s podporou CircuitPythonu, ale stačí i obyčejný VS Code nebo Notepad++). Stažení knihoven a první program probereme v dalších kapitolách.

Instalace firmware #

Než začnete programovat, je potřeba do Picopadu nahrát CircuitPython firmware. Je to jednorázová operace – nahrané jednou, drží se v zařízení a přepisuje se jen tehdy, když chcete jiný jazyk.

Postup je v samostatném návodu: Jak nainstalovat CircuitPython →

Tip: Picopad používá oficiální CircuitPython build z circuitpython.org/board/pajenicko_picopad/. Picopad Wifi i Picopad Pro mají modul Pico W, takže pro oba aktuální modely platí stejný build – stačí vybrat verzi CircuitPythonu, kterou chcete.

První program – Hello Picopad #

Když máte CircuitPython nahraný, je čas něco napsat. CircuitPython vám usnadňuje práci tak, že se Picopad chová jako USB flash disk s názvem CIRCUITPY. Stačí editovat soubor code.py – po jeho uložení Picopad sám restartuje a spustí kód.

1) Najděte CIRCUITPY disk

Připojte Picopad přes USB a zapněte ho. Mezi disky v počítači se objeví nová mechanika CIRCUITPY. Otevřete ji – uvidíte několik souborů, hlavně code.py (váš program) a složku lib (pro knihovny).

2) První řádek (přes REPL)

Spolu s USB diskem se otevře i sériový port. Pomocí jakéhokoliv terminálu (např. v Thonny: View → Shell, nebo screen /dev/cu.usbmodem... 115200 na macOS) se připojíte do REPLu – interaktivní konzole CircuitPythonu. Stiskněte Ctrl+C, abyste přerušili běžící code.py, a uvidíte >>>. Napište:

print("Ahoj, Picopade!")

Po Enteru se ihned zobrazí odpověď:

Ahoj, Picopade!

3) Blikání LEDkou (soubor code.py)

V libovolném editoru (Thonny, VS Code, Notepad...) otevřete soubor code.py přímo na CIRCUITPY disku a přepište ho na:

import board
import digitalio
import time

led = digitalio.DigitalInOut(board.LED)
led.direction = digitalio.Direction.OUTPUT

while True:
    led.value = False  # rozsvítí (LED je aktivní v low)
    time.sleep(0.5)
    led.value = True   # zhasne
    time.sleep(0.5)

Soubor uložte. Picopad sám restartuje a žlutá uživatelská LED na horní hraně začne blikat – jednou za sekundu.

Proč False znamená rozsvítit? Uživatelská LED je zapojená tak, že svítí, když je její pin v logické nule (LOW). To je běžný hardwarový trik – hodnota False v digitalio nastaví pin do nuly, čímž LEDku rozsvítí.

4) Pin se jmenuje, neukazuje se na něj číslem

Všimněte si, že místo „GPIO 22" píšete board.LED. To je velký rozdíl oproti MicroPythonu nebo C – CircuitPython má pro každou součástku Picopadu pojmenovaný pin. board.SW_A je tlačítko A, board.AUDIO je bzučák, board.DISPLAY už je rovnou inicializovaný displej. V další kapitole najdete kompletní mapu.

5) Co dál

Soubor code.py se spustí pokaždé, když Picopad zapnete. Můžete USB odpojit – LEDka bude blikat dál. Tím končí „Hello world" část. V dalších kapitolách budeme stavět na tomto základu: ovládání displeje, čtení tlačítek, hraní zvuků a další.

Anatomie Picopadu #

Než se vrhneme na jednotlivé HW prvky, podívejme se, co je kde. Diagram níže je vyrenderovaný přímo z výrobního schématu Picopadu, takže pozice tlačítek a LEDek jsou přesně tam, kde je najdete na své konzoli.

Picopad – přední strana s popisky tlačítek a LED
Přední strana Picopadu – D-pad, tlačítka A/B/X/Y a stavové LEDky

Mapa pojmenovaných pinů

CircuitPython má pro každý hardware Picopadu pojmenovaný atribut v modulu board. V kódu se na něj odkazujete přímo – nemusíte si pamatovat GPIO čísla.

Funkce CircuitPython Poznámka
Displejboard.DISPLAYPředinicializovaný (320×240, displayio)
D-pad ↑ ↓ ← →board.SW_UP, SW_DOWN, SW_LEFT, SW_RIGHTVstup s pull-up, sepnuté = False
Tlačítka A B X Yboard.SW_A, SW_B, SW_X, SW_YStejně jako D-pad, sepnuté = False
Uživatelská LEDboard.LEDAktivní v LOW (svítí, když je False)
Bzučák / reproduktorboard.AUDIOPoužít přes simpleio.tone() nebo audiopwmio
microSD kartaboard.SD_SCK, SD_MOSI, SD_MISO, SD_CSSamostatná SPI sběrnice
Měření baterieboard.BAT_SENSEDetail v kapitole Baterie

Externí konektor J2

Na boku Picopadu je 12pinový konektor, kterým se dají připojovat senzory a moduly (např. teplotní čidlo, ultrazvukový dálkoměr, fotorezistor). Vyvedené piny:

  • Napájení: 3.3 V, GND, VBAT (přímo z baterie), ADC_VREF, AGND
  • Digitální / komunikace: board.D1, board.D2/board.RX/board.SCL, board.D3/board.TX/board.SDA
  • Analogové vstupy: board.A0 (= D0), board.A1 (= D4), board.A2 (= D5)

Tip: v kapitole „Externí konektor" si ukážeme konkrétní příklad – přečtení hodnoty z fotorezistoru přes ADC a zobrazení na displeji.

Displej #

Picopad má 2.0" IPS displej s rozlišením 320×240 pixelů. CircuitPython ho má předinicializovaný v board.DISPLAY, takže se s ním pracuje skoro tak snadno jako s plátnem v Pythonu na PC. Pro vykreslování používáme knihovnu displayio (vestavěná) a pro text adafruit_display_text (musíte si stáhnout).

Stažení knihoven – CircuitPython Library Bundle

Mnoho příkladů potřebuje knihovny z Adafruit bundle. Postup:

  1. Otevřete circuitpython.org/libraries a stáhněte ZIP odpovídající verzi vašeho CircuitPythonu (např. 9.x bundle).
  2. Rozbalte ZIP. Uvnitř je složka lib s desítkami knihoven (přípona .mpy) a examples.
  3. Z bundle lib přetáhněte složku adafruit_display_text do CIRCUITPY/lib/ na Picopadu. Hotovo.

Knihovny ve formátu .mpy jsou předkompilované a šetří paměť. Můžete použít i .py verze (pro úpravy nebo studium kódu), ale RP2040 má RAM omezenou, takže pro produkci se hodí .mpy.

První text na displeji

import board
import terminalio
from adafruit_display_text import label

display = board.DISPLAY
text_label = label.Label(terminalio.FONT, text="Ahoj, Picopade!", color=0xFFFFFF, scale=2)
text_label.x = 70
text_label.y = 110

display.root_group = text_label

while True:
    pass

Co se tu děje:

  • board.DISPLAY – displej je už spuštěný, jen si ho vezmete.
  • terminalio.FONT – vestavěný 6×12 font, není potřeba nic stahovat.
  • label.Label – textový sprajt. Barva je RGB v hexa (0xFFFFFF = bílá), scale=2 ho zvětší dvakrát.
  • display.root_group – co je nastavené tady, vidíte na obrazovce. Můžete vyměnit kdykoliv za jinou skupinu (Group), tím přepnete „obrazovku".
  • while True: pass – aby program neskončil. Když skončí, CircuitPython zobrazí konzoli.

Skupiny, sprajty a obrázky

Reálná aplikace má víc prvků – pozadí, postavičku, text. Spojí se do displayio.Group, která tvoří „scénu". Tady je příklad s barevným pozadím a textem:

import board
import displayio
import terminalio
from adafruit_display_text import label

display = board.DISPLAY

# Skupina = scéna
group = displayio.Group()

# Barevné pozadí: 1px×1px bitmapa roztažená přes celý displej
bg_bitmap = displayio.Bitmap(1, 1, 1)
bg_palette = displayio.Palette(1)
bg_palette[0] = 0x002244  # tmavě modrá
bg_tile = displayio.TileGrid(bg_bitmap, pixel_shader=bg_palette,
                             width=display.width, height=display.height,
                             tile_width=1, tile_height=1)
group.append(bg_tile)

# Text
title = label.Label(terminalio.FONT, text="Picopad rocks", color=0xFFFFFF, scale=3)
title.x = 30
title.y = 100
group.append(title)

display.root_group = group

while True:
    pass

Pro načtení BMP/PNG obrázku slouží adafruit_imageload (z bundle):

import adafruit_imageload
import displayio

bitmap, palette = adafruit_imageload.load("/picture.bmp")
sprite = displayio.TileGrid(bitmap, pixel_shader=palette, x=20, y=20)

Plná hra v displayio: v repu na GitHubu najdete Pixel Snake a DinoRun – komentované zdrojáky, ze kterých se dá hodně okoukat.

Tlačítka #

Picopad má osm tlačítek: D-pad (↑ ↓ ← →) a herní cluster A/B/X/Y. CircuitPython je číst třemi způsoby – od jednoduchého k pokročilému.

1) Nejjednodušší: digitalio

import board
from digitalio import DigitalInOut, Pull
import time

btn_a = DigitalInOut(board.SW_A)
btn_a.pull = Pull.UP

while True:
    if not btn_a.value:   # sepnuto = pin je v 0, .value je False
        print("A!")
    time.sleep(0.05)

Funkční, ale když uživatel drží tlačítko, vypíše „A!" stokrát za sekundu. A mechanická tlačítka „odskakují" (debouncing) – jedno stisknutí registruje jako několik.

2) S debouncerem (knihovna adafruit_debouncer)

Stáhněte z bundle adafruit_debouncer.mpy do /lib. Pak:

import board
from digitalio import DigitalInOut, Pull
from adafruit_debouncer import Debouncer
import time

pin = DigitalInOut(board.SW_A)
pin.pull = Pull.UP
btn_a = Debouncer(pin)

while True:
    btn_a.update()
    if btn_a.fell:        # právě teď stisknuto (pin spadl z 1 na 0)
        print("A stisknuto")
    if btn_a.rose:        # právě teď puštěno
        print("A puštěno")
    time.sleep(0.01)

3) Nejlepší: keypad.Keys (vestavěný v CircuitPythonu)

Modul keypad skenuje tlačítka na pozadí a zařazuje stisky do fronty – nikdy je nezmeškáte, ani když máte v hlavní smyčce delší sleep.

import board
import keypad

KEY_A, KEY_B, KEY_X, KEY_Y, KEY_UP, KEY_DOWN, KEY_LEFT, KEY_RIGHT = range(8)

keys = keypad.Keys(
    (board.SW_A, board.SW_B, board.SW_X, board.SW_Y,
     board.SW_UP, board.SW_DOWN, board.SW_LEFT, board.SW_RIGHT),
    value_when_pressed=False,  # tlačítka jsou aktivní v LOW
    pull=True,
)

while True:
    event = keys.events.get()
    if event:
        if event.pressed:
            print("Stisknuto tlačítko č.", event.key_number)
        if event.released:
            print("Puštěno tlačítko č.", event.key_number)

Pro běžné herní ovládání používejte keypad – nejméně kódu, nejsolidnější výsledky.

Pozor na pull-up: všechna tlačítka Picopadu jsou aktivní v LOW (sepnuté tlačítko = pin v 0). Zapomenutí pull=Pull.UP vede k tomu, že pin „pluje" a čte se náhodně – tlačítka pak fungují, jen když tomu věří.

Uživatelská LED #

Žlutá LED nad displejem (popisek USR) je volně k použití pro vaše programy. Připojuje se přes board.LED.

On/off + blikání

import board
import digitalio
import time

led = digitalio.DigitalInOut(board.LED)
led.direction = digitalio.Direction.OUTPUT

# Bliknutí 5×
for _ in range(5):
    led.value = False  # rozsvítí (aktivní v LOW)
    time.sleep(0.2)
    led.value = True   # zhasne
    time.sleep(0.2)

Stmívání přes PWM

Pro plynulé stmívání nestačí jen on/off – potřebujete PWM (pulzně šířková modulace). V CircuitPythonu máte modul pwmio:

import board
import pwmio
import time

led = pwmio.PWMOut(board.LED, frequency=1000, duty_cycle=0)

# Plynulé rozjasnění a zatemnění (LED je aktivní v LOW, takže duty_cycle "obrátíme")
while True:
    for d in range(0, 65536, 1024):
        led.duty_cycle = 65535 - d  # 65535 = zhasnuto, 0 = plně rozsvíceno
        time.sleep(0.01)
    for d in range(65535, -1, -1024):
        led.duty_cycle = 65535 - d
        time.sleep(0.01)

duty_cycle jde od 0 do 65535. Protože je LED aktivní v LOW, vyšší PWM hodnota = LED tmavší. Když to zmate, počítejte „svit" jako 65535 - duty_cycle.

microSD karta #

Picopad má slot na microSD pod displejem. Hodí se pro ukládání herních saves, log souborů, obrázků nebo zvuků, které by se nevešly do flash paměti čipu.

CircuitPython má SD kartu integrovanou – po namontování se chová jako normální disk a píšete na ni přes open(...).

import board
import busio
import digitalio
import sdcardio
import storage

# SPI sběrnice pro SD
spi = busio.SPI(clock=board.SD_SCK, MOSI=board.SD_MOSI, MISO=board.SD_MISO)
cs = digitalio.DigitalInOut(board.SD_CS)

# SDCard objekt + namontování pod /sd
sd = sdcardio.SDCard(spi, cs)
vfs = storage.VfsFat(sd)
storage.mount(vfs, "/sd")

# Zápis – jako normální soubor
with open("/sd/log.txt", "a") as f:
    f.write("Ahoj z Picopadu!\n")

# Čtení
with open("/sd/log.txt") as f:
    print(f.read())

Formát: SD karta musí být ve FAT/FAT32. Karty s exFAT (typické u 64+ GB) je potřeba přeformátovat na FAT32. Doporučujeme microSD do 32 GB.

Trochu jiná pravidla: CircuitPython chrání svůj vlastní souborový systém na flash čipu před zápisem z kódu (jinak by si konfliktoval s editací přes USB). Karta v /sd tomu ale nepodléhá – tam můžete zapisovat libovolně.

Bzučák a zvuk #

V Picopadu je miniaturní reproduktor (popisek SPEAKER), který hraje přes pin board.AUDIO. Pro pípnutí stačí jeden řádek; pro hudbu jdete dál pomocí PWM, případně syntézy.

Jednoduché pípnutí (simpleio)

Stáhněte simpleio.mpy z bundle do /lib:

import board
import simpleio

# Pípnutí na 880 Hz po dobu 0.2 s
simpleio.tone(board.AUDIO, 880, 0.2)

Krátká melodie

import board
import simpleio
import time

# Frekvence not v Hz
notes = [
    ("C5", 523),
    ("E5", 659),
    ("G5", 784),
    ("C6", 1047),
]

for name, freq in notes:
    print(name)
    simpleio.tone(board.AUDIO, freq, 0.3)
    time.sleep(0.05)

Pokročilé: synthio (syntéza)

Pro skutečně herní zvukové efekty se hodí synthio – syntezátor zabudovaný v CircuitPythonu, dokáže hrát víc not najednou, FM modulace, filtry. Inspirace: ukázka monosynth v repu Picopadu.

Reproduktor je miniaturní, takže nečekejte hi-fi. Pro hraní her ale úplně stačí. Hlasitost ovládáte změnou duty_cycle u PWM – plné maximum (32767) hraje skoro vždy „dost".

Picopad Pro: má vylepšený zesilovač a 3.5mm sluchátkový jack – připojte sluchátka a hrajte i tam, kde byste reproduktorem rušili okolí. Hardwarový mute spínač navíc utne reproduktor jedním cvaknutím, aniž byste museli sahat do kódu.

Měření baterie #

Picopad běží z Li-ion baterie (3.7 V nominálně). Aby vaše hra zobrazila „baterka skoro vybitá", potřebujete přečíst její napětí přes analogio.AnalogIn na pinu board.BAT_SENSE.

import board
import analogio
import time

vbat_pin = analogio.AnalogIn(board.BAT_SENSE)

# Reference je 3.3 V, ADC dává 0..65535. Napětí na pinu:
def battery_voltage():
    raw = vbat_pin.value          # 0..65535
    voltage_at_pin = (raw / 65535) * 3.3
    # Na BAT_SENSE jde napětí baterie přes dělič 1:2, takže ho zdvojnásobíme
    return voltage_at_pin * 2

while True:
    v = battery_voltage()
    print("Baterie: {:.2f} V".format(v))
    time.sleep(2)

Kalibrace na procenta (orientačně):

Napětí Stav
~ 4.1 VPlně nabito
~ 3.7 VPolovina
~ 3.4 VSkoro vybito
< 3.2 VVybito (Picopad se brzo vypne)

Hodnoty se mírně liší kus od kusu – přesnost ADC u RP2040 je jen ~12 bit a měření má šum. Pro gameplay je to OK; pro vědu radši externí měřící obvod.

Externí konektor #

Z boku Picopadu vede 12pinový konektor J2, na kterém najdete digitální piny D0..D5, analogové vstupy A0..A2, I2C, UART a napájení. Můžete přes něj připojit teplotní čidla, OLED displeje, rotační enkodéry, dálkoměry...

Příklad: fotorezistor (jas okolního světla)

Zapojte fotorezistor mezi 3.3 V a pin D0 (= A0), a 10 kΩ rezistor z D0 do GND – klasický napěťový dělič.

import board
import analogio
import time

light = analogio.AnalogIn(board.A0)

while True:
    raw = light.value
    voltage = (raw / 65535) * 3.3
    print("Jas (raw): {}, napětí: {:.2f} V".format(raw, voltage))
    time.sleep(0.5)

Když přiložíte ruku na fotorezistor, číslo klesne; když na něj posvítíte mobilem, vyletí. Takhle si zobrazíte hodnotu třeba na displeji.

Příklad: I2C zařízení (např. teplotní senzor BME280)

Většina I2C senzorů s Adafruit knihovnami funguje out-of-the-box:

import board
import time
from adafruit_bme280 import basic as adafruit_bme280

i2c = board.I2C()                     # SDA = board.SDA, SCL = board.SCL
sensor = adafruit_bme280.Adafruit_BME280_I2C(i2c)

while True:
    print("Teplota: {:.1f} C, vlhkost: {:.0f} %, tlak: {:.0f} hPa"
          .format(sensor.temperature, sensor.relative_humidity, sensor.pressure))
    time.sleep(2)

Knihovna adafruit_bme280 je v bundle. Stejně se připojí SCD4x (CO₂), SSD1306 (OLED), atd.

Inspirace: v circuitpython/sensors jsou hotové ukázky pro DS18B20 (teplota 1-Wire), HCSR04 (ultrazvukový dálkoměr) a fotorezistor.

Picopad Pro – další konektory: kromě klasického J2 nabízí Pro PICOBUS rozšiřující konektor pro „cvakací" karty (další tlačítka, gamepady, RTC moduly) a samostatný I2C konektor kompatibilní se standardem Stemma/Qwiic – do něj rovnou zapojíte stovky hotových senzorů a OLED displejů od Adafruitu a komunity bez pájení a bez napěťového děliče.

WiFi #

Picopad Wifi i Picopad Pro mají modul Raspberry Pi Pico W, takže WiFi a Bluetooth máte v ceně. CircuitPython API je naprosto čisté – modul wifi s objektem wifi.radio.

Uložení přihlašovacích údajů (settings.toml)

Aby váš kód neměl heslo přímo v code.py, CircuitPython čte tajné věci z settings.toml v kořeni CIRCUITPY disku:

CIRCUITPY_WIFI_SSID = "muje_wifi"
CIRCUITPY_WIFI_PASSWORD = "tajne_heslo"

Připojení a ping

import os
import wifi
import socketpool
import ipaddress
import time

print("Připojuji se k WiFi...")
wifi.radio.connect(os.getenv("CIRCUITPY_WIFI_SSID"),
                   os.getenv("CIRCUITPY_WIFI_PASSWORD"))
print("Připojeno, IP:", wifi.radio.ipv4_address)

pool = socketpool.SocketPool(wifi.radio)
google = ipaddress.ip_address("8.8.4.4")

while True:
    ms = wifi.radio.ping(google)
    if ms is None:
        print("Žádná odpověď")
    else:
        print("Ping: {:.1f} ms".format(ms * 1000))
    time.sleep(15)

Sken okolních sítí

import wifi

print("SSID                          RSSI  CHN")
for net in wifi.radio.start_scanning_networks():
    print("{:30s} {:5d}  {:3d}".format(net.ssid, net.rssi, net.channel))
wifi.radio.stop_scanning_networks()

HTTP požadavek

Stáhněte z bundle adafruit_requests.mpy do /lib:

import os
import wifi
import socketpool
import ssl
import adafruit_requests

wifi.radio.connect(os.getenv("CIRCUITPY_WIFI_SSID"),
                   os.getenv("CIRCUITPY_WIFI_PASSWORD"))

pool = socketpool.SocketPool(wifi.radio)
session = adafruit_requests.Session(pool, ssl.create_default_context())

resp = session.get("https://api.github.com/repos/Pajenicko/Picopad")
data = resp.json()
print("Hvězdičky:", data["stargazers_count"])

Hotové ukázky najdete v circuitpython/network: webserver (polling, SSE, WebSocket), NTP hodiny, Telegram bot, scraping odjezdů MHD a další.

Mini projekt – „Reflex" #

Spojíme to dohromady. Hra otestuje váš reflex: po náhodné prodlevě LED bliknete, vy musíte rychle zmáčknout A. Změřený čas se zobrazí na displeji.

import board
import digitalio
import keypad
import simpleio
import displayio
import terminalio
import random
import time
from adafruit_display_text import label

# LED
led = digitalio.DigitalInOut(board.LED)
led.direction = digitalio.Direction.OUTPUT
led.value = True   # zhasnuto

# Tlačítko A
keys = keypad.Keys((board.SW_A,), value_when_pressed=False, pull=True)

# Displej
display = board.DISPLAY
group = displayio.Group()

title = label.Label(terminalio.FONT, text="REFLEX TEST", color=0xFFFFFF, scale=3)
title.x = 50
title.y = 60
group.append(title)

info = label.Label(terminalio.FONT, text="Stiskni A pro start", color=0xAAAAAA, scale=2)
info.x = 35
info.y = 130
group.append(info)

result = label.Label(terminalio.FONT, text="", color=0x44FF44, scale=3)
result.x = 70
result.y = 200
group.append(result)

display.root_group = group


def wait_for_a():
    keys.events.clear()
    while True:
        ev = keys.events.get()
        if ev and ev.pressed:
            return


while True:
    info.text = "Stiskni A pro start"
    result.text = ""
    wait_for_a()

    info.text = "Cekej..."
    result.text = ""
    time.sleep(random.uniform(1.5, 4.0))

    led.value = False        # bliknout
    info.text = "TED!"
    start = time.monotonic()

    keys.events.clear()
    while True:
        ev = keys.events.get()
        if ev and ev.pressed:
            elapsed_ms = int((time.monotonic() - start) * 1000)
            led.value = True
            simpleio.tone(board.AUDIO, 880, 0.1)
            result.text = "{} ms".format(elapsed_ms)
            info.text = "A = znovu"
            break

Vyzkoušejte. Kolik milisekund vám to dělá? Lidský průměr je kolem 250 ms.

Vylepšení k zamyšlení: Přidat falešné starty (LED blikne dřív, než byste měli reagovat)? Nejlepší skóre uložit na SD kartu? Vytvořit dvoustranný turnaj A vs. B? Všechny dílčí kapitoly už znáte.

Kam dál #

Tutoriál pokryl základy. Pokud chcete jít hlouběji:

Hotové projekty v repu

  • Pajenicko/Picopad – CircuitPython – hello_world, hry (Snake, DinoRun), senzory, síť, makro klávesnice, monosyntezátor, slideshow, budík...
  • network/ – webserver (polling/SSE/WebSocket), Golemio MHD, Telegram bot, NTP hodiny, Teletext, ŽivýObraz.eu.
  • sensors/ – I2C senzory (SCD4x, BME280), 1-Wire (DS18B20), ultrazvuk (HC-SR04), fotorezistor.

Oficiální dokumentace

Komunita Picopadu

Inspirace, co lidé vyrobili – emulátor GameBoy, port DOOMu, MakeCode Arcade patcher, vlastní 3D-tištěné krabičky, vylepšené čepičky tlačítek – najdete na stránce Komunita.

Zpětná vazba

Tenhle tutoriál žije díky vám. Pokud jste narazili na chybu, máte nápad na další kapitolu, nebo jste si postavili něco bezvadného a chcete to ukázat – ozvěte se přes Pajeníčko nebo na GitHub repo. Šťastné programování!