OctopusLab – workshop micropython – 2. díl

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

Sdílejte článek:

Související články

Toto je první díl ze tří – úvodního kurzu Micropython na ESP32.

– Změny v Micropythonu si vynucují změnu octopus() – Opakování a podrobnější doplnění – LED – nejjednodušší knihovna pro testování – web_server() – Webový editor IDE (integrated development environment) – Některé další vychytávky – Drobné projekty – examples V minulých…

OctopusLAB (komunitní projekt české společnosti Octopus engine s.

V Octopus LAB (sledujte nás na FB) jsme se poslední dobou hodně soustředili na ESP32 ve spojení s Micropythonem.

Nová generace kutilů, bastlířů (makerů a geeků) Během několika posledních let jsme měli možnost setkat se s učiteli, vedoucími elektrokroužků i s mladými zájemci o elektroniku a moderní technologie.