amaro06


redaktorské poznámky, které nebudou v hlavním textu – zbytek ano.

Osnova a link pro FrameWork https://github.com/octopuslab-cz/esp32_micropython_framework


Pokud je kurzívou celý blok, je to patrné a i v tištěné verzi by bylo fajn aby byl stejně. Bývá to taková poznámka na okraj.

Od tohoto dílu barevně zvýrazňuji i italic, které je důležité. Většinou nějaká klíčová slova, zkratky a pod. červeně nebo v textu uváděné příkazy
– a co by měl/mohl uživatel psát je pak modře.
Možná by nebylo od věci zachovat i barevnost? Nebo ideálně použít neproporcionální font, jak bývá zvykem… Moc toho nebude, tak to snad nenaruší čistotu designu..


Octopus LAB – MicroPython pro ESP32 (6)

V Octopus LABu jsme se v rámci vývoje modulů pro rychlé prototypování zaměřili na MicroPython. Je to už téměř osm let, kdy jsme ho (v té době ještě na ESP8266) zkoušeli poprvé. Ze subtilního MicroPythonu se stala efektivní implementace jazyka Python především pro mikrokontroléry a speciální systémy. Po celou dobu se snažíme usnadnit si práci tvorbou vlastních knihoven a modulů. Po zásadním update MicroPythonu na verzi 1.20 (zhruba před půl rokem) jsme byli nuceni kompletně náš FrameWork přepracovat na dnes aktuální verzi 2.


Framework je nadstavba k programovacímu jazyku (v našem případě MicroPython) s cílem zásadního zjednodušení často se opakujících procesů či rutin. Tvůrci frameworků si chtějí usnadnit život a zkrátit čas vývoje. Vzniká tak soubor mnoha odladěných knihoven pro konkrétní množinu hardware. Použitím osvědčených a vyzkoušených postupů se lze i vyhnout mnoha elementárním chybám a zaměřit se na podstatné části programu.

Od verze jedna pracujeme na tomto projektu zcela zdarma. Celý Framework je také veřejně dostupný na GitHubu: https://github.com/octopuslab-cz/esp32_micropython_framework
Dostupnost zdrojových kódů totiž považujeme za velmi důležitou. To, že můžeme vidět, jak jsou které knihovny vytvořeny, nám dává možnost bezprostředně daný kód dále rozvíjet, opravovat případné chyby a na podobném principu tvořit vlastní moduly. Jedná se o princip open-source, ve kterém se projekty zlepšují za pomoci zapojení více spolutvůrců z celosvětové komunity. Hledání a opravování chyb nebo jen testování a vytváření dokumentace dává mnohým vývojářům smysl jako způsob „něco málo vrátit“ do open-source komunity.
Naše cílová filozofie je, že i složité úkoly by mohly (měly) být zpočátku co nejjednodušší. Některé naše projekty jsou proto funkční, přestože mají minimální počet řádků v hlavním programu. Pár ukázek vám představíme i v tomto seriálu.


Instalace Frameworku

Instalace v tomto případě znamená dostat potřebné soubory do ESP. Soubory jsou nejčastěji programy v obyčejném textovém formátu s příponou py. Další možností je kompilovaný bytecode, který je optimalizovaný pro běh v prostředí MicroPythonu. Ten má koncovku mpy. Zde je důležité dát pozor na správnou verzi, protože právě předkompilované soubory typu mpy nás v minulosti dost potrápily. A MicroPython od verze 1.12 do 1.19 tento formát změnil více než desetkrát, přičemž jednotlivé verze nebyly kompatibilní. A nás to nutilo stále měnit instalační soubory, protože mpy jsme dost používali.
Dále se můžete setkat i se soubory typu txt (pro poznámky, nápovědu či dokumentaci), xml či json pro konfigurace nebo specializované html, css, png a podobně.
Nahrávat je můžeme po sériové lince pomocí ampy či přímo z aplikace Thonny (nebo podobné). Této možnosti využíváme jen výjimečně, když nahráváme jeden či dva soubory. V případě rozsáhlého Frameworku, kdy se jedná o desítky souborů, je už vhodné použít jiné nástroje.
Jelikož má ESP32 možnost připojit se k WiFi (v minulém díle jsme se k bezdrátové síti připojili), využijeme toho i pro instalaci našeho Frameworku.

V této chvíli se ještě musíme zmínit o jedné důležité věci. Balíčkovací systém v Pythonu se nazývá „pip„, což je zkratka pro „Pip Installs Packages“. Je to nástroj, který umožňuje snadno instalovat balíčky (knihovny a moduly) z Python Package Index (PyPI) nebo z jiných repozitářů. Tyto balíčky obsahují opětovně použitelný kód, který řeší různé úkoly, a mohou zahrnovat vše od základních funkcí až po pokročilé nástroje.
MicroPython až do verze 1.19 využíval obdobného principu s názvem upip. (MicroPython často přidává písmeno „u“ před standardní názvy, je to varianta k řeckému písmenu μ [mikro] pro odlišení od klasického Pythonu.) A dovoluji si to zdůraznit proto, jelikož od verze 1.20 přechází MicroPython ke zcela novému balíčkovacímu systému s názvem mip (MicroPython Installs Packages).
V nejnovější verzi je řada vylepšení a opravených chyb, ale některé knihovny třetích stran ještě nejsou aktualizované a to může vést k dílčím problémům. Některé projekty (například se speciálními čidly nebo s Bluetooth Low Energy) proto provozujeme stále ve verzi 1.19. Napsali jsme si pomocné „můstky“, kdy umíme dohrát upip nebo mip podle potřeby i do systému, který je ve výchozím stavu nepodporuje.
Důležité vlastnosti či odlišnosti verzí zmíníme vždy v daném kontextu. V tuto chvíli se dalšími detaily zabývat nemusíme, vystačíme si s tabulkou, která dává do souvislosti verzi MicroPythonu s druhem (v systému předinstalovaných) instalačních balíčků.

Jak jsem již psal minule, budeme se i přes veškerá úskalí snažit pracovat už s poslední vydanou stabilní verzí, proto i náš Framework (ver. 2) ladíme pro 1.20 a instalujeme pomocí mip:

from time import sleep
import network, mip

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

wlan.connect('ssid', 'password')
sleep(5)

url = "github:octopuslab-cz/esp32_micropython_framework"
mip.install(url, target=".")

Program nemusíte opisovat z časopisu, většina zdrojových kódů je k dispozici na Githubu v samostatném repozitáři Praktická elektronika (vždy u konkrétního čísla seriálu) zde: https://github.com/octopuslab-cz/prakticka_elektronika_23.
Po spuštění tohoto kódu (nezapomeňte ještě předtím správně nastavit přístup k vaší síti pomocí ssid a password) by se vám do připojeného ESP (s již nainstalovaným MicroPythonem verze 1.20) měl nahrát celý octopusLAB Framework ve své aktuální verzi přímo z repozitáře, který je také na Githubu.

Octopus Framework Files

Na obrázku Octopus Framework Files vidíte v levé dolní části adresáře (a jednotlivé sobory), které byly z Githubu nainstalovány do vašeho ESP (components, config, lib, pinouts a utils). Někdy je nutno po instalaci ještě provést restart ESP (ctrl+D nebo zmáčknutím tlačítka RST). Různé druhy či šarže ESP modulů se mohou chovat trochu odlišně, setkali jsme se i s nutností ESP odpojit a opětovně připojit, ale většinou ctrl+D postačí. Navíc je vedle nadpisu MicroPython device submenu v podobě tří horizontálních linek, které obsahuje příkaz Refresh a pár dalších funkcí, které jste už asi použili (například New file pro vytvoření nového souboru a podobně).


V příkazové řádce Thonny napiště příkaz (metodu) >>> setup( ) a mělo by se spustit základní menu nastavení:

Ještě se mu v dalších pokračováních budeme věnovat podrobněji, ale některé věci si už můžete zkusit. V první řadě nastavíme ESP32, které používáme. Pomocí volby ds ([ ds ] = device setting) vyberte 1 (pokud máte klasický DoIt modul nebo jiné číslo, když používáte další OctopusLAB moduly).
Všechny kroky a podmenu sem nebudeme dávat, ale budeme se snažit je mít na Githubu u programové přílohy ke každému tištěnému dílu.

Asi vás moc neohromí příklad, ve kterém si zkusíme přepsat příklad blikání LEDky s použitím čerstvě nainstalovaného Frameworku:

from components.led import Led
led = Led(2)

for blink in range(3):
    led.blink()

K tomu to přímo určeno není a zrovna pár řádků třídy Led (vysvětlíme si později) bychom mohli psát přímo do svého programu. Možná bude trochu lepší ukázat, jak se dá program přepsat tak, aby byl obecně přenositelný na více druhů desek, kde máme přednastaveny jednotlivé PINy:

from components.led import Led
from utils.pinout import set_pinout

pinout = set_pinout()
led = Led(pinout.BUILT_IN_LED)

for blink in range(3):
    led.blink()

V tomto případě využíváme obecně pojmenovaného PINu BUILT_IN_LED (podobně to můžete znát i z Arduina, kde je to shodou okolností také dvojka).
Někdy proto lze použít ještě větší zkratky a pak inicializaci vestavěné LEDky a jají bliknutí umíme zrealizovat na dvou řádcích:

>>> from components.led.shortcuts import led
>>> led.blink()

Ale ještě více zjednodušení vynikne na další ukázce, kdy na I2C připojíme LCD displej a vypíšeme si na něm slovo „octopuLAB“:

from octopus_lib import i2c_init
from components.display_i2c_lcd import I2cLcd

i2c = i2c_init()
addr, rows, col = 39, 2, 16
lcd = I2cLcd(i2c, addr, rows, col) 

lcd.putstr("octopusLAB") # write text

Zde již jisté zjednodušení zřejmě zaznamenáte. A to opět zdůrazňuji, že příklad funguje na všech modulech ESP32, kde máme definován PINout pro I2C. Nemusíme se starat o čísla PINů, Framework za nás vše řeší, aniž bychom byli omezeni v možnosti vše přenastavit podle potřeby i jinak. Pokud nám LCD fungovalo na několika deskách v mnoha projektech, v případě nějaké chyby můžeme hledat jinde (třeba v konektoru, kabelu nebo zapojení) a můžeme snadno prohozením modulu odhalit i vadné ESP nebo LCD displej. Ano, i to se může stát, že nás někdy zradí samotný hardware. Z vlastní zkušenosti mohu potvrdit, že marné hledání chybu v kódu ke spokojenosti bastlíře nevede. Což může být i naopak, kdy podezíráme elektroniku, ale vytrvale přehlížíme hloupý překlep v programu. A to je hlavní důvod, proč tvoříme moduly hardwarové a zároveň i rozsáhlé a otestované programové vybavení. Vše pak funguje s celou řadou rozšiřujících modulů (senzory, displeje a podobně).

Ukázka LCD běží na naší nové desce ESP32C3board (modul s nabíječkou pro Li-ion akumulátor). K této desce je připojen modrý podsvícený LCD 1602 (16 x 2) displej s I2C převodníkem. Na připojení displeje nám tak stačí čtyři „dráty“ a šest řádků kódu v MicroPythonu.