OctopusLab - workshop micropython - 2. díl
- September 02 2019
- OctopusLab
- 1852x Přečteno
- 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.
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.
Dokument pdf ke stažení > https://www.octopuslab.cz/download/robot-letak-a3-201811.pdf
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.
Nástin struktury spolupracujících knihoven, modulů a ukázkových projektů
Po stažení a nahrání Micropythonu se
1. provede nastavení wifi a stažení octopus.tar
2. nastavení zařízení, vstupů a výstupů
3. možnost využít web_editoru (nadstavba webreplu)
Nastavení zařízení a periferií
setup() a co z něj budeme potřebovat
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
Sedmisegmentový (disp7) Maticový 8×8 (disp8) oled 128×64 a menší oled 128×32
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
RobotBoard s teploměrem a I2C LCD displejem
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 řetězce https://pyvec.github.io/cheatsheets/strings/strings-cs.pdf
seznamy 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
Octopus Editor
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í.