Sdílejte nás



RSS feeds

OctopusLab - workshop micropython - 2. dílTisk

- 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.



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í.
Zatím nikdo nekomentoval. Buďte první kdo vloží svůj komentář.

Přidat komentář

Pro přidání komentáře musíte být přihlášený.

Upozornění

Administrátor těchto stránek ani autor článků neručí za správnost a funkčnost zde uvedených materiálů.
Administrátor těchto stránek se zříká jakékoli odpovědnosti za případné ublížení na zdraví či poškození nebo zničení majetku v důsledku elektrického proudu, chybnosti schémat nebo i teoretické výuky. Je zakázané používat zařízení, která jsou v rozporu s právními předpisy ČR či EU.
Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva.
Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ.