- ROBOTboard (HW)
- Octopus open source knihovny (FW)
- Nastavení zařízení a periferií
- ds: device setting > pinouts
- ios: input-output setup
- Upgrade systému
- Displeje
- Tlačítka
- Mechatronika
- Čidla a vstupy
- Shrnutí
V prvním díle jsme se seznámili s úplnými základy.
Například: Vše v Micropythonu je objekt.
Deklarace třídy znamená definování metod (funkcí) a properties (vlastností) a následně vytvoření instance objektu a jeho použití.
Vyzkoušeli jsme si efektivní práci z konzole (příkazové řádky terminálu) – pomocí TAB (kontextová nabídka metod) a šipek nahoru/dolů (krátká historie příkazů).
Dnes si ukážeme podrobněji na jednoduchých příkladech možnosti práce s periferiemi. Ke všemu by Vám postačil libovolný modul s ESP32 a nainstalovaný Micropython.
Jelikož sestavujeme hardware, který pak dále programujeme, musíme nějak popsat, jak vše propojit, aby to dělalo vše, co potřebujeme. Na obrázku je ukázka nákresu zapojení v programu fritzing, kde vidíte, co vše si v tomto díle můžete vyzkoušet: Displeje, servo, svítivé diody, piezzo bzučák…
Pokud by si chtěl někdo postavit například robotické vozítko a přidat k této spleti drátů další dvě tlačítka, echo čidlo a H-můstek pro ovládání motorů, už by to bylo poněkud komplikovanější a zapojení v nepájivém propojovacím poli je pro pohyblivé vozítko opravdu nepraktické. Letování na univerzální desku nám také vývoj a pokusy neusnadní – opakované rozebírání a rychlé opětovné složení je pro testování mnohem efektivnější.
A to nemluvíme o náročnosti pro úplné začátečníky, kdy je nutno například hledat chybu v zapojení – je tak snadné si splést jeden pin nebo mít dokonce špatný konektor u kablíku.
ROBOTboard (HW)
My proto používáme modul ESP na desce ROBOTboard. V základní sestavě nám postačí připojení RGB ledky, sedmisegmentového displeje, piezzo měniče, OLEDu a serva. Vše se dá realizovat jednoduchým připojením přímým konektorem 1:1 nebo hotovým kabelem. A osazení desky zvládne i začátečník, stačí nám základ podle [IMG R2] z popisu osazení.
Pro vytváření robotického vozítka je místo pro H-můstek a dokonce přes I2C expandér můžeme ovládat dva malé krokové motory.
Octopus open source knihovny (FW)
I programová část našeho projektu nám velmi usnadní práci – je to modulové rozšíření pro Micropython octopus() s inicializační částí setup().
Jak si vše nahrát a otestovat popisujeme v návodu k instalaci:
https://www.octopuslab.cz/micropython-octopus/ který byl základem prvního dílu kurzu.
Knihovny které vyvíjíme, testujeme a optimalizujeme pro octopusLAB HW jsou jako open-source na našem githubu.
Nastavení zařízení a periferií
device setting > pinouts
spustíte-li >>> setup() nejdříve nastavte pinout, který máme sice svázán s deskou ROBOTboard, ale i když ji nemáte, můžete použít stejnou deklaraci pinů, kterou máme již otestovanou
> volba [ds] znamená, že napíšete ds, potvrdíte (stiskem ENTER), pak zvolíte 5, tím máte pinout definován tak, jak je uvedeno v červeném rámečku předchozího obrázku a nebo v githubu:
https://github.com/octopusengine/octopuslab/blob/master/esp32-micropython/pinouts/olab_esp32_robot_board1.py
input-output setup
> volba [ios]
V tomto kroku můžete nastavit periferie, které chcete testovat – deklarace jen urychlí veškeré inicializace a případné ověření funkčnosti, a slouží také pro optimalizaci operační paměti, protože můžete dynamicky nastavit jen to, co chcete používat. V modrém rámečku vidíte, že máme nastaveno:
led [1]
tím systému říkáme, že máme vestavěnou led a chceme ji používat
základní vstup je předpokládán 0 nebo 1
ws [8]
barevné RGB, které se řadí za sebou, zde jich máme osm, pro pokusy zadáváme 1
led7 [1]
při nastaveném sedmisegmentovém displeji systém automaticky inicializuje SPI sběrnici, inicializace samotného displeje se provádí podle potřeby – dodatečně a variantně (možno mít i více displejů) a dohrávat specifické moduly, co opět ubírají systémové prostředky
servo [1]
systém informujeme o jednom servu na pozici servo1 / PWM1
Upgrade systému
Poznámka: pokud máte náš systém octopus() z minulého kurzu (2019/07), je lepší ho aktualizovat, protože tam máme opět dost úprav a novinek: buď přes setup() > connect wifi > system download (stable) nebo z terminálu: >>> octopus() >>> w() >>> from util.setup import deploy >>> deploy("https://octopusengine.org/download/micropython/stable.tar") a od verze 0.85 už postačí jenom: >>> octopus() >>> u()
Displeje
A konečně můžeme přejít k dalším několika konkrétním ukázkám: 8 x 7-mi segmetový displ7: >>> d7 = disp7_init() nezbytná inicializace: mikrokontroléru se "sdělí", který displej používáme, ten si ho připojí a vyzkouší a předá nám instanci objektu > d7 >>> d7.show(123.456) zobrazení čísla >>> d7.show("ahoj") omezené zobrazení řetězce oled: >>> o = oled_init() podobně inicializace oled displeje >>> o.fill(1) >>> o.show() takto bude celý vyplněn "bílou / svítící" plochou jeho smazání je "rychlejší": >>> o.clear() >>> o.text(txt,pozice) >>> o.show() >>> o.hline(x, y, h, color) >>> o.vline(x, y, w, color) >>> def onePoint(x,y): ... o.pixel(x,y,1) ... o.show() ... >>> from assets.icons9x9 import ICON_clr, ICON_heart >>> o.draw_icon(ICON_heart,115,15) >>> def heartBeat() ... o.draw_icon(ICON_heart,115,15) ... sleep(1) ... o.draw_icon(ICON_clr,115,15) ... sleep(1) ... lcd >>> d = lcd2_init() ... i2c_scann() > devices: [39]
Tlačítka
buttons: >>> B0 = button_init(0) B je tlačítko "boot" na pinu 0, je to tlačítko, které má modul již vestavěn a každá ESP deska by ho měla mít, pro výchozí možnost přeprogramování >>> button(B0) (10, 0) výchozí hodnota, poměr načtených hodnot logická 0 a log. 1 (0, 10) při stisknutém boot >>> if button(B0)[0] > 8: podmínka je splněna i při jednom náhodném zakmitání, stačí nám 9 shodných hodnot, index [0] určuje "první pozici" v poli vrácených hodnot (pole [] má indexy 0, 1, 2, ...) například pro ovládání L-R hry: h = 100 # temporary "global" variable horizontal > center def horizontal(): global h if button(L)[0] > 8: h -= 1 | # [0] 0 = press to GND [1] not if button(R)[0] > 8: h += 1 # debounce 0-10, 9 is ok return h A trochu pokročilejší verze, kdy stisk tlačítka vyvolá přerušení, které "obsloužíme" podle potřeby: https://github.com/octopusengine/octopuslab/blob/master/esp32-micropython/examples/button_irq.py základ tvoří dva řádky: button0 = Pin(0, Pin.IN) button0.irq(trigger=Pin.IRQ_FALLING, handler=irq_handler) a pak funkce irq_handler()
Mechatronika
servo: >>> s1 = servo_init() musí být nastaveno v ios, jinak je nutno před tím zavolat: >>> from util.servo import Servo natočení na daný úhle, doporučujeme si s tím trochu pohrát, jsou tam min a max parametry a pod. >>> s1.set_degree(0) >>> s1.set_degree(90) krokový motor / dc motor: Záleží na konkrétním zapojení - a většinou se k tomu dostáváme až v pokročilejších příkladech, které jsou nad rámec tohoto workshopu - více na našem githubu: K ovládání dvou malých krokových motorů přes I2C expandér máme knihovnu: https://github.com/octopusengine/octopuslab/blob/master/esp32-micropython/lib/sm28byj48.py A zde je jeden testovací projekt jednoduchého robotického vozítka: https://github.com/octopusengine/octopuslab/blob/master/esp32-micropython/_projects/robot05/main.py
Čidla a vstupy
teploměr: >>> t = temp_init() >>> get_temp(t[0],t[1]) > teploměr a jeho hodnota zkráceně postačí: >>> get_temp(*t) >>> kt = int((get_temp(t[0],t[1])-20)*20) >>> print(kt) barva ws Led podle teploty: >>> col = wheel(kt) >>> ws.color(col) zkráceně - souhrnně: >>> t = temp_init() >>> from util.rgb import wheel >>> ws.color(wheel( int((get_temp(t[0],t[1])-20)*20))) pro jednorázové zobrazení teploty na displeji stačí tři kroky: >>> d7 = disp7_init() inicializace lcd displeje >>> t = temp_init() inicializace teploměrů >>> d7.show(get_temp(*t)) zobrazení teploty AD převodník - vstupní napětí / fotoodpor, potenciometr nebo termistror: >>> from util.analog import Analog pokud nemáme přednastaveno v i/o analog >>> photo = Analog(36) >>> photo.read() jediné načtení analogové hodnoty na pinu (měří 0-3V vrací 0-4096, 12 bit) >>> photo.get_adc_aver(20) metoda změří 20 hodnot a vrátí aritmetický průměr
Toto není výuka Micropythonu. A tak, pokud vás zajímají některé detaily, které jsme si dovolili zde automaticky použít, doporučujeme prohlédnout následující odkazy:
Práce se seznamy:
https://chiptron.cz/articles.php?article_id=236
Lambda výrazy:
https://chiptron.cz/articles.php?article_id=238
Použití SHA256:
https://chiptron.cz/articles.php?article_id=227
Materiály z naucsepython:
https://naucse.python.cz/course/mi-pyt/
Například:
https://naucse.python.cz/course/mi-pyt/intro/micropython/
PDF:
řetězce https://pyvec.github.io/cheatsheets/strings/strings-cs.pdf
seznamy https://pyvec.github.io/cheatsheets/lists/lists-cs.pdf
slovníky https://pyvec.github.io/cheatsheets/dicts/dicts-cs.pdf
Shrnutí
octopus() h() = o_help() i() = o_info() c() = clt() clear terminal w() = w_connect() u() = system update / upgrade r() = system reset *_init() obecná inicializace, příprava, většinou vytváří instanci objektu, se kterou dále pracujeme (instance má metody a vlastnosti definované objektem) d7 = disp7_init() o = oled_init() d2 = lcd2_init() time_init() s1 = servo_init() temp = temp_init() ... rychlý "init" a datová struktura o inicializovaných objektech: >>> octopus_init() provede init se všemi nastavenými periferiemi podrobněji budeme průběžně doplňovat nápovědu na našem webu: https://www.octopuslab.cz/micropython-octopus-help/
----------------------------------------------------- ukázky v adresáři examples? >>> ls("examples") stručný výběr: stopky, hodiny, pong, deep sleep, ... spuštění? například hodiny: >>> import examples.clock předpokládá v setup() inicializaci displeje (disp7) a spuštěný octopus() nastavení aby běželo po startu: file_copy("examples.clock") přesune soubor do man.py
V příštím díle vás kromě jiného seznámíme i s naším jednoduchým web-editorem. Kdy v ESP běží web-server, ESP může být i AP (wifi access point) a ve webovém prohlížeči pomocí velmi jednoduchého editoru (skoro až IDE – integrated development environment) můžete kód vytvářet, editovat, spouštět… pro základní testy, výuku a rapid prototyping ideální.
https://www.octopuslab.cz/micropython-octopus/
https://www.octopuslab.cz/workshop-micropython1/
https://www.octopuslab.cz/workshop-micropython2/
https://www.octopuslab.cz/workshop-micropython3/
https://www.octopuslab.cz/micropython-web-ide/
https://www.octopuslab.cz/micropython-octopus-help/