Konfigurovateľné stopky - DOMINATOR pre Airsoft | Paintball

17.02.2021

DOMINATOR je zariadenie, ktoré umožňuje merať čas pre dva tímy, ktoré proti sebe hrajú. Meria sa čas obsadenia bodu, ktorý dokáže obsadiť jeden z tímov. Cieľom hry je udržať bod obsadený čo najdlhšie. Zariadenie DOMINATOR je tvorené jednoduchým znakovým LCD displejom pre vizualizáciou nameraných časov a je vhodné predovšetkým pre herné módy DOMINATION, Capture Point.

V minulosti som na tomto blogu predstavil DOMINATOR, ktorý využíval tlačidlový vstup pre 4 entity, ale aj pôvodnú RFID verziu, ktorá fyzické tlačidlá vymenila za RFID vstup prostredníctvom karty, náramku, alebo kľúčenky s RFID čípom kompatibilného štandardu ISO/IEC 14443-A, ktorý dokáže RFID čítačka NXP RC522 načítať.

Staršia verzia tlačidlového projektu DOMINATOR pôvodne využívala 4 tlačidlá, pričom umožňovala používateľský vstup pre Tím 1 (RED), Tím 2 (GRE), Rozhodcu a Erasera. Na základe spätnej väzby od hráčov uzrela svetlo svetla obdobná verzia tlačidlového DOMINATOR-a, ktorá využíva v hre iba 2 tlačidlové vstupy pre entity tímov a je rozšírená o rotačný enkóder, ktorý umožňuje interakciu v používateľskom menu a pre zmenu konfigurovateľných údajov, ktoré sa využívajú v logike hry. 

Poďme ale pekne poporiadku a na úvod si ukážme hardvérové komponenty z ktorých je projekt zostavený:

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

Možnosti konfigurovateľného DOMINATOR-a:
DOMINATOR sa po spustení mikrokontroléru spustí v menu režime. Prostredníctvom rotačného enkódera je možné prepínať medzi dostupnými položkami menu, ktoré sú vyobrazené na LCD znakovom displeji 16x2 respektíve 20x4 (zohľadňuje sa výpis na max 16 znakov do riadku, aby bol výstup kompatibilný pre oba displeje). Arduino komunikuje s displejom cez I2C zbernicu s rýchlosťou 100 kHz - Standard speed. 

Používateľ má na výber v hlavnom menu z: Štartu hry, Konfigurácia doby obsadenia bodu, Konfigurácia maximálneho času hry. Enkóder je vybavený tlačidlom, ktoré slúži pre potvrdenie aktuálnej voľby vyobrazenej na LCD znakovom displeji
Pri návrhu jednotlivých režimov:

  • Hlavné menu
  • Hra DOMINATOR a jej logika
  • Konfiguračné podmenu pre jednotlivé veličiny

som využil jednoduchý stavový automat cez funkciu switch(), čím som mohol efektívne používať perifériu, ktorú som chcel a zároveň nepracovať s inou.

V režime menu sa načítavajú digitálne signály z rotačného enkódera, rovnako tak i v konfiguračných podmenu. V režime hry systém číta iba vstupy z tlačidiel pre tím RED a tím GRE, nereaguje na otáčanie rotačného enkódera, ani jeho tlačidlo. Prostredníctvom systému menu je systém ľahko škálovateľný a rozšíriteľný o rôzne ďalšie položky menu, pridanie nových herných módov, funkcií. Predstavme si bližšie jednotlivé položky menu.

Štart hry:
Po spustení režimu hry prestáva mikrokontróler reagovať na vstup z rotačného enkóderu, nereaguje ani na stlačenie jeho tlačidla. 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, 59 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 Konfigurácia doby obsadenia bodu. Po držaní dostatočnej doby sa rozsvieti LED dióda daného tímu a začne sa mu pripočítavať čas v rozlíšení sekúnd.
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 pre tím, ktorý je na danom bode 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. Schéma zapojenia počíta so spínacími, nie rozpínacími tlačidlami, ktoré by v programovej implementácii nefungovali.

Konfigurácia doby obsadenia bodu:
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ť si 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.

Konfigurácia maximálneho času hry:
Druhým konfigurovateľným parametrom je maximálny čas hry vyjedrený 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. 

Hodnota je uložená do internej EEPROM pamäte na offset 100. 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.
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:

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.
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 si na AVRDUDE neveríte, 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):

Informácie o predchádzajúcej verzii - Tlačidlový DOMINATOR aj RFID verzii môžete nájsť na:

© 2024-2025 Arduino Blog - Všetky práva vyhradené.
Vytvorené službou Webnode Cookies
Vytvorte si webové stránky zdarma! Táto stránka bola vytvorená pomocou služby Webnode. Vytvorte si vlastný web zdarma ešte dnes! Vytvoriť stránky