Programujeme Raspberry Pi Pico v jazyku MicroPython
základy práce s doskou Raspberry Pi Pico v jazyku MicroPython
Videá pre cvičenie
Upozornenie
Pred príchodom na cvičenie si doma nainštalujte editor Thonny a na cvičenie si prineste vlastné Raspberry Pi Pico W/H minimálne so senzorom DHT11 a tlačítkom! Podrobnejšie informácie o inštalácii a hardvérovom vybavení nájdete na tejto stránke.
V prípade, že nemáte k dispozícii fyzické komponenty, môžete na účely cvičenia využiť online simulátor Wokwi, kde si pripravte zapojenie so senzorom DHT11 a tlačítkom v jazyku MicroPython.
Motivácia
Našim cieľom na nasledujúcich cvičeniach bude vytvoriť chytrý senzor pre meranie teploty a vlhkosti. Čo je podstatné - pri návrhu a implementácii sa budeme snažiť o to, aby sa nejednalo o prvoplánové riešenie, ale budeme sa snažiť o bezpečnú a funkčnú implementáciu s ohľadom na koncového zákazníka.
Ciele
- naučiť sa základy programovania v jazyku MicroPython na doske Raspberry Pi Pico
- zoznámiť sa s editorom Thonny a jeho možnosťami programovania mikrokontrolérov v jazyku MicroPython
Postup
Predtým, ako naozaj začneme
Ešte predtým, ako začneme, si nainštalujte editor Thonny a do mikrokontroléra Raspberry Pi Pico nahrajte firmvér s jazykom MicroPython. Podrobnejšie pokyny nájdete na tejto stránke.
Niekoľko tipov pri práci:
Pico na doske neobsahuje tlačidlo
RESET
. Najjednoduchšie ho však môžete reštartovať odpojením a opätovným pripojením USB kábla. Nikdy ho však neodpájajte ani nepripájajte na strane dosky mikrokontroléra! Vyhnete sa tak možnosti odtrhnutia konektora na doske a tým pádom aj jeho celkovému poškodeniu. Miesto toho odpájajte USB kábel vždy na strane počítača!V prípade, že chcete mikrokontrolér reštartovať softvérovo, môžete tak urobiť príkazom:
from machine import reset; reset()
Softvérový reset zariadenia sa dá vykonať ešte jednoduchšie - stlačením klávesovej skratky
CTRL+D
v prostredíREPL
(terminála) vývojového prostredia Thonny.
Ak chcete vedieť, aké moduly sú dostupné na zariadení, napíšte príkaz
help('modules
). Výsledkom bude zoznam zabudovaných modulov
jazyka MicroPython:
>>> help('modules')
/__init__ hashlib requests/__init__
__main__ asyncio/core heapq rp2
_asyncio asyncio/event io select
_boot asyncio/funcs json socket
_boot_fat asyncio/lock lwip ssl
_onewire asyncio/stream machine struct
_rp2 asyncio
_thread binascii math sys
_webrepl bluetooth micropython time/__init__ builtins mip/__init__ tls
aioble/central cmath neopixel uasyncio
aioble/client collections network uctypes
aioble/core cryptolib ntptime urequests
aioble/device deflate onewire vfs
aioble/l2cap dht os webrepl
aioble/peripheral ds18x20 picosleep webrepl_setup
aioble/security errno platform websocket
aioble/server framebuf random
aioble
array gc reany modules on the filesystem Plus
Funkčné minimum
V prvom kroku vytvoríme veľmi jednoduchú a prvoplánovú implementáciu (budúceho) chytrého senzora. Vytvoríme základné zapojenie a vytvoríme základnú kostru kódu, pomocou ktorej odmeriame aktuálne hodnoty zo senzora a vypíšeme ich do terminálu.
Task
K vašej doske pripojte senzor, tlačítko a LED diódu.
Task
Vytvorte fragment kódu, pomocou ktorého prečítate aktuálne hodnoty zo senzora a vypíšete ich do terminálu.
Na zariadení vytvoríme súbor s názvom (napr.) device.py
a za predpokladu, že je senzor DHT11 pripojený ku pin-u č.
27
, bude výsledný kód vyzerať nasledovne:
# device.py
from dht import DHT11
from machine import Pin
= Pin(27, Pin.IN)
pin = DHT11(pin)
sensor
sensor.measure()= sensor.temperature()
temp = sensor.humidity()
hum
print(temp, hum)
Task
Číslo pin-u, na ktorý je pripojený senzor, uložte do globálnej
premennej DHT_PIN
a uložte ju do modulu
boot.py
.
Modul boot.py
má v jazyku MicroPython špeciálne využitie. Je
to totiž prvý súbor, ktorý sa spustí po zapnutí zariadenia a všetky
vytvorené premenné, objekty a zadefinované funkcie budú dostupné v
globálnom kontexte. Nie je teda potrebné objekty z modulu
boot.py
importovať v našom module. Aby však k ich načítaniu
došlo, je potrebné mikrokontrolér reštartovať (napr. stlačením skratky
CTRL+D
v REPL režime).
# boot.py
= 27 DHT_PIN
# device.py
from dht import DHT11
from machine import Pin
= Pin(DHT_PIN, Pin.IN)
pin = DHT11(pin)
sensor
sensor.measure()= sensor.temperature()
temp = sensor.humidity()
hum
print(temp, hum)
Konfiguračný súbor
Vlastnosti chytrého zariadenie budeme potrebovať meniť za behu. V našom prípade vytvárame chytrý teplomer. Ten v našom regióne bude napr. hodnotu teploty vracať ako hodnotu v stupňoch celzia. V prípade ale, že expandujeme a začneme naše chytré teplomery predávať napr. aj v USA, budeme potrebovať, aby teplomer meral v stupňoch fahrnhejta.
A práve túto funkcionalitu zabezpečíme pomocou konfiguračného súboru,
kde sa budú nachádzať nastavenia správania chytrého zariadenia. V tomto
prípade to bude zatiaľ len jednotka teploty. Pre reprezentáciu
konfiguračného súboru použijeme formát JSON, pretože vieme
údaje do neho jednoducho serializovať a deserializovať pomocou modulu
json
.
Task
V module boot.py
vytvorte premennú
CONFIG_FILE
, ktorá bude obsahovať názov a umiestnenie
konfiguračného súboru.
Názov konfiguračného súboru bude config.json
.
# boot.py
= 27
DHT_PIN = 'config.json' CONFIG_FILE
Task
Vytvorte funkciu read_config()
, ktorá načíta
konfiguračný súbor zo súborového systému mikrokontroléra a vráti ho ako
objekt typu dictionary
. V prípade, že sa súbor nepodarí
načítať, vytvorte jeho predvolenú podobu.
Predvolenú podobu súboru zatiaľ uložíme ako slovník do globálnej
premennej DEFAULT_CONFIG
do modulu boot.py
.
Konfiguračný súbor bude mať zatiaľ len kľúč units
, ktorého
prípustné hodnoty budú:
standard
- ak chceme teplotu merať v Kelvinochmetric
- ak chceme teplotu merať v stupňoch Celzia, aleboimperial
- ak chceme teplotu merať v stupňoch Fahrnheita.
Predvolená konfigurácia bude zatiaľ vyzerať takto:
{
"units": "standard"
}
# device.py
import json
def read_config():
try:
with open(CONFIG_FILE, 'r') as file:
return json.load(file)
except OSError:
print('Error: Config file not found. Creating default one.')
with open(CONFIG_FILE, 'w') as file:
file)
json.dump(DEFAULT_CONFIG, return DEFAULT_CONFIG
Poznámka
Za zmienku stojí zamyslenie nad tým, ako funkciu ukončiť v prípade
neexistencie konfiguračného súboru. V prípade mikrokontrolérov sa totiž
mnohé situácie riešia reštartovaním mikrokontroléru, čo je možné
docieliť pomerne jednoducho zavolaním machine.reset()
.
Task
Overte vytvorenú implementáciu.
Ak ste postupovali správne, predvolený súbor sa vytvorí automaticky v prípade, ak chýba v súborovom systéme mikrokontroléra.
Meriame teplotu v správnych jednotkách
Zo senzora DHT11 získame teplotu ako celé číslo v stupňoch Celzia. V tomto kroku teda aktualizujeme kód tak, aby sme vedeli hodnotu teploty zobraziť v správnych jednotkách vzhľadom na aktuálnu konfiguráciu.
Task
Vytvorte funkciu convert_temp()
, ktorá prevedie hodnotu
teploty do správnych jednotiek.
Funkcia bude mať tieto parametre:
value
- nameraná hodnota v stupňoch Celzia, ktorá bude typu intunits
- reťazec, ktorého hodnota môže byť jedna z hodnôtstandard | metric | imperial
Funkcia vráti hodnotu typu float
, ktorá bude
reprezentovať hodnotu teploty v jednotkách zadaných v parametri
units
. V prípade, že hodnota parametra units
nebude správna, vráťte teplotu v Kelvinoch.
def convert_temp(value: float, units: str) -> float:
if units == 'metric':
return value
if units == 'imperial':
return value * 9/5 + 32
return value + 273.15
Task
Overte vytvorenú implementáciu.
Ak ste postupovali správne, zmenou hodnoty kľúča v konfiguračnom súbore dostanete nameranú hodnotu teploty v rozdielnych jednotkách.
Ďalšie úlohy
Súbor s konfiguráciou nemusí byť valídny. V prípade, že sa tak stane, dôjde pri jeho načítaní k výnimke. Aktualizujte preto funkciu
read_config()
tak, aby v prípade pokusu o načítanie nevalídneho konfiguračného súboru tento súbor prepísala predvolenou konfiguráciou.Jazyk MicroPython nemá k dispozícii modul na logovanie. Preto vytvorte samostatný modul
log.py
, ktorý chýbajúcu funkcionalitu poskytne. V tomto module vytvorte (minimálne) tieto funkcie:debug()
- Funkcia na vypísanie logovacích správ úrovneDEBUG
.info()
- Funkcia na vypísanie logovacích správ úrovneINFO
.warning()
- Funkcia na vypísanie logovacích správ úrovneWARNING
.error()
- Funkcia na vypísanie logovacích správ úrovneERROR
.critical()
- Funkcia na vypísanie logovacích správ úrovneCRITICAL
.
Pre potreby logovania vytvorte globálnu premennú
LOG_LEVEL
, pomocou ktorej bude možné nastaviť úroveň logovania globálne pre celé zariadenie. To znamená, že ak bude nastavená vyššia úroveň logovania (napr. úroveňERROR
), nebudú sa zobrazovať logovacie správy nižších úrovní (napr. v prípade úrovne logovaniaERROR
sa nebudú zobrazovať správy úrovníDEBUG
,INFO
aWARNING
).
Ďalšie zdroje
Getting started with Raspberry Pi Pico - Návod ako začať s RPi Pico pre každého
Getting started with your Raspberry Pi Pico W - Návod, ako začať s RPi Pico W
Introduction to Raspberry Pi Pico: LEDs, buzzers, switches, and dials - sada návodov na prácu s RPi Pico
Get Started with MicroPython on Raspberry Pi Pico - kniha zdarma, ktorá je plná návodov pre každého začiatočníka s doskou RPi Pico
Quick reference for the RP2 - (krátka) dokumentácia jazyka MicroPython pre dosku Raspberry Pi Pico