RFID DOMINATOR: Stopky pre Airsoft a Paintball
RFID DOMINATOR – stopky pre Airsoft, Paintball
RFID DOMINATOR sú stopky vytvorené pre Airsoft, Paintball, ktoré do hry prinášajú interakciu a férovosť. Sú vhodné pre herný mód DOMINATOR, Capture the Point. DOMINATOR tvorí bod, o ktorý hráči hrajú. Snažia sa ho obsadiť a udržať po čo najdlhšiu dobu. Bod zaberá hráč priložením svojho RFID náramku, alebo karty, pri zmene na bode túto zmenu ohlási aj hlásič krátkym pípnutím. LED dióda vo farbe tímu signalizuje, či je tím aktívny na bode a počíta sa mu čas. Súčasťou zariadenia je LCD znakový displej, ktorý informuje hráčov o celkovom čase obsadenia bodu každým tímom. Čas tímu sa počíta do doby, kým svoj RFID tag priloží hráč iného tímu, alebo kým je čas zastavený rozhodcom. Čas sa po zabratí bodu počíta ďalej od jeho poslednej hodnoty, kde zastal. DOMINATOR počíta celkový čas obsadenia každým tímom.
Príklady použitia
Ideálne pre ihriská, areály. Od malých akcií až po LARP, MilSim, CQB, Scenario, Speedball. Pamäť zariadenia dokáže pokryt aj stovky stovky RFID tagov v hre.
Podporovaný hardvér
DPS pre RFID DOMINATOR 2.0, je kompatibilná s hardvérom:
DEMO firmvér
DEMO firmvér je dostupný zdarma pre RFID DOMINATOR, ktorý vám umožní otestovať zariadenie najmä po hardverovej stránke a jeho základné funkcie, ak je správne zapojené podľa schémy na stránke. Rovnako je možné využiť už aj dostupný zdrojový kód minimálnej verzie.
Modulárny dizajn, prenosný firmvér
Modulárny dizajn RFID DOMINATORA umožňuje užívateľovi vymeniť hlavné komponenty bez toho, aby bolo potrebné čokoľvek spájkovať. Metódou hot-swap dokážete odstrániť modul a vložiť nový v priebehu niekoľkých sekúnd. Používateľ môže kopírovať a klonovať firmvér na ľubovoľný počet vlastný zariadení. Používateľ si kupuje len licenciu na vlastné zariadenia. Použite toľkokrát, koľko potrebujete.
Dostupný
Klonovateľný
Ľahké použitie
Open source HW
RFID (NFC)
Modulárny dizajn
Displej
Podpora a spätná väzba
Detaily
PCB
Špecifikácia DPS pre RFID DOMINATOR 2.0
104 x 103 x 1,6 mm, obojstranná DPS typu FR4. Potlač na DPS označuje polohu a orientáciu súčiastok, ako ich treba naspájkovať.
Podpora open-source hardvéru
Kompatibilný hardvér s open-source
RFID DOMINATOR používa open-source hardvér. Nájdeme tam Arduino moduly a aj samotnú dosku Arduino pre modulárny dizajn a jeho výhody open-source hardvéru (cenovo výhodné, ľahko vymeniteľné) aj bez potreby spájkovania.
Osadená DPS
DPS pre stopky RFID DOMINATOR 2.0 s osadenými komponentami
Po osadení DPS pre RFID DOMINATOR 2.0 sa celková výška DPS zvýši na 45 mm, najmä kvôli ICSP pinom Arduina. Na prednej strane je displej LCD2004A a čítačka MFRC522 spolu s LED diódami a bzučiakom. Zo zadnej strany je mikrokontróler Arduino Nano V3.0. Pre hlavné komponenty sa využívajú pinové lišty.
Krabička
3D tlačená krabička pre RFID DOMINATOR 2.0 (PLA / ABS)
Krabička plne kompatibilná s DPS pre RFID DOMINATOR 2.0. Rozmery krabičky sú 124 x 123 x 47 mm. Samotná DPS sa montuje zvnútra na prednú stranu krytu pomocou 4 ks skrutiek typu M3. Na krabičku je možné doplniť sťahovací popruh 25 mm (šírka) na pripevnenie DOMINATORA na strom, trám, rúru.
Schéma zapojenia
Schéma zapojenia pre RFID DOMINATOR 2.0
Schéma zapojenia ukazuje, ako je Arduino Nano V3.0 prepojené so všetkými ostatnými komponentmi RFID DOMINATORA. Pre LCD2004A je použitá hardvérovo káblová I2C zbernica a pre MFRC522 SPI zbernica. Ďalšie GPIO sa používajú na indikáciu LED diód a na bzučiak s podporou PWM signálu.
Tlačidlový DOMINATOR
Prototyp mechanického tlačidlového DOMINATOR
Dosku plošných spojov (DPS) RFID DOMINATORA 2.0 je možné použiť aj pre tlačidlovú verziu DOMINATORA. Jedinou zmenou je odstránenie RFID čítačky, ktorá je nahradená tlačidlami voliteľného priemeru (štandardne 16 mm a vyššie), tlačidlá môžu obsahovať aj integrovanú LED diódu pre podsvietenie, čo ho umožňuje prevádzkovať aj v tme.
Galéria
Často kladené otázky (FAQ)
Nižšie najčastejšie otázky a odpovede na ne
Aká je energetická spotreba RFID DOMINATORA?
RFID DOMINATOR 2.0 spotrebúva 40–60 mAh @ 5V, ekvivalent 0.2–0.3 W. Na zdroj s kapacitou 2000 mAh dokáže fungovať nepretržite 30–35 hodín, v závislosti na záťaži (počte priložení karty, doba svietenia diódy a pod.).
Je možné napájať DOMINATOR powerbankou?
Áno, RFID DOMINATOR 2.0 je možné napájať powerbankou priamo cez jej 5V výstup.
Ako môžem nahrať firmvér?
Postup je rovnaký pre DEMO, alebo plnú verziu RFID DOMINATORA. Obdržíte súbor .hex, ktorý je kompatibilný s Arduinom. Nahrávanie firmvéru zrealizujete cez XLoader, ktorý má veľmi intuivítne ovládanie. Pre Nano s Old Bootloader, zvolíte rýchlosť nahrávania 57600 baud/s (klony), pre verziu s New Bootloader (originál, Keywish), zvolíte 115200 baud/s. O úspešnom nahratí, či chybe vás informuje priamo výpis v spodnej časti XLoadera.
Ako klonovať existujúci firmvér?
Identický firmvér .hex, ktorý ste dostali e-mailom k prvému zariadeniu nahrajte do ďalšieho hardvéru obdobným spôsobom cez XLoader. Firmvér bude reagovať na identické RFID karty ako prvé zariadenie a bude fungovať nezávisle na ňom. Nie je tu žiadny limit, koľko krát môžete firmvér klonovať. Môžete si tak vytvoriť ľubovoľný počet DOMINATOR zariadení pre vaše airsoftové ihrisko.
Je možné zmeniť mená tímov?
Momentálne nie, ale v budúcnosti s príchodom AT príkazov to bude možné. Tímové meno, resp. jeho skratka musí mať maximálne 3 znaky.
Môže sa DOMINATOR používať aj von?
DOMINATOR nemá vodotesnú krabičku. Ak je v suchu, dá sa použiť aj v exteriéri, v lese. Použitie najmä v interiéri, alebo pod prístreškom.
V akej forme je dostupný RFID DOMINATOR?
RFID DOMINATOR je dostupný vo forme zdrojového kódu minimálnej verzie - odstránený buzzer, výhradné použitie LCD 20x4 displeja, max. 1 RFID karta na entitu. Tlačidlový DOMINATOR je dostupný vo forme strojového kódu .hex, ktorý je možné priamo spustiť na MCU ATmega328P (Arduino Uno, Nano), bez prístupu ku zdrojovému kódu. K softvéru nie sú poskytované súbory dizajnu DPS, .STL súbory 3D tlačenej krabičky.
RFID DOMINATOR - zdrojový kód:
Minimálna verzia, 1 karta na tím, bez buzzera, iba pre 20x4 LCD displej
Vyskúšajte RFID DOMINATOR vo Wokwi Simulátore! - Kliknite tu
//RFID DOMINATOR 2.0 - Domination Timer for Airsoft, USAGE UNDER MIT LICENSE!
//BLUE AND YELLOW TEAM, MINIMAL FUNCTIONALITY, ONE CARD / WRISTBAND PER TEAM
//BUZZER NOT INCLUDED, only 20x4 LCD screen supported
//Author: Martin Chlebovec (martinius96@gmail.com)
//Revision --> 20th February 2026
//Project info: https://your-iot.github.io/DOMINATOR/
//Installation instructions:
//Download library MFRC522 from: https://github.com/miguelbalboa/rfid/releases/tag/1.4.11 (Click on Source code (zip))
//Download library LiquidCrystal_I2C from: https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library (click on Code --> Download ZIP)
//Open .zip and copy whole directory into C:/Users/[actual user]/Documents/Arduino/libraries
//Now you can compile this source code
//For Arduino Nano with Old Bootloader, navigate to Tools --> Board --> Arduino Nano
//Tools --> Processor --> ATMega328P (Old Bootloader) - that will reduce upload speed to 57600 baud/s
//Standardly all Arduino Nano V3.0 has Old Bootloader (Blue clones)
//For standard bootloader nothing is required to set, only Arduino Nano under Tools --> Board (default)
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include <Wire.h>
#include <MFRC522.h>
//Pinout compatible for Arduino Nano with MFRC522 (NXP RC522) on RFID DOMINATOR 2.0 PCB board
#define SS_PIN 10
#define RST_PIN 9
MFRC522 rfid(SS_PIN, RST_PIN);
//Known RFID cards UIDs based on teams (You can see UID of your cards in Serial monitor when attached)
const unsigned long TEAM_BLU = 4321; //BLUE TEAM UID --> BLUE CARD
const unsigned long TEAM_YEL = 17933; //YELLOW TEAM UID --> YELLOW CARD
const unsigned long TEAM_REFEREE = 7921; //REFEREE GROUP UID --> GREEN CARD
const unsigned long TEAM_ERASER = 4294948592; //ERASER GROUP UID --> RED CARD
unsigned long code; //UID --> RFID CARD ADDRESS
boolean run = false; //is BLU team active on DOMINATION TIMER?
boolean run2 = false; //is YEL team active on DOMINATION TIMER?
unsigned long timer = 0; //timer 32-bit - GAME TIMER
unsigned long timer2 = 0; //timer 32-bit - RFID CHECK TIMER
boolean once = false; //was once-timed action created yet?
//TIME RELATED VARIABLES FOR TEAM RED
int second = 0; //seconds of team RED
int minute = 0; //minutes of team RED
int hour = 0; //hours of team RED
//TIME RELATED VARIABLES FOR TEAM GRE
int second2 = 0; //seconds of team GRE
int minute2 = 0; //minutes of team GRE
int hour2 = 0; //hours of team GRE
//OUTPUTS
const int BLU_LED = 6; //LED for team RED
const int RED_LED = 4; //LED for team GRE
const int ORA_LED = 7; //LED for team RED
const int GRE_LED = 3; //LED for team GRE
LiquidCrystal_I2C* lcd;
//user-defined functions declaration
void updateLCD();
void updateLCD2();
void tickClock();
void tick();
byte error, address;
void setup() {
Serial.begin(9600); //Start UART bus at 9600 baud/s
Serial.println(F("RFID Domination Timer 2.0 - freeware 9th February 2026"));
Serial.println(F("Creator: Martin Chlebovec (martinius96@gmail.com)"));
Serial.println(F("Project info: https://your-iot.github.io/DOMINATOR/"));
SPI.begin(); //Standard SPI speed for RC522 --> 4 MHz
Wire.begin(); //Standard I2C speed for LCD screen --> 100 kHz
for (address = 1; address < 127; address++ ) //this cycle will scan I2C bus and set LCD display automatically with any I2C address
{
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0)
{
Serial.print("I2C device found at address 0x");
if (address < 16)
Serial.print("0");
Serial.print(address, HEX);
Serial.println(" !");
break;
}
}
lcd = new LiquidCrystal_I2C(address, 20, 4); //display initialization
pinMode(BLU_LED, OUTPUT);
pinMode(RED_LED, OUTPUT);
pinMode(ORA_LED, OUTPUT);
pinMode(GRE_LED, OUTPUT);
rfid.PCD_Init(); // Init MFRC522
rfid.PCD_SetAntennaGain(rfid.RxGain_max);
rfid.PCD_DumpVersionToSerial(); //Write version of Firmware to UART
lcd->begin(); //Not valid for Wokwi simulator, valid for LiquidCrystal_I2C library from @fdebrabander
lcd->backlight(); //backlight on
lcd->clear();
lcd->setCursor(0, 0);
lcd->print(F(" RFID DOMINATOR 2.0 "));
lcd->setCursor(0, 2);
lcd->print(F(" DEVELOPED BY: "));
lcd->setCursor(0, 3);
lcd->print(F(" Martin Chlebovec "));
for (int i = 0; i < 20; i++) {
// LED animation effect, loading
switch (i % 4) {
case 0:
digitalWrite(BLU_LED, HIGH);
delay(250);
digitalWrite(BLU_LED, LOW);
break;
case 1:
digitalWrite(GRE_LED, HIGH);
delay(250);
digitalWrite(GRE_LED, LOW);
break;
case 2:
digitalWrite(RED_LED, HIGH);
delay(250);
digitalWrite(RED_LED, LOW);
break;
case 3:
digitalWrite(ORA_LED, HIGH);
delay(250);
digitalWrite(ORA_LED, LOW);
break;
}
//print loading bar
lcd->setCursor(i, 1);
lcd->write(byte(255)); // plný znak
}
delay(500);
lcd->clear();
lcd->setCursor(0, 0);
lcd->print(F("BLU 00:00:00")); //BLUE TEAM IN ROW 1
lcd->setCursor(0, 1);
lcd->print(F("YEL 00:00:00")); //YELLOW TEAM IN ROW 2
lcd->setCursor(0, 2);
lcd->print(F(" Martin Chlebovec "));
lcd->setCursor(0, 3);
lcd->print(F(" RFID DOMINATOR 2.0 "));
}
void loop() {
tickClock();
if ((millis() - timer2) >= 300) { //Check for incomming datas from RC522 reader each 300 ms
timer2 = millis();
if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) {
dump_byte_array(rfid.uid.uidByte, rfid.uid.size);
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
if (code == TEAM_BLU) { // WAS CARD FROM TEAM BLUE?
if (!run) {
timer = millis();
}
Serial.println(F("Detected card from team BLU"));
digitalWrite(BLU_LED, HIGH);
digitalWrite(RED_LED, LOW);
digitalWrite(ORA_LED, LOW);
digitalWrite(GRE_LED, LOW);
run = true;
run2 = false;
}
if (code == TEAM_YEL) { //WAS CARD FROM TEAM YELLOW?
if (!run2) {
timer = millis();
}
Serial.println(F("Detected card from team YEL"));
digitalWrite(BLU_LED, LOW);
digitalWrite(RED_LED, LOW);
digitalWrite(ORA_LED, HIGH);
digitalWrite(GRE_LED, LOW);
run = false;
run2 = true;
}
if (code == TEAM_REFEREE) { //WAS CARD FROM TEAM REFEREE?
Serial.println(F("Detected card from REFEREE"));
digitalWrite(BLU_LED, LOW);
digitalWrite(RED_LED, LOW);
digitalWrite(ORA_LED, LOW);
digitalWrite(GRE_LED, LOW);
run = false;
run2 = false;
}
if (code == TEAM_ERASER) { //WAS CARD FROM TEAM ERASER?
Serial.println(F("Detected card from ERASER"));
digitalWrite(BLU_LED, LOW);
digitalWrite(RED_LED, LOW);
digitalWrite(ORA_LED, LOW);
digitalWrite(GRE_LED, LOW);
//Zero each value for times
second = 0;
minute = 0;
hour = 0;
second2 = 0;
minute2 = 0;
hour2 = 0;
updateLCD();
updateLCD2();
//Stop active team
run = false;
run2 = false;
}
}
}
}
void tickClock() {
if ((millis() - timer) >= 1000) { //Timer for counting time each 1000 ms (second resolution)
timer = millis();
//Serial.println(timer); //UNCOMMENT TO GET TIMER PRECISION INFO, if couting in 1000 ms or more
if (once == false) {
timer2 = millis();
once = true;
}
error = Wire.endTransmission(); //check, if display was disconnected during operation, if yes, that will renew is connection and initialization
if (error != 0) {
Serial.println("Display is not communicating");
// Communication error, re-initialize the communication with the LCD
lcd->begin(); //Not valid for Wokwi simulator, valid for LiquidCrystal_I2C library from @fdebrabander
lcd->backlight();
lcd->setCursor(0, 0);
lcd->print(F("BLU : : ")); //BLU TEAM IN ROW 1
updateLCD();
lcd->setCursor(0, 1);
lcd->print(F("YEL : : ")); //YEL TEAM IN ROW 2
updateLCD2();
}
tick();
tick2();
}
}
void tick() {
if (run) {
// updateLCD(); //print team 1 numbers (BLUE)
second++;
if (second >= 60)
{
second = 0;
minute++;
if (minute >= 60)
{
minute = 0;
hour++;
}
}
updateLCD();
}
}
void tick2() {
if (run2) {
// updateLCD2(); //print team 2 numbers (YELLOW)
second2++;
if (second2 >= 60)
{
second2 = 0;
minute2++;
if (minute2 >= 60)
{
minute2 = 0;
hour2++;
}
}
updateLCD2();
}
}
void updateLCD() {
lcd->setCursor(4, 0);
if (hour < 10) {
lcd->print(F("0"));
}
lcd->print(hour, DEC);
lcd->setCursor(7, 0);
if (minute < 10) {
lcd->print(F("0"));
}
lcd->print(minute, DEC);
lcd->setCursor(10, 0);
if (second < 10) {
lcd->print(F("0"));
}
lcd->print(second, DEC);
}
void updateLCD2() {
lcd->setCursor(4, 1);
if (hour2 < 10) {
lcd->print(F("0"));
}
lcd->print(hour2, DEC);
lcd->setCursor(7, 1);
if (minute2 < 10) {
lcd->print(F("0"));
}
lcd->print(minute2, DEC);
lcd->setCursor(10, 1);
if (second2 < 10) {
lcd->print(F("0"));
}
lcd->print(second2, DEC);
}
void dump_byte_array(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
}
Serial.print(F("Detected UID (code) of RFID CARD: "));
code = 10000 * buffer[4] + 1000 * buffer[3] + 100 * buffer[2] + 10 * buffer[1] + buffer[0]; //Final UID (reverse order, byte 5 as MSB
Serial.println(code); //UID
}