Lab #1: Programujeme Raspberry Pi Pico v jazyku MicroPython

alebo nie príliš stručný úvod do programovania chytrých zariadení v jazyku MicroPython

Videá pre cvičenie

Motivácia

Ciele

  1. Zoznámiť sa s organizáciou predmetu.

  2. Zoznámiť sa s RPi Pico Kit-om.

  3. Zoznámiť sa s rozšírením MicroPython Tools pre vývojové prostredie PyCharm.

  4. Naučiť sa nastaviť vlastnosti projektu v prostredí PyCharm pre prácu s jazykom MicroPython.

  5. Naučiť sa nahrať na mikrokontrolér firmvér s jazykom MicroPython.

Postup

Predtým, ako naozaj začneme

Ešte skôr, ako naozaj začneme, sa pripravíme na prácu počas semestra. Prihlásite sa do komunikačného systému Slack, ktorý budeme používať v rámci rýchlej komunikácie s vami, a v GitLab-e si vytvoríte projekt, ktorý budete používať na odovzdávanie vašich zadaní.

Task

Prihláste sa do komunikačného systému Slack.

Slack budeme používať pre rýchlu komunikáciu. Ak sa chcete prihlásiť do komunikačného kanálu predmetu, tak použite túto linku.

Komunikačný kanál predmetu nájdete na adrese https://kpi-iot1-2026.slack.com. Pri registrácii použite svoju študentskú e-mailovú adresu (s doménou @student.tuke.sk alebo @tuke.sk).

Počas komunikácie sa však snažte dodržiavať nasledovné pravidlá:

  1. Správajte sa (voči sebe) slušne!
  2. Vo svojich príspevkoch neposielajte úplné alebo čiastočné riešenia úloh, ktoré predstavujú riešené zadanie alebo jeho časť!
  3. Vo svojich príspevkoch neposielajte obrázky, ktoré obsahujú kód alebo výpis obrazovky! Takéto obrázky budú odstránené! Pošlite ich ako text (ktorý sa dá okrem iného aj skopírovať a tým pádom jednoduchšie vyskúšať vašu problematickú časť).
  4. Obrázky (ideálne memečka), prípadne pozvánky na zaujímavé akcie, môžete posielať napr. do kanála #social, ktorý je na to určený.
  5. Na otázky ohľadom zadaní používajte na to určené kanály!

Task

Prihláste sa na GitLab a vytvorte si nový projekt.

Ak vytvárate projekt prvýkrát, urobte tak na tejto stránke.

Tento projekt bude tzv. Monorepo, ktorý je možné definovať nasledovne:

Monorepo je jeden repozitár, ktorý obsahuje viacero samostatných projektov s jasne definovanými vzájomnými vzťahmi. – Monorepo.tools

Názov vytvoreného projektu bude v tvare iot1-X, kde X je poradové číslo vytváraného projektu.

Predstavenie Smart Department

  • IoT je o veciach
  • rozhodne nie je len o tom, ako dostať namerané údaje z vášho chytrého zariadenia na webovú stránku
  • 3-vrstvová architektúra
Smart Department: architektúra

V rámci predmetu, a hlavne v rámci cvičení, sa postupne pozrieme na každú vrstvu, konkrétne:

  1. vrstva - vytvoríme si vlastné chytré zariadenie (vec)
  2. vrstva - pomocou kontajnerov si vytvoríme zariadenie IoT gateway z vlastného počítača a naučíme sa doň integrovať zariadenia tretích strán, ktoré komunikujú pomocou iných technológií než TCP/IP, napr. BLE alebo Zigbee
  3. vrstva - vytvoríme aplikácie poskytujúce používateľské rozhranie pre koncových používateľov a vlastné mikroslužby

ProblemSet #1: THSensor

Na prvej vrstve architektúry Smart Department sa nachádzajú chytré zariadenia. A presne tejto vrstve a tomuto typu zariadení sa venuje prvé zadanie. Cieľom bude vytvoriť chytrý senzor teploty a vlhkosti.

THSensor: Ilustrácia

V tomto kroku sa zoznámite s hardvérom, ktorý budete potrebovať na vytvorenie tohto zariadenia.

Task

Zoznámte sa s komponentmi potrebnými pre vytvorenie chytrého zariadenia.

Zoznam komponentov pre vývoj chytrého zariadenia nájdete na stránke RPi Pico Kit. Srdcom chytrého zariadenia bude mikrokontrolér z rodiny mikrokontrolérov RP (konkrétne RP2350 na doske RPi Pico 2 WH) a programovať ho budeme v jazyku MicroPython.

Prototypovacia doska RPi Pico 2 WH

Task

Zoznámte sa so špecifikáciou projektu pre vytvorenie chytrého zariadenia.

Kompletné znenie zadania so všetkými požiadavkami na vytvorenie vášho chytrého zariadenia sa nachádza na stránke zadania. Jeho tvorbe sa budeme postupne venovať počas nasledujúcich cvičení.

Programovanie v jazyku MicroPython

Hlavným programovacím jazykom predmetu bude jazyk Python. Pri programovaní chytrých zariadení však budeme používať verziu tohto jazyka určenú pre zariadenia s obmedzenými schopnosťami - MicroPython. V tomto kroku sa na prácu s ním pripravíme.

Task

Nainštalujte si vývojové prostredie PyCharm.

Ako študenti máte možnosť počas štúdia využiť bezplatný prístup k plateným verziám produktov od spoločnosti JetBrains. A vývojové prostredie PyCharm patrí medzi najlepšie prostredia, ktoré môžete pre vývoj aplikácií v jazyku Python použiť.

Editor PyCharm

Task

Do vývojového prostredia PyCharm si nainštalujte rozšírenie MicroPython Tools.

Prostredie PyCharm je určené na programovanie v jazyku Python, ale nie na programovanie v jazyku MicroPython. Aby to bolo možné, je potrebné nainštalovať rozšírenie MicroPython Tools.

PyCharm: Rozšírenie MicroPython Tools

Vytvorenie projektu s podporou jazyka MicroPython

V priečinku monorepa vytvoríme projekt s názvom thsensor, ktorý bude obsahovať implementáciu nášho chytrého zariadenia. Okrem štandardného postupu pre vytvorenie projektu je potrebné v ňom zapnúť podporu pre jazyk MicroPython. Všetky potrebné úlohy vykonáme v tomto kroku.

Task

V priečinku svojho monorepa si pomocou vývojového prostredia PyCharm vytvorte nový projekt s názvom thsensor.

Pri vytváraní projektu nechajte predvolené nastavenia:

  • bude sa jednať o projekt typu Pure Python, a
  • typ interpretera nechajte nástroj uv.

V priečinku thsensor sa bude nachádzať kód v jazyku MicroPython pre naše chytré zariadenie.

Po vytvorení projektu v ňom vytvorte samostatný priečinok src/, v ktorom sa bude nachádzať samotný kód implementácie.

Task

V projekte thsensor zapnite podporu pre jazyk MicroPython.

Vývojové prostredie PyCharm zatiaľ nevie pracovať v projekte s jazykom MicroPython. Podporu zapneme priamo z panelu rozšírenia MicroPython Tools kliknutím na linku Change settings....

PyCharm: Panel rozšírenia MicroPython Tools

Po kliknutí sa zobrazí dialógové okno s nastaveniami projektu - konkrétne panel s podporou jazyka MicroPython vo vašom projekte. Podporu zapnete kliknutím na zaškrtávacie políčko Enable MicroPython support.

PyCharm: Zapnutie podpory pre jazyk MicroPython v projekte

Nakoniec ešte nastavíme podporu pre Type Hints jazyka MicroPython, aby nám korektne fungovalo inteligentné dopĺňanie kódu (intellisense). V dialógu s nastaveniami zaškrtneme políčko Enable MicroPython type hints a zo zoznamu tzv. stub-ov vyberieme ten, ktorý je určený pre naše zariadenie. V prípade dosky RPi Pico 2 WH sa jedná o stub s názvom micropython-rp2-rpi_pico2_w-stubs. Zo zoznamu si vyberieme stub s najnovšou verziou. Tento stub nainštalujeme (tlačidlo Install/Update) a zvolíme (tlačidlo Select).

PyCharm: Nastavenie MicroPython type hints

Task

Nahrajte firmvér s jazykom MicroPython do mikrokontroléra dosky RPi Pico 2 WH.

Po zakúpení dosky sa na nej firmvér s jazykom MicroPython nebude nachádzať. Nahrať si ho na dosku môžete viacerými spôsobmi. My na to použijeme priamo rozšírenie MicroPython Tools z vývojového prostredia PyCharm. Podrobný postup nájdete na stránke Inštalácia jazyka MicroPython.

Prvá (naivná) implementácia

Keď budeme mať všetko pripravené, môžeme vytvoriť prvú (veľmi naivnú) implementáciu chytrého zariadenia. Chytré zariadenie bude v pravidelných intervaloch merať teplotu a vlhkosť zo senzora DHT11/22 a namerané hodnoty bude posielať cez WiFi modul do internetu.

Túto implementáciu vytvoríme v jazyku MicroPython pomocou vývojového prostredia PyCharm.

Task

V jazyku MicroPython vytvorte program, ktorý bude v pravidelných 10s intervaloch merať teplotu a vlhkosť zo senzora DHT11/22, ktorého dátový pin bude pripojený ku GPIO pinu číslo 3.

Program vytvoríme v súbore main.py v priečinku src/, ktorý sa spustí ako prvý po zapnutí mikrokontroléra.

Jednoduchá a naivná implementácia môže vyzerať napríklad takto:

from machine import Pin
from dht import DHT22 as DHT
import time


sensor = DHT(Pin(3, Pin.IN, Pin.PULL_UP))

while True:
    sensor.measure()
    temperature = sensor.temperature()
    humidity = sensor.humidity()

    print(f"Temperature: {temperature} °C | Humidity: {humidity} %")

    time.sleep(10)

Task

Vytvorte spúšťač pre nahratie a spustenie vytvoreného kódu na doske s jazykom MicroPython.

Ak v tomto momente spustíme program, interpretuje ho lokálny Python interpreter. Našim cieľom je však nahrať ho na mikrokontrolér a spustiť ho na ňom.

Aby to bolo možné, potrebujeme vytvoriť vlastný spúšťač z niektorej šablóny z rozšírenia MicroPython Tools. To je možné pomocou menu Run > Edit Configurations....

V dialógovom okne vyberieme nasledovné:

  1. pridáme novú konfiguráciu MicroPython Tools > Upload
  2. v časti Source Mappings pridáme src/ priečinok, ktorý sa namapuje na koreňový priečinok mikrokontroléra
  3. zaškrtneme políčko Synchronize, ktoré zabezpečí, že to, čo máme v zdrojových priečinkoch, bude aj v cieľovom zariadení

Vytvorenú konfiguráciu potvrdíme kliknutím na tlačidlo OK.

PyCharm: Nastavenie spúšťača pre MicroPython

Task

Otestujte svoju implementáciu.

Ak ste postupovali správne, po spustení spúšťača sa kód nahrá na mikrokontrolér a spustí. Výsledok uvidíte v konzole panelu MicroPython Tools.

Temperature: 23.5 °C | Humidity: 39.2 %
Temperature: 23.6 °C | Humidity: 39.1 %

Task

Pripojte svoje zariadenie do internetu pomocou WiFi modulu na doske.

Na pripojenie do WiFi siete môžeme použiť nasledujúci fragment kódu, ktorý vložíme pred inicializáciu senzora DHT:

import network

wlan = network.WLAN(network.STA_IF)
wlan.active(True)

if not wlan.isconnected():
    print('Connecting to network...')
    wlan.connect('ssid', 'password')
    while not wlan.isconnected():
        pass

print('Network config:', wlan.ifconfig())

Keď sa zariadenie úspešne pripojí do siete, vypíše informácie o pripojení. Výstup môže vyzerať napríklad takto:

Connecting to network...
Network config: ('192.168.1.177', '255.255.255.0', '192.168.1.1', '192.168.1.1')

Task

Namerané hodnoty odošlite do niektorej voľne dostupnej služby pomocou protokolu HTTP.

Pre otestovanie môžeme použiť napr. službu Webhook.site. Údaje pošleme vo formáte JSON pomocou modulu requests.

Po načítaní hodnôt zo senzora môžeme údaje odoslať pomocou nasledujúceho fragmentu kódu, ktorý vložíme pred volanie funkcie sleep():

import requests

response = requests.post(
    "https://webhook.site/UNIKATNA_URL_ADRESA",
    json={
        "temperature": temperature,
        "humidity": humidity,
    },
)

response.close()

Task

Overte správnosť svojej implementácie.

Ak ste postupovali správne, každý JSON dokument s nameranými hodnotami sa vám zobrazí v rozhraní webu Webhook.site.

Webhook.site: Prijatý JSON dokument s nameranými hodnotami

Task

Diskutujte o vytvorenej implementácii.

S takto naivnou implementáciou sa dá stretnúť v rozličných tutoriáloch, knihách, videách, kurzoch, ale rozhodne to nie je implementácia, ktorú by ste ako vývojári chceli predávať, a ktorú by ste si ako potenciálny zákazník chceli kúpiť. V čom vidíte problém - ako zákazník, ale aj ako vývojár?

Kostra aplikácie

Pri vývoji nášho chytrého zariadenia budeme mať v prvom rade na zreteli koncového používateľa. Budeme sa preto snažiť vytvoriť produkt, ktorý bude:

  • jednoduchý na nastavenie (bez zásahu do zdrojového kódu),
  • odolný voči výpadkom napájania a siete,
  • schopný informovať o svojom aktuálnom stave a
  • úsporný, aby dokázal fungovať na batériu čo najdlhšie.

Takéto požiadavky je nepraktické splniť jedným dlhým skriptom, aký sme vytvorili v predchádzajúcom kroku. Preto použijeme kostru aplikácie, ktorá kód rozdelí do samostatných balíkov a modulov s jasne definovanou zodpovednosťou. Každý z nich bude možné neskôr jednoducho upraviť, vymeniť (napr. pri zmene senzora) alebo rozšíriť (napr. pri pridaní novej funkcie zariadenia).

Task

Stiahnite si kostru projektu a nahrajte ju do priečinka src/.

Kostru projektu nájdete na stránke s prvým zadaním.

Ďalšie zdroje

  1. Getting started with Raspberry Pi Pico - Návod ako začať s RPi Pico pre každého

  2. Getting started with your Raspberry Pi Pico W - Návod, ako začať s RPi Pico W

  3. MicroPython - domovská stránka projektu

  4. Quick reference for the RP2 - (krátka) dokumentácia jazyka MicroPython pre dosku Raspberry Pi Pico

  5. PyCharm - domovská stránka vývojového prostredia

  6. MicroPython Tools - domovská stránka rozšírenia

  7. DHT11/22 - senzory z rodiny DHT

  8. Webhook.site - služba na testovanie HTTP požiadaviek

  9. Práca s protokolom HTTP - používanie modulu requests v jazyku MicroPython

  10. MicroPython Stubs - Stubs of most MicroPython ports, boards and versions to make writing code that much simpler.