Escape rooms (únikové hry) majú nespočet hier a spôsobov ich riešenia. Niektoré sú viac logické, iné viac intuitívne a líšia sa aj v náročnosti riešení. Čím ďalej, tým sú viac kreatívne a vyžaduje sa aj pri návrhu systému, aby boli dostatočne intiutívne bez ohľadu na vek účastníkov hry. Dnes si ukážeme jeden systém pre Escape room, ktorý bude združovať audio, NFC prvky.
Vo výslednej aplikácii bude žiadúce zariadenie, ku ktorému môže hráč priložiť NFC tag, ktorý našiel pri vyriešení predchádzajúce hry v šuflíku, alebo sejfe. Daný NFC tag je vo forme karty, ktorá má jednu stranu z nerezovej ocele a druhá strana je plastová, z ktorej je ho možné načítať. Na samotnej karte môžu byť laserom vygravírované inštrukcie, ktoré užívateľa navedú na jej správne použitie. Po načítaní NFC tagu sa prehrá jedna z dostupných zvukových nahrávok, ktorá je uložená v zariadení. Po opätovnom priložení NFC tagu sa prehrá znova rovnaká stopa. Dĺžka stopy je pár sekúnd.
Stopa obsahuje nahrávku, ktorá obsahuje kombináciu hudobných nástrojov. Cieľom vyriešenia úlohy bude prostredníctvom potenciometrov nastaviť hudobné nástroje, ktoré používateľ počuje z nahrávky. Pri splnení úlohy sa prehrá víťazná stopa, ktorá hráčovi oznámi, kde nájde ďalšiu inštrukciu, alebo ho navedie na pokračovanie, či ukončenie hry. Systém bude odsahovať 3 potenciometre, pričom každý z nich bude mať 4 identické polohy (výseky), kde budú môcť nastaviť jeden z 3 nástrojov, alebo žiadny.
Jednotlivé nástroje budú zvýraznené znakmi okolo potenciometra. Potenciometre budú rozdelené podľa typu nástrojov, napr.:
- sláčikové (husle, kontrabas, viola)
- dychové (fagot, saxofón, píšťala)
- klávesové (klavír, akordeón, čembalo)
- komparzné (bubon, činely tamburína) - aktuálna implementácia nepoužíva, možné rozšírenie
Potenciometer bude softvérovo rozdelený na sektory, kde bude môcť používateľ vybrať napríklad jeden z troch nástrojov v prislúchajúcom výseku, ale nevybrať žiaden, ak potenciometer nechá v najspodnejšej polohe. Jeden potenciometer obsluhuje vždy len svoju kategóriu nástrojov: klávesové, dychové, sláčikové.


Voľba hardvéru:
ESP32 - mikrokontróler od Espressif Systems som nevybral náhodou. Bude mať vzhľadom na túto aplikáciu dôležité úlohy. WiFi konektivita sa môže využiť na OTA update skrz WLAN i LAN sieť, nakoľko zariadenie bude uzavreté v ovládacom paneli. Jednou z najdôležitejších vecí bude jeho hardvérová I2S zbernica, ktorá je určená pre prenos audio dát. Na túto zbernicu bude pripojený zosilňovač, ktorý je zároveň DAC prevodníkom pred reproduktorom.

Má SPIFFS súborový systém, ktorý je možné veľkostne meniť. Preddefinovaný filesystém má 1,5 MB pre štandardnú predvolenú schému partícii pre 4 MB flash s dvoma OTA partíciami po 1,2 MB. Do tohto súborového systému je možné nahrať vlastné nahrávky. Najlepší formát audia bude .wav, je však možné použiť aj napríklad .mp3, ale je ho nutné dekódovať. 16-bit PCM WAV je priamo kompatibilný aj s použitým zosilňovačom, teda odpadá akýkoľvek processing signálu.
MAX98357 - mono 3W zosilňovač a DAC prevodník. Obsahuje aj svorkovnicu na pripojenie reproduktora

Reproduktor - 2W 8Ω 20x30x6.8mm

PN532 - NFC čítačka s dobrým dosahom 4-8 cm na základe verzie V3 alebo V4. Pripojenie cez I2C

NFC karta - s NTAG213 (NFC 13.56 MHz)

Potenciometre - 3x B10K

Aké výzvy sú očakávané pri riešení projektu?
Audio nebude zložité. Prakticky tam nie je čo pokaziť. Určite bude problémom presnosť natočenia potenciometrov voči prečítanému napätiu skrz ADC. ESP32 nemá úplne lineárnu krivku závislosti svojej nameranej 12-bit ADC hodnoty k reálnemu napätiu. Preto nie je možné úplne rozsah rozdeliť na 4 totožné časti bez softvérovej úpravy. Najdostupnejšie ESP32 dosky s WROOM-32 modulom majú uložené korekčné dáta pre ADC krivku vo svojej eFuse pamäti. ESP32 má na toto priamo funkciu, avšak ide o low-level ESP-IDF funkcie.
Pre Arduino Core existuje knižnica ESP32AnalogRead od Kevina Harringtona. Knižnica je super aj v tom, že dokáže priamo vrátiť napätie v milivoltoch. V Arduino Core treba štandardne vychádzať z ADC hodnoty, ktorú je treba prepočítavať na milivolty, kde treba zohľadňovať aj bitové rozlíšenie prevodníka.Takto sa to dá získať zavolaním jednej funkcie. Knižnice je kompatibilná aj pre S2, i S3 verziu ESP32. Po tejto korekcii bude potenciometer fungovať lineárne v celom napäťovom rozsahu ADC prevodníka, teda teoreticky vieme mať viacero rovnakých častí s ekvivaleným napäťovým rozsahom.
Z pohľadu napätia a ekvivalentného rozdelenia na sektory pre výber to bude:
- Žiadny nástroj: 0 – 1023, (0 – 825 mV)
- Prvý nástroj: 1024 – 2047, (826 – 1650 mV)
- Druhý nástroj: 2048 – 3071, (1651 – 2475 mV)
- Tretí nástroj: 3072 – 4095, (2475 – 3300 mV)
Linearita ADC pred korekciou (červená), po korekcii (modrá):

ESP32 má dva ADC prevodníky, ktoré majú svoje kanály, ku ktorým sú pripojené konkrétne GPIO. ADC2 má ale limitácie a to, že nefunguje, ak sa používa WiFi mikrokontroléra. V takom prípade na pine nameriate hodnotu ADC 0 bez ohľadu na napätie na ňom. I2S piny týmto nie sú ovplyvnené, i keď sú mapované na GPIO (kanály 8 a 9) ADC2 prevodníka. Potenciometre teda nemôžeme použiť na GPIO: 4, 0, 2, 15, 13, 12, 14 ,27, 25, 26 z dôvodu aktívnej WiFi! Pre potenciometre využijeme ADC1 prevodník a jeho kanály s týmito GPIO: 32, 33, 34, 35. Aktuálnu pozíciu potenciometra môže používateľ vidieť na základe krytky, ktorá obsahuje integrovanú šípku. Potenciometer má lineárny chod a nemá kroky (X stabilných polôh), teda vybraný nástroj bude aktívny v celom sektore, ktoré je mu určený.

Implementácia:
SPIFFS filesystém máme k dispozícii navolením príslušnej tabuľky partícii, ktorý ho zahŕňa. Potrebujeme ale zapísať dáta do tohto filesystému. Na toto je nutné doinštalovať nástroj ESP32 Filesystem Uploader. Nástroj je potrebné nakopírovať to zložky C:/..../Documents/Arduino/tools.
Následne po reštarte Arduino IDE sa nástroj zobrazí v ponuke Tools. Rovnako tak v projekte s .ino súborom sa automaticky vytvorí zložka data. Do tejto zložky nakopírujeme .wav súbory s konkrétnymi nahrávkami. Následne skrz Tools nahrajeme tieto súbory do SPIFFS filesystému ESP32. Zápis do SPIFFS funguje prepisovaním priestoru, teda ak už máte niečo uložené v SPIFFS napríklad z iného projektu, čo ste neobsiahli do zložky data, prídete o to. SPIFFS taktiež neumožňuje používať priečinky. Všetky súbory musia byť na rovnakej úrovni hĺbky priečinka v "root".

Nahrajeme potrebný počet nahrávok, .wav súborov, pričom každý z nich obsahuje svoju sadu hudobných nástrojov. Rovnako tak nezabudneme na výhernú .wav stopu, ktorá sa ozve, ak hráč navolí nástroje správne, čím sa vyhodnotí táto úloha za splnenú priamo softvérom zariadenia. Okrem hudby tam môže byť zahrnutá ja hlasová inštrukcia, ktorá hráčovi oznámi výhru a ako pokračovať ďalej.
ESP32 samo o sebe nevie, aké nástroje sa v konkrétnej nahrávke vyskytujú. Preto je nutné softvérovo nastaviť požadované pravidlá prislúchajúce ku konkrétnym názvom .wav stôp, ktoré budú slúžiť ako referencia.
ESP32 môže mať implementované aj rôzne prevádzkové režimy, napr. herný a potom neherný (relaxačný), ktorý môže prehrávať inú hudbu, ktorá bude tiež obsiahnutá do SPIFFS súborového systému, či dokonca internetové rádio prakticky z celého sveta, nakoľko má ESP32 konektivitu do internetu (treba ale PSRAM na vyššie bitraty streamov). Ak by bol dostupný audio stream aj v LAN sieti, ESP32 by ho mohlo taktiež prehrať cez reproduktor. Prepínanie režimov môže prebiehať na základe digitálnych vstupov, UDP správ po sieti a podobne (aj skrz prehliadač, ak by bol implementovaný webserver na ESP32).
NFC čítačka PN532 (NXP) je veľmi ľahká na implementáciu. Použitie I2C zbernice vyžaduje len 2 dátové vodiče, postačuje štandardná I2C rýchlosť na 100 kHz. Aby čítačka fungovala v I2C režime, je nutné prepnúť DIP prepínač na polohu 1 0, nakoľko v default stave 0 0 je v UART móde. Výborný komponent s vysokou spoľahlivosťou. Oproti MFRC522 násobný dosah, podpora NFC. Určite odporúčam aj do RFID projektov s MiFare 1K.
Z pohľadu programovej implementácie môžeme reagovať na NFC kartu po priložení na základe jej UID, alebo môžeme prečítať aj jej obsah, kde môže byť nahratý NDEF záznam napríklad aj s konkrétnym názvom súboru, ktorý má byť prehratý. Teda obsluha Escape roomu pri príprave miestnosti dá do hry jednu z X kariet (ich počet bude odpovedať počtu nahrávok), teda použije sa vopred známa nahrávka a nebude zvolená náhodne.
Implementácia s MAX98357 bude používať knižnicu Audio (ESP32-audioI2S) s podporou I2S. Táto knižnica je naozaj objemná. Pri kompilácii s minimálnym programom pre prehrávanie internetového rádia, alebo súboru zo SPIFFS program zaberá skoro 1,4 MB, čo prekračuje veľkosť partície aplikácie v štandardnej tabuľke partícii. Z toho dôvodu je nutné použiť inú, poprípade aj bez OTA (Huge APP s 3 MB priestorom pre aplikáciu a 1 MB priestorom pre SPIFFS oddiel).

Iné možnosti nastavenia nástrojov pre podverzie:
Sériu potenciometrov je možné nahradiť za jeden rotačný enkóder, ktorý má neobmedzené 360° otáčanie a väčšinou 20 krokov na otočku. Enkóder má integrované tlačidlo. To ho predurčuje pre použitie na rôzne systémy, kde sa vyžaduje nastavenie. V takomto prípade bude potrebná vizualizácia nastaveného nástroja. Trebars formou LED diódy, ktorá môže mať viacero stavov a to zhasnutá (nevybratý nástroj), blikajúca (nevybratý nástroj práve označený), alebo svietiaca (nástroj vybratý). Miesto LED diód by bolo možné využiť LCD znakový displej, kde môže byť ikona konkrétneho nástroja, ktorá sa pri otáčaní enkóderom bude dynamicky meniť. V prípade sláčikových nástrojvo to môže byť obtiažne vyhotoviť ikonu pre rozlíšenie jednotlivých nástrojov.
Potvrdenie výberu štandardne tlačidlom, ktoré slúži ako Enter, rovnako tak môže byť použité aj v logike času na dve rôzne akcie, kedy krátky stisk môže znamenať uloženie a dlhý stisk inú akciu. Displej môže rovnako tak vypísať aj informáciu o zlom poradí, ale správnych nástrojoch. Podobne ako to bolo riešené v mojom skoršom projekte Mastermind (nižšie), kde sa hádali čísla a zároveň aj ich poradie (Legenda: C uhádnuté číslo ale nie pozícia, = uhádnuté číslo aj pozícia, - neuhádnuté číslo). Rovnako tak je možné implementovať aj počítadlo pokusov s maximálnym počtom pokusov.

