Amaro03


osnova:

první jednoduchá zapojení s ESP
a letmé základy Pythonu

Odstavec se zeleným podkladem patří do článku a bylo by fajn ho také „nějak“ zvýraznit, alespoň rámečkem, ideálně i obdobným barevným podkladem

Octopus LAB – MicroPython pro ESP32 (3)

Informace, které by vám mohly pomoct vyhnout se potenciálním problémům. Výhody a nové výzvy spojené s nejnovější verzí MicroPythonu. A konečně i první konkrétní práce s ESP (blikání LEDkou nebo čtení hodnot z vestavěných senzorů).


V aktuální sérii článků se snažíme rozšiřovat ale především aktualizovat popis práce s moduly ESP32, kterým se intenzivně věnujeme už pátým rokem. Za tu dobu nás potkala celá řada zásadních změn (systému SDK + MicroPython). Proto doufáme že naše postřehy vám pomohou vyhnout se některým úskalím.
MicroPython je vydáván v binární verzi pro ESP32, ale často potřebujeme zkompilovat vlastní verzi, což komplikuje nekompatibilita některých verzí nástrojů, které je k tomu potřeba využít. Pojďme se na to podívat podrobněji.

SDK (Software Development Kit)

SDK je sada nástrojů a rozhraní API (Application Programmable Interface) na úrovni zařízení pro „bezdrátové čipové sady“ řady ESP8266, ESP32 a ESP32-S2. Optimalizované předkompilované knihovny a knihovny ovladačů zkracují dobu vývoje a zároveň zajišťují velkou variabilitu projektů.
Specificky pro produkty firmy Espressif se toto SDK nazývá ESP-IDF (Espressif IoT Development Framework) . Použití nesprávné verze vede do slepých uliček.
Začínali jsme verzí ESP-IDF v3.x, ale nové modely ESP32-S2 či ESP32-C3 už podporují pouze ESP-IDF v4.3+ (v4.4+). SDK je „nízkoúrovňový firmware“, který se vždy instaluje současně s MicroPythonem. Již je k dispozici i verze 5.X, ale tu ještě v ostrém provozu nezkoušíme, počkáme až bude „přikompilovaná“ oficiálně.

Poslední stabilní verze (takzvaná „binárka“ *.bin) pro ESP-IDF v4.x si držela déle než rok číslo 1.19. Pokaždé jsme se snažili poslední stabilní verzi využívat co nejdéle, jelikož jsme pracovali s celou řadou vlastních doplnění a přednastavení (například pro externí SPIRAM nebo pro ESP-now či práci s LAN modulem). Ještě ve chvíli finální korektury minulého čísla jsme netušili, že se každým dnem chystá vydání nové verze. A tak máme nyní MicroPython už ve verzi 1.20, což nám přináší kromě výhod i spoustu nové práce a dílčích problémů.
Chceme veškeré naše projekty vyvíjet vždy v co nejnovějších verzích, což je časově hodně náročné, proto vás opět prosíme o shovívavost. Pokud v ukázkách objevíte chybu, velmi nám pomůže, když nám o ní dáte vědět co nejdříve. Vždy si také ale předem zkontrolujte, jakou verzi používáte.
I samotný MicroPython je open source. Open source projekty jsou založeny na dobrovolné spolupráci, kdy se na postupném zdokonalování podílí celá řada nadšenců. Každý může navrhovat doplnění, hlásit chyby a libovolným způsobem přispívat.
V tuto chvíli proto budeme pracovat se oběma verzemi (1.19 i 1.20) a případné nejasnosti vždy zdůrazníme.
Pro velkou část prvních pokusů by však mohla fungovat i poslední 1.20 (a i na ní to vždy otestujeme).

Pár prvních pokusů s Pythonem

Některé obecné ukázky (nesouvisející s hardwarem) mohou fungovat i na běžném počítači při použití Pythonu (verze 3.5+).
Jak si zkusit první krok jste se dozvěděli už v minulém díle. Cílem však je základní představení, částečné pochopení a procvičení elementárních základů především s ESP32.


Drobná poznámka:
Toto není výuka programování, ale jen ukázky a experimenty s přihlédnutím na sadu knihoven a modulů octopusLab pro práci s vybraným hardware. Pro podrobnější proniknutí do tajů programování v Pythonu doporučujeme na stránkách https://python.cz/ výborně zpracovanou sekci naucse.python.cz.


Takto vypadá jeden z nejběžnějších vývojových modulů, který používáme. ESP32 v modulu 2×15 pinů s programátorem (převodníkem USB/UART). Zmiňovali jsme ho v prvním díle, ale obrázek se zřejmě nevešel.


Po restartu nám ESP32 posílá do našeho počítače (na terminál) „zprávy“ s využitím REPLu. Po stisknutí CTRL-C se přeruší běh programu a měli bychom vidět verzi MicroPythonu.

REPL

REPL je zkratka pro styl programovacího (nebo přesněji skriptovacího) a ladícího cyklu Read–eval–print loop. Jedná se o „interaktivní MicroPython prompt“, který funguje přes USB sériovou linku. Vzdálené připojení se dá uskutečnit i přes „webovou aplikaci“ micropython.org/webrepl.

Později, až se připojíte k WiFi, po spuštění webrepl.start() na ESP připojenému v lokální síti pak můžete pracovat v terminálu >>> jako by bylo spojeno kabelem. Pro úplnost doplňme, že zařízení bude na adrese ws://192.168.4.1:8266/ (port 8266 zatím zůstává historicky z éry ESP8266). 

V originální dokumentaci docs.micropython.org/repl se o REPLu můžete dozvědět, že je v ESP připojen na UART0 sériové linky, která je na PINech GPIO1 pro TX and GPIO3 pro RX. Rychlost přenosu (Baudrate) je 115200. To je důvod, proč pro vlastní sériovou linku používáme UART1.


Výčet klávesových zkratek pro práci s REPLem:

  • CTRL-A (on a blank line, enter raw REPL mode)
  • CTRL-B (on a blank line, enter normal REPL mode)
  • CTRL-C (interrupt a running program)
  • CTRL-D (on a blank line, do a soft reset of the board)
  • CTRL-E (on a blank line, enter paste mode)

Nejčastěji potřebujeme CTRL-C (zastavení běhu programu) nebo CTRL-D (soft reset).
I pro „velký“ Python platí, že CTRL-C přeruší běh programu.

S modulem s ESP můžete pracovat i samostatně, ale výhodnější je použít například kvalitní nepájivé pole. Modul je pak stabilnější a neskáče nám po stole a především máme chráněny vývody, jejichž zkratování by mohlo ESP i zničit. Na obrázku můžete vidět, jak jsme si připojili jednu LED (svítivou diodu s ochranným odporem). Dále tam máme piezzo bzučák (pasivní). I k němu se občas předřazuje odpor (cca 100 ohm), ale s ESP to není nutné, maximální proud máme omezen vnitřně.

V dalších zapojeních budeme uvádět přednostně klasické schéma, ale pro jednoduchý začátek je tento konkrétní obrázek asi názornější.

Sériovou linku můžeme z PC ovládat pomocí několika různých nástrojů. Tradičně to může být PuTTY (Windows) či screen (Linux/Mac). Novější terminálový nástroj se jmenuje mpremote.
Pro svou přehlednost (při úvodním seznamování) se nám osvědčil nástroj Thonny (thonny.org/), ve kterém dnes využijeme prozatím jen interaktivní shell v pravé dolní části.

Python zde běží v takzvaném interaktivním módu. Po každém vložení řádku (nebo skupiny příkazů / řádků) se napsaný příkaz okamžitě provede a systém „čeká“ na další zadání výzvou >>>.
(„prompt“, terminálová výzva, abychom tam „něco“ napsali)
.Je to výhodné pro testování jednotlivých příkazů, pro výuku nebo průběžné drobné modifikace.

Pro nás je MicroPython velmi příjemný a přehledný jazyk. Oproti Céčku nebo Rustu v něm i úplný začátečník může začít pracovat téměř okamžitě, aniž by se musel ponořit do obecnějších hlubin programování (datové typy, deklarace, kompilace…).
Pokročme proto hned k první konkrétní ukázce ovládání hardware. To, co je v oblasti ryze softwarové print(„hello world!) je s hardware „blikání LEDkou„. V terminálu postupně zadejme následující tři příkazy (vždy ukončené ENTERem):

>>> from machine import Pin
>>> led = Pin(2, Pin.OUT)
>>> led.value(1)

Pokud je v ukázkách programů na začátku řádky prompt >>> jedná se o interaktivní práci z terminálu a řádky se většinou zadávají postupně jeden po druhém. (Prompt tam nepíšeme, to za nás vypisuje MicroPython jako symbol očekávání dalších příkazů.)
Když se po průběžném zadávání zdánlivě NIC neděje, je to v Pythonu obecně v pořádku. V opačném případě systém ohlásí chybu.


Využili jsme vestavěné LEDky na PINu č. 2. Když chceme připojit externí LEDku na PINu č. 15 je nutné PIN dekrarovat podle toho a 2 změnit na 15.
Po odeslání posledního příkazu by se měla rozsvítit LEDka. Abychom jí zhasnuli stačí nastavit hodnotu „value“ na nulu:

>>> led.value(0)

Dala by se alternativně použít i metoda „off( )“ (nebo „on( )“ pro rozsvícení):

>>> led.off()
>>> led.on()

Pro finální „blikání“ pak stačí v nekonečné smyčce rozsvěcovat a zhasínat. Abychom to mohli sledovat je nutné používat drobné zpoždění, například 0.5 sekundy (v opačném případě bliká dioda tak rychle, že to pouhým okem nepostřehnte.) Výsledný kód je zde:

>>> from machine import Pin
>>> from time import sleep
>>> led = Pin(2, Pin.OUT)
>>> while True:
        led.value(1)
        sleep(0.5)
        led.value(0)
        sleep(0.5)

Povšimněte si, že si vždy inicializujeme potřebnou knihovnu. Pro „Pin“ potřebujeme „machine“ a pro „sleep“ zase „time„. Velmi brzy si ukážeme, jak si vytvořit i knihovnu vlastní.
Další zásadní věc je odsazování. Celý blok příkazů v cyklu „while“ (na konci je dvojtečka) je odsazen o jeden TAB (nebo stejný počet mezer – doporučeny čtyři).
Můžeme si zkusit obdobným způsobem připojit piezzo (na PINu 18) a časovou prodlevu adekvátně zkrátit (při 0.005 sec by měl být slyšitelný tón celé periody cca 100Hz). Můžeme využít i příkazu „sleep_ms“ a údaj pak zadávat v milisekundách. Lépe je to řídit pomocí PWM (pulsní modulace), ale o tom až někdy příště.

Některé základní funkce ze standardní knihovny čekací prodlevy:
Program bude pokračovat až po uplynutí dané doby.

from time import sleep, sleep_ms, sleep_us 
sleep(1)      #> 1 sekunda pauza 
sleep_ms(100) #> 100 mili sekund  
sleep_us(50)  #> 50 mikro sekund 

Minule jste si mohli zkusit z příkazové řádky jednoduché matematické operace:

>>> 1 + 2
3

Chceme-li složitější matematické výrazy, než je sčítání (+) odčítání (-) násobení (*) dělení (/), importujeme požadovanou knihovnu (ideálně jen když jí potřebujeme, jinak nám zbytečně blokuje operační paměť).

>>> import math          
>>> math.log10(100000)
5.0    
>>> math.pi 
3.141593                  

# nebo lépe a úsporněji:
>>> from math import log10
>>> log10(1000)
3.0

MicroPython má obrovskou výhodu v tom, že běží jako interpret: když uživatel napíše název proměnné, třídy nebo instance objektu, skoro všechno se o nich můžeme dozvědět. Právě proto máme k dispozici všechny metody, po „tečka TAB“. TAB tedy slouží i jako „nápověda“ nebo pro efektivní našeptávač pro dokončování příkazů, což s jistou praxí může znatelně urychlit práci z „komand-lajny“ (podobně jako v Linuxu). Bohužel to funguje pouze v terminálu (PuTTY nabo screen) ale Thonny tuto možnost zatím neumí.


Takže si to můžete vyzkoušet například v terminálu PuTTY (který se nastaví na výchozí rychlost ESP 115200 a zvolí se „serial“).

>>> import math 
>>> math.  
a po tečce stisknout TAB -> vypíše všechny dostupné metody pro math
- například:

pi     e      pow 
sin    cos    tan            
ceil   floor  modf         
log    log10  log2            
nan    sinh   sqrt            
...

Z knihovny esp32 máme k dispozici zajímavé funkce, které modul poskytuje. Například teplotu procesoru:

>>> import esp32  
>>> esp32.raw_temperature() 
127 (-> teplota u procesoru F)

>>> tf = esp32.raw_temperature()
>>> tc = (tf-32.0)/1.8
>>> print(tf, int(tc))
116 46

Teplotu nám ESP vrací ve stupních Fahrenheita a proto jsme si ji ve druhém pokusu jednoduchým vzorečkem přepočetli na stupně Celsia. Použili jsme i metodu int( ) pro zaokrouhlení na celá čísla (integer).

ESP32 obsahuje vestavěný Hallův senzor, který lze použít k detekci magnetického pole. Tento senzor je obvykle zapojen do interních periferních rozhraní mikrokontroléru, který nám umožňuje přímo číst a interpretovat naměřená data. Zkusili jsme si načítat data ve chvíli, kdy jsme přikládali magnet buď jednou nebo druhou stranou.
Jak je jistě známo: Opačné póly magnetů se přitahují a stejné póly magnetů se odpuzují. Severní pól jednoho magnetu (S) odpuzuje severní pól druhého magnetu a stejně tak jižní póly (J) se odpuzují. A hallův senzor s příkladu nám póly signalizuje znaménkem.

>>> import esp32  
>>> esp32.hall_sensor()
30 (cca "naprázdno")
(-)950 (po přiložení magnetu S nebo J)

Vlastní funkce / metoda

V dalším pokračování se této problematice budeme věnovat podrobněji a dozvíte se, i jak si definovat vlastní třídu. Nyní se zmíníme o více řádkové „dočasné definici vlastní funkce“:

def název(parametry): nezapomenout na dvojtečku!  

>>> def suma(x, y):   
...    return x + y
... 
Pozor na odsazení dalších řádků a důsledné zarovnávání logických bloků. Ukončení definice se provede po opakovaném odeslání prázdného řádku (pomocí ENTERu).
PuTTy dosazuje ři tečky "...", ale Thonny pouze mezery.
...  
a zkusíme, jak nám nová funkce funguje:
  
>>> suma (1, 2) 
3

Můžeme si napsat funkci pro přepočet Fahrenheita na Celsia, kdy funkci (v Pythonu lépe „metodu„) pojmenujeme fahrenheit_to_celsius, předáme jí v závorkách jeden parametr fahrenheit (pak konkrétní 116) a vrátí nám přepočtenou hodnotu.

# fahrenheit_to_celsius
>>> def f_to_c(f):
...    c = (f - 32) * 5 / 9
...    return c
>>>
>>> print(f_to_c(116))
46.6667

Určitě vás nechceme nutit opisovat dlouhé bloky programů a proto se spíš zaměříme na nějaké základní nebo důležité věci a výsledné (pokud možno funkční) programy se budeme snažit publikovat na Githubu:
https://github.com/octopuslab-cz/prakticka_elektronika_23


Přestože je náš seriál zaměřen na ESP32, velká část ukázek může fungovat i na jiných platformách. Na stránkách https://micropython.org/download/ jich dnes můžete vidět už několik desítek. Například miniaturní modul Waveshare RP2040-Zero, určitě stojí za vyzkoušení. Má zabudovaný dvoujádrový procesor Arm Cortex M0+ a flexibilní taktování až do 133 MHz, 264 KB paměti SRAM a 2 MB vestavěné paměti Flash.


Uvidíme, jak se to vejde na cca dovoustranu.

Další díl: https://www.octopuslab.cz/amaro04/