workshop-micropython2

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

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





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


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/