IoT prakticky: Python na ESP32 IV, knižnica octopus na obsluhu hardvéru a komunikácie

ESP 32 je plnohodnotná IoT platforma pretože umožňuje priame pripojenie k internetu cez WiFi. Aby ste mohli využívať WiFi pripojenie, potrebujete nastaviť pripojenie k WiFi routeru.

Predpokladáme, že máte nainštalovanú implementáciu Micropythonu od octopusLab.cz. Postup je popísaný v tomto článku.

Link na stiahnutie binárky Micropythonu. Pripomíname, že Python je interpretačný jazyk, takže zdrojový kód sa nekompiluje, ale priamo vykonáva.

Celý postup inštalovania a konfigurovania knižnice je vo videu:

Micropython od octopuslab.cz má implementovanú zjednodušenú inicializáciu systému pomocou príkazu:

octopus_initial.setup()

Po zadaní príkazu cez terminálovú aplikáciu, vo Windows odporúčame PuTTY sa zobrazí ponuka funkcií inicializačného menu:

>>> octopus_initial.setup()
      ,'''`.
     /      \
     |(@)(@)|
     )      (
    /,'))((`.\
   (( ((  )) ))
   )  \ `)(' / (
 
Hello, this will help you initialize your ESP
ver: 0.1/ 13.8.2019 (c)octopusLAB
Press Ctrl+C to abort
 
==============================
        S E T U P
==============================
[w]   - wifi submenu
[cw]  - connect wifi
[cl]  - connect LAN
[sd]  - system download
[x]   - exit setup
==============================

Na pripojenie k WiFi je potrebné najskôr zadať SSID siete a prístupové heslo.  Zadajte príkaz:

w

Zobrazia sa informácie o wifi ovládači a ponuka menu pre nastavenie WiFi

I (59970) wifi: wifi driver task: 3ffe2eb4, prio:23, stack:3584, core=0
I (66468) system_api: Base MAC address is not set, read default base MAC address ... 
==============================
        S E T U P - W I F I
==============================
[a]  - Add wifi network
[r]  - Remove wifi network
[s]  - Show configuration
==============================

Vašu WiFi sieť pridáte do konfigurácie príkazom

a

Budete vyzvaní, aby ste zadali SSID a heslo vašej siete.

Po zadaní týchto údajov sa znovu zobrazí ponuka menu SETUP

==============================
        S E T U P
==============================
[w]   - wifi submenu
[cw]  - connect wifi
[cl]  - connect LAN
[sd]  - system download
[x]   - exit setup
==============================

Príkazom

cw

sa pripojíte k WiFi sieti. Zobrazia sa informácie o parametroch pripojenia a úspešné pripojenie bude potvrdené oznamom

WIFI: OK

Keď máte pripojenie k internetu úspešne inicializované, môžete pristúpiť k ďalšiemu kroku – inštaláciu knižnice octopus

V menu SETUP zadajte príkaz [sd]  – system download.

sd

Postupne sa nainštalujú knižnice a zobrazí sa zoznam nainštalovaných komponentov a výzva, aby ste príkazom CTRL-D urobili soft reset dosky.

all OK, press CTRL+D to soft reboot
>>> 
MPY: soft reboot
MicroPython v1.11-495-g1ce700d44-build-octopusLAB on 2019-10-22; ESP32 module with ESP32
Type "help()" for more information.

O úspešnom nainštalovaní knižnice sa presvedčíte tak, že zadáte príkaz

setup()

a zobrazí sa vám rozšírená ponuka konfiguračného menu SETUP.

>>> setup()
      ,'''`.
     /      \
     |(@)(@)|
     )      (
    /,'))((`.\
   (( ((  )) ))
   )  \ `)(' / (
 
Hello, this will help you initialize your ESP
ver: 0.65 / 22.8.2019 (c)octopusLAB
Press Ctrl+C to abort
 
==============================
        S E T U P
==============================
[w]   - wifi submenu
[cw]  - connect wifi
[cl]  - connect LAN
[sd]  - system download > stable octopus modules from URL
[sde] - system download > examples (from URL) /[sdh] hydroponics
[sdp] - system download > petrkr (Beta octopus modules from URL)
[sdo] - system download > octopus (Alfa octopus modules from URL)
[ds]  - device setting
[ios] - I/O setting submenu
[mq]  - mqtt() and sending data setup
[si]  - system info
[wr]  - run web repl
[x]   - exit setup
==============================
select:

Zobrazí sa menu s ponukou možností. Napríklad ak potrebujete nakonfigurovať  vstupy a výstupy zadáte príkaz: ios. Zobrazí sa ponuka v ktorej zapínate, alebo vypínate jednotlivé porty a komunikačné rozhrania. Číslo určuje počet zariadení. Napríklad ak máte v sérii zaradené štyri diódy Neopixel nastavíte ws [4]

I/O setting:
==================================================
        S E T U P - I / O    (interfaces)
==================================================
[ 1] -      led [0] - built in LED diode
[ 2] -       ws [0] - WS RGB LED 0/1/8/...n
[ 3] -   piezzo [0] - Piezzo buzzer
[ 4] -     led7 [0] - SPI max 8x7 segm.display
[ 5] -     led8 [0] - SPI max 8x8 matrix display
[ 6] -     oled [0] - I2C oled display
[ 7] -      lcd [0] - I2C LCD 0/2/4 row
[ 8] -      tft [0] - SPI 128x160 color display
[ 9] -       sm [0] - UART - serial monitor (display)
[10] -     temp [0] - temperature Dallas sens.
[11] -    light [0] - I2C light sens. (lux)
[12] -     mois [0] - A/D moisture sensor
[13] -    cmois [0] - A/D capacit. moisture sensor
[14] -      ad0 [0] - A/D input voltage
[15] -      ad1 [0] - A/D x / photoresistor
[16] -      ad2 [0] - A/D y / thermistor
[17] -     exp8 [0] - I2C+expander PCF8574
[18] -   keypad [0] - Robot I2C+expander 4x4 keypad
[19] -   button [0] - DEV2 Button
[20] -       ir [0] - DEV2 ir remote
[21] -      fet [0] - MOS FET PWM (IoTboard)
[22] -    relay [0] - Relay (IoTboard)
[23] -    servo [0] - PWM pins (both Robot and IoT have by default)
[24] -  stepper [0] - Stepper motor (ROBOTboard)
[25] -    motor [0] - DC motor (ROBOTboard)
[x]  - Exit from I/O setup
==================================================
select:

Pokročilejší hardvér typu displej a komunikačné rozhrania zatiaľ necháme bokom (nie na dlho) a skúsime jednoduchú  obsluhu GPIO portu, konkrétne GPIO2 na ktorom je pripojená modrá LED dióda umiestnená priamo na doske. Takže v menu I/O settings nastavíme položku 1 – LED diódu na doske

==================================================
        S E T U P - I / O    (interfaces)
==================================================
[ 1] -      led [1] - built in LED diode
...

Príkazom

from util.octopus import *

sa do pamäti importujú triedy s metódami na obsluhu hardvéru, ktorý používate. Čiže ak máte cez príkaz ios nastavenú konfiguráciu hardvéru

==================================================
        S E T U P - I / O    (interfaces)
==================================================
[ 1] -      led [1] - built in LED diode
[ 2] -       ws [4] - WS RGB LED 0/1/8/...n
[ 3] -   piezzo [0] - Piezzo buzzer
[ 4] -     led7 [1] - SPI max 8x7 segm.display
[ 5] -     led8 [0] - SPI max 8x8 matrix display
[ 6] -     oled [1] - I2C oled display
...

Importujú sa objekty na obsluhu LED diódy, RGB LED diódy Neopixel, displeja zo sedem segmentových číslic a OLED displeja pripojeného cez I2C. Takáto dynamická konfigurácia umožňuje, aby ste v pamäti mali len tie objekty, ktoré vo svojom kóde využívate

V kóde ale import s hviezdičkou nepoužívajte, tam treba uviesť zoznam knižníc, napríklad

>>> from util.octopus import w, web_server

Pred použitím je potrebné knižnicu Octopus inicializovať príkazom:

octopus()

Terminál zobrazí informáciu o úspešnom inicializovaní knižnice. Výpis obsahuje aj informáciu o voľnej kapacite pamäti RAM. V našom prípade máme k dispozícii približne 77 kilobajtov.

Device config 'config/device.json' does not exist, please run setup()
octopus() --> autoInit: WARN: Pin is None, this led will be dummy
 
 
           ,'''`.
          /      \
          |(@)(@)|
          )      (
         /,'))((`.\
        (( ((  )) ))
        ) \ `)(' / (
 
(octopusLAB - lib.version: 0.95 > 28.10.2019 #1063)
--------------------------------------------------
| ESP UID: 240acxxxxxx | RAM free: 77056 | 00:23
--------------------------------------------------
This is basic library, type h() for help
>>>

Zoznam tried, ktoré sú aktuálne k dispozícii vypíšete príkazom TAB (klávesom tabulátor)

__class__       __name__        map             Pin
RTC             Timer           gc              modules
r               reset           sleep           sleep_ms
ticks_diff      ticks_ms        uos             bdev
setup           w               octopusASCII    printOctopus
f               ls              cat             i
octopus         pinout          set_pinout      get_from_file
rtc             io_conf         Env             tim1
getVer          get_eui         printInfo       getFree
get_hhmm        o_help          printTitle      h
o_info          printLog        u               file_copy
cp              i2c_init        clt             c
printHead       bytearrayToHexString            add0
get_hhmmss      timer_init      timerAction     led
ap_init         w_connect       lan_connect     logDevice
database_init   time_init       getApiJson      getApiTest
getApiText      octopus_init    Led             piezzo
small_web_server                web_server      Octopus
>>>

Vyskúšajme fungovanie knižníc. Podobne ako v predchádzajúcom dieli, aj teraz najskôr rozsvietime modrú LED diódu, ktorá je priamo na doske a je pripojená k pinu GPIO2. Tentokrát však budeme LED diódu na doske pomocou funkcií z objektovo orientovanej knižnice Octopus.

Príkaz vytvorí inštanciu objektu LED

led = Led(2)

Na rozsvietenie diódy je potrebné zadať príkaz:

led.value(1)

Príkaz toggle() prepne stav LED, takže ak je zhasnutá, tak sa rozsvieti a naopak

led.toggle()

Na bliknutie LEDkou môžete použiť funkciu,  kde parametre sú čas svietenia a čas vypnutia v milisekundách.

while True:
  led.blink(1000,500)

Ak chcete vedieť na ktorý pin je pripojený objekt LED, zistíte to príkazom

>>> led.pin
Pin(2)

Ak máte LED diódu pripojenú na porte, napríklad GPIO15, inicializujete ju príkazom

led2 = Led(15)
led2.value(1)

Python je objektovo orientovaný programovací jazyk. Na výpis metód a premenných objektu stačí napísať názov objektu, za ním bodku a stlačiť kláves TAB. Kláves TAB slúži ako určitý ekvivalent inteligentnej nápovedy. Stačí začať písať príkaz a po zatlačení TAB sa vypíše celý názov.

>>> led.
__class__       __init__        __module__      __qualname__
value           __dict__        pin             blink
toggle          state

V našom prípade sú vypísané metódy a premenné objektu LED.

Ukážeme príklad pre obsluhu sedem segmentového displeja, pripojeného cez SPI. Displej má sériový driver MAX7219 a je zložený z dvoch modulov po 4 znaky, spolu je teda možné zobraziť 8 znakov. V príklade sme displej pripojili do slotu na doske ROBOTboard od octopuslab.cz,

popis rozhraní dosky ROBOTboard je zde.

ale nakoľko displej sa pripája pomocou štyroch pinov, v budúcom dieli ukážeme jeho zapojenie na prepojovacom poli podľa tejto schémy:

Najskôr pomocou príkazu [ds]  – device setting nastavíme mapovanie pinov pre konkrétnu vývojovú dosku.

ds

V našom prípade pre dosku ROBOTboard nastavíme voľbu 5. Túto voľbu budeme používať aj keď budeme v budúcom dieli realizovať zapojenia elektornických komponentov na prepojoovacom poli. Mapovanie pinov pre túto konfugurácii nájdete zde.

Displej je potrebné inicializovať príkazom disp7_init().  Príkaz nainicializuje komunikačné rozhranie SPI a odovzdá inštanciu objektu d7.

d7 = disp7_init()

Môžete zobraziť číslo.

d7.show(3.1415926)

Alebo aj textový reťazec, pretože na 7 segmentovom displeji sa dá zobraziť aj hodne písmen, avšak nie všetky. My sme sa pokúsili zobraziť text

d7.show("PCREVUE")

Jednotlivé segmenty znakov sú v knižnici interne adresované takto:.

>>> led.
__class__       __init__        __module__      __qualname__
value           __dict__        pin             blink
toggle          state

Bodka za číslom má kód 128.

Takže program pre blikajúcu pomlčku segmentu bude

while True:
  d7.set_register(5,1)
  sleep(1)
  d7.set_register(5,0) 
  sleep(1)

bodku rozblikáte pomocou kódu

while True:
  d7.set_register(5,1)
  sleep(1)
  d7.set_register(5,0) 
  sleep(1)

V budúcom pokračovaní ukážeme obsluhu ďalších hardvérových komponentov a komunikačných rozhraní a ukážeme ako môže doska ESP 32 fungovať ako webový server.