blogy logo
login PRIHLÁS SA
BLOG deadawp
ČLÁNKY
DISKUSIE
3
SLEDUJETE BLOG
PHP, Arduino programátor
deadawp



Konfigurovateľné stopky - DOMINATOR pre Airsoft | Paintball
pridal deadawp 7.3. 2021 o 20:08



DOMINATOR (nazýva sa aj DOMINATION Timer) je zariadenie - stopky so sekundovým rozlíšením, ktoré umožňujú merať čas (dobu) obsadenia bodu. Stopky počítajú 2 časy dvoch tímov, ktoré proti sebe hrajú a snažia sa o obsadenie bodu. Časy sú vizualizované na LCD znakový displej, ktorý komunikuje s mikrokontrolérom po I2C zbernici. Počítadlo času môže fungovať počas hry iba pre jeden čas, t.j. pre tím, ktorý obsadil bod. V prípade, že bod nie je obsadený, časy sú zastavené na aktuálnej hodnote - bod je neutrálny.

Každý z tímov sa snaží o obsadenie bodu, ten má určitý typ vstupu, ktorým sa obsadenie realizuje (RFID karta, náramok alebo hardvérové tlačidlá pre používateľský vstup). Cieľom hry je udržať bod obsadený čo najdlhšie. Hra môže byť ukončená časovým limitom, ktorý je potrebné dosiahnuť, alebo rozhodcom, ktorý manuálne čas zastaví stlačením svojho tlačidla.

Staršia verzia tlačidlového projektu DOMINATOR pôvodne využívala 4 spínacie tlačidlá, pričom umožňovala používateľský vstup pre Tím 1 (RED), Tím 2 (GRE), Rozhodcu a Erasera. Táto verzia projektu DOMINATOR neoverovala dĺžku stlačenia (držania) tlačidla a na stlačenie reagovala okamžite. Na základe spätnej väzby od hráčov Airsoftu vznikla obdobná verzia tlačidlového DOMINATOR-a, ktorá využíva iba 2 tlačidlové vstupy pre entity tímov --> Tím 1 (RED), Tím 2 (GRE) a rozhodcu (ak stlačí obe tlačidlá zároveň). Verzia je rozšírená o rotačný enkóder 360° , ktorým je možné v konfigurovateľnom menu zmeniť a prispôsobiť si viacero možných - meniteľných údajov pre hru a potreby hráčov.

Použité hardvérové komponenty:

    Arduino Uno / Nano / samostatný AVR čip AtMega328P
    LCD znakový displej 16x2 / 20x4
    I2C prevodník pre LCD displej
    2x tlačidlá (spínacie)
    Rotačný enkóder 360° - napr. KY-040
    2x LED diódy
    Voliteľný - buzzer (hlásič)


Schéma zapojenia Konfigurovateľného DOMINATOR-a:

    Buzzer sa pripája na D10 Arduina (nie je obsiahnutý v schéme zapojenia)


Funkčnosť:
Po spustení mikrokontroléru Arduino (ale i reštarte, power-on cykle) sa zobrazí hlavné menu na LCD znakovom displeji 16x2 / 20x4.

V tomto menu je možné prepínať (otáčaním enkódera) medzi týmito položkami menu:

  • Štart hry (DOMINATOR)
  • Nastavenie času stlačenia tlačidla pre obsadenie
  • Nastavenie maximálneho času hry
  • Konfigurácia buzzra (hlásiča)
  • Nastavenie odpočtu - COUNTDOWN
  • Štart hry (COUNTDOWN)

Ako je z položiek menu zrejmé, táto verzia DOMINATOR-a je rozšírená aj o herný režim COUNTDOWN (odpočet), ktorým je možné spustiť hru v režime Útočiaci a brániaci tím. Po začiatku hry sa začne odpočítavať nastavený čas, nastavuje sa v minútach. Počas tohto času musí člen útočiaceho tímu stlačiť a držať obe tlačidlá po nastavenú dobu stlačenia tlačidiel z menu.

Vždy pri zmene (otočení enkódera o krok do +, resp. do -) sa na LCD znakovom displeji 16x2 respektíve 20x4 vypíše aktuálna položka menu. Arduino komunikuje s displejom cez I2C zbernicu s rýchlosťou 100 kHz - Standard speed. Programovo sú jednotlivé texty menu prepínané cez switch - vetvenie, ktoré reaguje na hodnotu počítadla otáčok. Pri menu však musíme rozlišovať ešte režim v ktorom sa používateľ nachádza. Rozlišujeme režim hlavných menu, konfiguračný režim, režim hry.

V režime hry systém vôbec nereaguje na enkóder, v režime hlavných menu a konfiguračných režimov nereaguje na tlačidlá použité v hre. Daná položka menu sa potvrdzuje cez tlačidlo, ktoré má enkóder integrované. Zároveň sa pri stlačení tlačidla vykonáva aj logika (zmena režimu, uloženie...). Rovnako tak programová implementácia využíva switch aj pre režimy a funguje ako jednoduchý stavový automat. V určitom stave systém reaguje na konkrétny typ vstupných periférii - tlačidlá, enkóder, vizualizuje počítadlo času a podobne. Všetky konfigurovateľné hodnoty sú uložené do EEPROM pamäte Arduina. 

Predstavme si jednotlivé položky hlavného menu bližšie:

Štart hry (DOMINATOR):
Na displeji sa vyobrazia dva časy pre tím RED a tím GRE, pričom sú nastavené na nulové hodnoty pre 00 hodín, 00 minút, 00 sekúnd. Systém reaguje na dve tlačidlá, ktorými sa zadáva používateľský vstup (vyžadujú držanie) po dobu, ktorá je nastaviteľná v menu "Nastavenie času stlačenia tlačidla pre obsadenie". Po držaní dostatočnej doby sa rozsvieti LED dióda daného tímu a začne sa mu pripočítavať čas v sekundách.

Fragment zdrojového kódu - režim hry riešený cez stavový automat premennej rezim:

Ak DOMINATOR obsadí druhý tím, držaním svojho tlačidla po potrebnú dobu sa zastaví pripočítavanie času pre predchádzajúci tím, zhasne jeho LED dióda. Rozsvieti sa LED dióda aktuálneho tímu a tomu tímu sa začne pripočítavať i čas. Programová implementácia môže byť rozšírená o stav, kedy v prípade držania tlačidla minimálne 50% a menej ako 100% času sa zastaví pripočítavanie času (bod prejde do neutrálneho stavu) pre tím, ktorý na danom bode bol vedený ako aktívny.

Oba časy je možné zastaviť rozhodcom, ktorý prostredníctvom krátkeho stlačenia oboch tlačidiel zároveň čas zastaví. Reset hry a vynulovanie aktuálnych časov sa realizuje reštartovaním celej Arduino dosky cez RST tlačidlo, prípadne odpojením a pripojením napájania. Tlačidlá sú pripojené v režime INPUT_PULLUP, kedy je digitálny vstup pripojený cez interný 20kohm rezistor k 5V. Spínaním tlačidla sa privádza GND na vstup - Active LOW signál. V prípade potreby pri dlhšom vedení káblov k tlačidlám je možné využiť softvérový vstup INPUT a využiť externý - nižší pullup rezistor. Schéma zapojenia počíta so spínacími tlačidlami, nie rozpínacími, ktoré by v programovej implementácii nefungovali (tvárili by sa ako stlačené v normálnom stave, čas by bol zastavený - vstup rozhodcu).

Nastavenie času stlačenia tlačidla pre obsadenie
Prvým z konfigurovateľných parametrov v systéme je doba obsadenia bodu. Udáva čas (v sekundách), ako dlho musí používateľ držať stlačené tlačidlo, pokým dôjde k obsadeniu bodu a spusteniu logiky pre prípočet času pre daný tím. Prostredníctvom rotačného enkóderu je možné nastaviť požadovaný čas v rozlíšení sekúnd a tlačidlom enkódera voľbu potvrdiť.

Hodnota času (INT) sa po stlačení tlačidla uloží do internej EEPROM pamäte na offset (adresu) 10. V prípade, že chce používateľ opätovne uložiť rovnakú hodnotu, ako je v EEPROM zapísaná, nezapíše sa, Arduino nevykonáva zbytočné prepisy. Hodnota je tak k dispozícii a je nezmenená aj po reštarte / odpojení a pripojení napájania k Arduino doske. Túto hodnotu zohľadňuje herný režim DOMINATOR i COUNTDOWN.

Nastavenie maximálneho času hry
Druhým konfigurovateľným parametrom je maximálny čas hry vyjadrený v hodinách. Hodnota sa nastavuje otáčaním rotačného enkóderu a potvrdzuje sa stlačením tlačidla. Minimálna hodnota pre obmedzený čas je 1 hodina, pričom je možné na pozícii počítadla 0 nájsť aj hodnotu BEZ OBMEDZENIA, kedy hra nie je limitovaná a počíta čas od nekonečna, respektíve do vizualizovanej hodnoty 99 hodín, 59 minút, 59 sekúnd, na ktorú je prispôsobený displej rozmeru 16x2. Túto hodnotu zohľadňuje iba herný režim DOMINATOR. Hodnota je uložená do internej EEPROM pamäte na offset 20. Táto hodnota udáva automatický koniec hry pri dosiahnutí tohto času jedným z tímov v hre DOMINATOR. Po dosiahnutí daného času v hre akýmkoľvek tímom sa hra ukončí a DOMINATOR prestáva počítať čas a nereaguje na tlačidlový vstup.

Konfigurácia buzzra (hlásiča)

Buzzer (hlásič) je možné softvérovo zapnúť / vypnúť otáčaním rotačného enkódera. Frekvenciu hlásiča nie je možné konfigurovať, je štandardne nastavená na 2000 Hz.

V hernom režime DOMINATOR buzzer pípa iba v momente obsadzovania bodu. Pri hernom režime COUNTDOWN pípa buzzer každú sekundu s dĺžkou beepu 50 ms. V prípade, že čas dôjde na 0 sekúnd, 0 minút, 0 hodín, buzzer sa prepne na frekvenciu 500 Hz a pípa (vydáva nepretržitý tón) oznamujúci koniec hry - čaká na reštart.

Nastavenie odpočtu - COUNTDOWN
Posledný konfigurovateľný parameter nastavovaný v minútach. Nastavuje sa dĺžka odpočtu pre herný režim countdown.

Ukážka automatického zastavenia času pri nastavení ukončenia hry v čase 1 hodina obsadenia bodu:

Celá programová implementácia tohto riešenia zaberá cca 7 kilobajtov flash pamäte a 480 bajtov pamäte RAM. Nakoľko má Arduino k dispozícii 32kB (28kB pre program) flash pamäť a 2kB RAM, je systém možné rozšíriť o mnoho ďalších funkcionalít. Nakoľko sa v programovej implementácii využíva aj dosť textových reťazcov - názvy položiek menu atď, využil som F makro, ktorým je možné tieto statické reťazce presunúť do flash pamäte.

Zbytočne tak nezaberajú miesto v RAM pamäti, ktorá tak môže byť využitá efektívnejšie pre zložitejšiu funkcionalitu projektu a ďalšie herné režimy, ktoré môžu byť implementované v budúcnosti. Programová logika počítadla sa vykonáva každých 100ms. Čas je tak možné rátať a vypísať na displej aj v desatinách sekundy, avšak z pohľadu použitia projektu DOMINATOR, ktorý sa organizuje na niekoľko hodinových, alebo až dňových akciách, je výpis s rozlíšením na sekundy viac než dostačujúci.

V menu i konfiguračných podmenu sú ošetrené hodnoty, ktoré nadobúda enkóder - počítadlo, kedy nie je možné nastaviť hodnotu menšiu ako 0, nenastane ani overflow hodnoty. Nakoľko sa v režime hry overuje dĺžka držania tlačidla, využíva sa cyklus while, ktorý neustále monitoruje hodnotu stavu vstupného GPIO. Programová logika počítadla času musí byť taktiež do tohto cyklu vložená, aby nenastalo zastavenie času. Nakoľko je Arduino jednojadrová platforma, nedokáže obsluhovať dve slučky / tasky súčasne. V prípade dvojjadrových platforiem, napríklad ESP32 je možné využiť systém taskov - úhloh, ktoré môžu byť pridelené každému jadru a ESP32 tak dokáže obsluhovať obe slučky zároveň.

Viac o projekte Konfigurovateľný DOMINATOR je možné nájsť na:
https://martinius96.github.io/Airsoft-DOMINATOR-RFID/dominator-encoder.html

K projektu Konfigurovateľný DOMINATOR (stopky) existuje programová implementácia dostupná v strojovom kóde (.hex) pre platformu Arduino Uno / Nano, respektíve samostatný čip AtMega328P. Cieľom programu - Shareware verzie projektu je overiť kompatibilitu komponentov (displeja komunikujúceho po I2C zbernici, funkčnosť spínacích tlačidiel, reakciu rotačného enkódera) pre následne použitie plnej verzie projektu.

Shareware verzia obsahuje 30 sekundovú inicializáciu systému (lazy loading) a následne možné testovanie stopiek po maximálny merateľný čas 1 minútu. Stopky prestávajú počítať čas a nereagujú na používateľské tlačidlá od momentu, kedy ktorýkoľvek z týmov dosiahne obsadenie bodu 1 minútu. Z pohľadu konfigurácie v tejto free Shareware verzii je možné konfigurovať iba dobu obsadenia bodu. Cieľový čas systému - herný čas nie je možné uložiť do EEPROM - je to súčas iba plnej verzie projektu. Súčasťou Shareware verzie NIE je herný režim COUNTDOWN.

Firmvér je možné do Arduina nahrať cez AVRDUDE - konzolovú aplikáciu, ktorú využíva pre nahrávanie skompilovaného (strojového kódu) programu aj prostredie Arduino IDE. Príkaz pre nahratie programu sketch.ino.hex na COM port 21 (nutné upraviť podľa názvu firmvéru a COM portu, kde sa nachádza vaše Arduino): avrdude -CC: avrdude.conf -v -patmega328p -carduino -PCOM21 -b115200 -D -Uflash:w:sketch.ino.hex:i V prípade, že s AVRDUDE nemáte skúsenosti, vyskúšajte XLoader, ktorý umožňuje v jednoduchom grafickom rozhraní vybrať cieľový firmvér, cieľovú platformu a COM port na ktorom sa vaša Arduino doska nachádza. V prípade Arduina Nano s OLD Bootloaderom je nutné prepnúť rýchlosť nahrávania na 57600 baud/s. Pri novších bootloaderoch je podporovaná rýchlosť nahrávania 115200 baud/s.

Shareware firmvér projektu Konfigurovateľný DOMINATOR (navrhnutý podľa schémy zapojenia v tomto článku):
https://github.com/martinius96/Airsoft-DOMINATOR-RFID/tree/master/firmware/encoder_dominator

Informácie o predchádzajúcej verzii - Tlačidlový DOMINATOR aj RFID verzii môžete nájsť na:
https://martinius96.github.io/Airsoft-DOMINATOR-RFID/index.html



Prístupov 2629
Kvalita článku
hlasov 0

PRÍSPEVKY
SLEDOVAŤ
Prosím prihláste sa pre možnosť pridania komentáru.
Prihláste sa, alebo použite facebook login facebook login
ĎALŠIE ČLÁNKY V BLOGU
ULP aplikácie - ESP8266 / ESP32
[ 14.11.2021] (príspevkov 0)
Detekčná charakteristika - MATLAB
[ 8.8.2021] (príspevkov 0)
Práca s obrázkami - MATLAB
[ 19.7.2021] (príspevkov 1)
Flash Encryption a jeho implementácia v ...
[ 18.7.2021] (príspevkov 0)
Secure Boot V1 a jeho implementácia v ES...
[ 13.7.2021] (príspevkov 0)
Senzor Bosch BME280 v prostredí ESP-IDF
[ 8.7.2021] (príspevkov 0)
Podpora ESP32 do projektu WiFi termostat
[ 1.7.2021] (príspevkov 0)
Beamforming vizualizácia - MATLAB
[ 29.6.2021] (príspevkov 0)
Výroba DPS - AISLER - RFID DOMINATOR
[ 18.6.2021] (príspevkov 0)