Toto je starší verze dokumentu!
Obsah
ESP32 + vysilac 433 MHz + powerbanka (jako zalozni nebo pro pripady, kdy neni zadny reakcni prvek - napr. bezpecnostni system). Pokud neni aktivni hra a ESP32 spi. Stejne jako reakcni prvky se probouzi kazdych cca 10 minut a overuje, jestli neni dostupna WIFI specifickeho jmena. Pokud ji najde, prepina se do rezimu aktivni hry, kdy je po celou dobu zapnute radio WIFI a ESPNow. V pripade, ze ridici system rozhodne o zmene reakcnich prvku, posle se tato informace na 433 MHz do reakcnich prvku a pocka se na overujici zpravu po ESPNow.
Centrala muze snadno kontrolovat dosah zprav od senzoru na 433 MHz - vzdy musi prijit kopie zprav od vsech reaknich prvku.
Centrální řídící jednotka stanoviště
Na každém stanovišti je potřeba k jednotlivým čidlům a akčním prvkům přidat řídicí logiku, t.j. co se má stát za jaké situace. Může jít o nějaký jednoduchý stavový automat nebo o nějaké mnohem složitější řízení.
Konkrétní implemetace řídící jednotky je zcela v rukou tvůrce hry a není nijak omezena, tzn. kompletní software řídící jednotky je možné vytvořit s použitím připravených podpůrných knihoven pro komunikaci. Software je možné i vzdáleně přehrát z notebooku, případně i přes mobilní aplikaci a datové připojení hráče, pokud k tomu poskytne souhlas.
Navíc je také k dispozici referenční a otevřená implementace s řízením implementovaným nad SQLite databází. Čidla a akční prvky mají předdefinované stavové tabulky a změna hodnot v těchto tabulkách znamená změnu stavu čidla, resp. spuštění nějaké akce. Databázi je možné také libovolně rozšiřit a implementovat tak vnitřní stavy logiky řízení.
Hardware pro řídící jednotku stanoviště je také otevřeně k dispozici. Je postaven na čipu ESP32 s připojenou větší baterii a solárním panelem, protože tento čip na rozdíl od čidel a reakčních prvků musí pracovat po celou dobu hry (přesněji po většinu doby hry, jak bude popsáno dále prediktivní modely strojového učení umožní z historie průběhů hry automaticky určovat očekávanou dobu příští komunikace pro aktuální stav hry a tedy i tento čip bude možné uspávat a šetřit tak energii i v průbehu hry).
Možné implementace centrály:
- „Odlehčená“ centrála implementovaná na AVR. K aktuátoru se přidá vysíláč na RF 433 MHz a řídící logika se může naimplementovat přímo v AVR. Nevýhoda je absence logování a složitá komunikace s mobilem hráče (přes ESP01)
- Centrála s řídící logikou v Pythonu na ESP32. Lze využít i v kurzech programování např. k výuce OOP na školách
- Řídící logika stanoviště řízená vzdáleně přes MQTT server, např. s implementací v NodeRed
Centrala s micropythonem
Pro implementaci ridiciho systemu v pripade, ze akceptujeme fakt, ze centrala pobezi behem cele hry, muzeme vyuzit MicroPython.
Port MicroPythonu pro ESP32 je implementovany primo nad ESP-IDF od Espressifu.
Nez je mozne MicroPython prelozit, je potreba nejprve nainstalovat ESP-IDF toolkit. Na Linuxu je to snadne, staci stahnout cely projekt z GITu a spustit instalacni skript. Vsechny potrebne nastroje se nainstaluji do domovskeho adresare .espressif aktualne prihlaseneho uzivatele.
ESP-IDF je postavene nad Pythonem a v adresari stazeneho gitu staci spustit virtualni prostredi skriptem . ./export.sh.
https://github.com/micropython/micropython
Postup instalace:
# Stahneme vyvojove prostredi pro ESP32
git clone -b v4.2 --recursive https://github.com/espressif/esp-idf.git
# spustime instalacni skript, ktery stahne nastroje na kompilaci do ~/.esspresif
# Pozor: pred instalaci muze byt potreba, aby "python" a "pip" spousteli aktualni python3
cd esp-idf
./install.sh
# Stahneme Micropython s rozsirenim espnow, ktere zatim neni soucasti master vetve
git clone https://github.com/glenn20/micropython.git
# Checkout do vetve s cerstvym kodem espnow
git checkout espnow-g20
# Provedeme rebase na aktualni master puvodniho projektu https://github.com/micropython/micropython
git remote add origo https://github.com/micropython/micropython
git fetch origo
BASEHASH=`git merge-base espnow-g20 origo/master`
git rebase -i ${BASEHASH}
# Pripravime si kontext pro preklad
cd esp-idf
. ./export.sh
cd micropython
# Prelozime lokalni kompilator mpy souboru
cd mpy-cross
make
# Do adresare ports/esp32/modules pridame modul mqtt.py
# a nakonec prelozime port esp32
cd ../ports/esp32
make submodules
make
# Flashneme vygenerovany firmware
make erase
make deploy
# Uploadneme boot.py
esp32python/upload-ampy.sh
# Spustit fw server
esp32python/fw_server.sh
# instalace knihoven
picocom -b 115200 /dev/ttyUSB0
import upip
upip.install("shutil")
upip.install("urequests")
import machine
machine.reset()
Nasledne nastrojem ampy staci poprve nahrat soubory boot.py a dalsi, ktere se automaticky spousti po restartu. Nasledne uz je jsou tyto python soubory aktualizovany automaticky pri kazdem restartu z definovaneho serveru.
Pridani noveho modulu do firmwaru
pridat soubor implementace modulu do adresare ports/esp32/modiles.c:
#include <stdio.h>
#include <string.h>
#include "py/runtime.h"
STATIC mp_obj_t iles_info(void)
{
mp_printf(&mp_plat_print, "informace o projektu iles\n");
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(iles_info_obj, iles_info);
STATIC const mp_rom_map_elem_t iles_module_globals_table[] = {
{MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_iles)},
{MP_ROM_QSTR(MP_QSTR_info), MP_ROM_PTR(&iles_info_obj)},
};
STATIC MP_DEFINE_CONST_DICT(iles_module_globals, iles_module_globals_table);
const mp_obj_module_t iles_module = {
.base = {&mp_type_module},
.globals = (mp_obj_dict_t *)&iles_module_globals,
};
MP_REGISTER_MODULE(MP_QSTR_iles, iles_module, 1);
Pridat modul do konfiguracniho souboru mpconfigport.h:
#define MICROPY_PORT_BUILTIN_MODULES \
{MP_OBJ_NEW_QSTR(MP_QSTR_esp), (mp_obj_t)&esp_module}, \
{MP_OBJ_NEW_QSTR(MP_QSTR_esp32), (mp_obj_t)&esp32_module}, \
{MP_OBJ_NEW_QSTR(MP_QSTR_utime), (mp_obj_t)&utime_module}, \
{MP_OBJ_NEW_QSTR(MP_QSTR_uos), (mp_obj_t)&uos_module}, \
{MP_OBJ_NEW_QSTR(MP_QSTR_usocket), (mp_obj_t)&mp_module_usocket}, \
{MP_OBJ_NEW_QSTR(MP_QSTR_machine), (mp_obj_t)&mp_module_machine}, \
{MP_OBJ_NEW_QSTR(MP_QSTR_network), (mp_obj_t)&mp_module_network}, \
{MP_OBJ_NEW_QSTR(MP_QSTR__onewire), (mp_obj_t)&mp_module_onewire}, \
{MP_OBJ_NEW_QSTR(MP_QSTR_iles), (mp_obj_t)&iles_module},
Pridat module do zdrojaku ke kompilaci v ports/esp32/main/CMakeLists.txt:
set(MICROPY_SOURCE_PORT
....
${PROJECT_DIR}/modiles.c
)
Nasledne v adresari portu: make a make flash. Potom uz lze modul vyuzivat v Pythonu:
import iles iles.info()
Adresy zarizeni:
- bity 0-3 - adresa senzoru (odesilatel)
- bity 4-7 - adresy aktoru (prijemce)
V ESPNow komunikaci bude vyplnena adresa senzoru i aktoru, ktery zpravu preposila.
Centrála s řízením v NodeRed
V případě, že je během hry dostupný přístup k Internetu, např. přes mobilní připojení hráče, je možné hru ovládat i vzdáleně pres NodeRed někde na serveru. Události z centrály jsou zasílány via MQTT do NodeRed a NodeRed přes MQTT posílá přes centrálu příkazy aktuátorům na stanovišti.
Pripojeni k Internetu lze pridat k ESP32 napr. pomoci SIM800L
Ukazka rizeni v NodeRed:
Řešení napájení
Akumulátor 6V
Nejjednoduší je napájení centrály olověným akumulátorem, např. Bezúdržbový olověný akumulátor 6 V/7 Ah Emos s přidaným lineárním regulátorem na 3.3 V, např. 7333.
Powerbanka
Kdyz pracuje ESP32 „na plny vykon“ vcetne WIFI a prijimace RF 433, tak udrzi powerbanku pustenou - je to dostatecny odber. Jakmile se ale vypne radio, dlouho neprobiha prijem zprav na RF 433 MHz nebo se dokonce aktivuje deepsleep, tak po 20s vypne.
Kdyz ale v dobe, kdy je napajeni z powerbanky vypnute na chvili rozpojime cerveny kablik v USB a zase ho spojime, tak se ta udalost rozpozna jako nove pripojeni zarizeni a powerbanka sama zase sepne.
Pokud se stiskne behem aktivniho napajeni tlacitko na boku powerbanky, odlozi se odpocitavani uspani o dalsich 20 s bez ohledu na odber.
Pro zajisteni odberu alespon 50 mA pri napeti 5 V staci pridat LEDku s vhodnym odporem - je treba jen par mA navic s ledkou by slo navic blikat, aby se jeste snizil odber.
Auto power off jde vyuzit na odpojeni centraly mimo hru a pravidlene probouzeni cca jednou za 10 minut. Staci k tomu navic pridat 2 AA baterky, ATTINY13 a male relatko, se kterym ATTINY13 kazdy deset minut cvakne, pokud nebude ESP32 nazivu, coz se dovi treba pres nejake GPIO, ktery mu ESP32 nahodi do 1.
Mozna by to slo pouzivat i pro nizko odberova zarizeni, kde bude nejaky vetsi kondenzator, ktery bude zivit to zarizeni v dobe, kdy se powerbanka rozhodne to vzdat a soucasne v te dobe z poslednich sil muze zkusit pres nejaky mosfet rozepnout to napajeni, aby se powerbanka zase probudila?
TODO:
- ESP32, ESP8266: seznam WIFI siti - jako dlouho to trva / kolik to sezere energie
- Vysilani na 433 MHz na centrale
Univerzální deska prvků hry:
- ATTINY84
- přijímač 433 MHz
- vysílač 433 MHz
- ESP01 - může být přímo připojen i k přijímači - běží jen krátkou dobu při programování nebo potvrzování přijetí zprávy - spouští se (reset) na základě komunikace na RF433 nebo připojeného čidla
Centrála:
- přijímač 433 MHz
- vysílač 433 MHz
- ESP32 - může běžet po celou dobu hry - aktivuje se přítomností mobilní sítě nebo po příjetí zprávy na 433 jako odpovědi na dotaz po 433. Radio WIFI je ale většinu času vypnuté, aktivuje se jen při odeslání zprávy a čekání na potvrzení přijetí anebo při příjetí zprávy a její potvrzení. Případně v době, kdy se komunikuje s mobilním telefonem.

