RFID DOMINATOR: il cronometro di dominio definitivo per Airsoft, Paintball
Informazioni su RFID DOMINATOR – Cronometro Airsoft
RFID DOMINATOR è un cronometro creato per Airsoft, Paintball, che migliora l'esperienza di gioco e porta equità. Sono adatti per la modalità di gioco DOMINATOR, Capture the Point. Il DOMINATORE forma un punto occupato da un giocatore della squadra. Il dispositivo include un display LCD che informa sull'ora corrente di ciascuna squadra. Allo stesso tempo, la squadra attiva sul punto viene segnalata da un LED. Il giocatore occupa il punto DOMINATOR attaccando un braccialetto o una tessera RFID. Quando un punto è occupato, il cicalino emette un segnale acustico per annunciare un cambiamento nel punto. Il tempo della squadra viene conteggiato finché un giocatore di un'altra squadra non indossa la sua etichetta RFID o finché il tempo non viene fermato dall'arbitro. Il tempo viene conteggiato ulteriormente dopo che è stato preso un punto. DOMINATOR calcola il tempo totale occupato da tutte le squadre nel gioco. Può essere utilizzato per 2 o 4 squadre in una partita. Oltre a fermare il tempo, l'arbitro può anche azzerarlo prima di una nuova partita.
Scenari di utilizzo
Ideale per campi da gioco, campi che offrono esperienze di Airsoft/Paintball. Eventi come LARP, MilSim, Scenario, Speedball, grazie alle dimensioni del flash che supportano centinaia di tag RFID in un'unica applicazione
Hardware supportato
Con RFID DOMINATOR 2.0 PCB, i seguenti componenti sono compatibili
Firmware DEMO
RFID DOMINATOR offre un firmware DEMO gratuito che consente di testare il dispositivo e le sue funzioni di base, se cablato correttamente come negli schemi disponibili sulla pagina web di RFID DOMINATOR
Design modulare, firmware portatile
Il design modulare di RFID DOMINATOR consente all'utente di sostituire i componenti principali senza dover saldare nulla. Con il metodo hot-swap può rimuovere il modulo e inserirne uno nuovo in pochi secondi. L'utente può copiare e clonare il firmware su qualsiasi quantità di dispositivi. Paga la licenza una volta, usala tutte le volte che vuoi per i tuoi dispositivi.
Conveniente
Clonabile
Facile da usare
HW open source compatibile
RFID abilitato
Design modulare
Visualizzazione dell'output
Supporto e feedback
Dettagli
PCB
Specifiche PCB RFID DOMINATOR 2.0
104 x 103 x 1,6 mm, PCB tipo FR4 bifacciale. La serigrafia sul PCB indica la posizione e l'orientamento dei componenti, come devono essere saldati.
Supporto hardware open source
Hardware compatibile con hardware open source
L'hardware di RFID DOMINATOR è correlato all'utilizzo di hardware open source. Utilizza moduli Arduino e la scheda Arduino stessa per la progettazione modulare e i vantaggi dell'hardware open source (economico, facile da sostituire).
PCB assemblato
Vista sul PCB, dopo che è stato assemblato con componenti compatibili
Dopo che il PCB RFID DOMINATOR 2.0 è stato assemblato, l'altezza totale del PCB è estesa a 45 mm. Sul lato anteriore, c'è lo schermo LCD2004A e il lettore MFRC522, insieme a diodi LED e buzzer. Dal lato posteriore, c'è il controller Arduino Nano V3.0. I componenti principali utilizzano pin header.
Recinto
Recinto stampato in 3D per RFID DOMINATOR 2.0
Recinto compatibile con PCB di RFID DOMINATOR 2.0. Le dimensioni del recinto sono 124 x 123 x 47 mm. Il PCB stesso è montato dall'interno, sul lato anteriore del recinto utilizzando 4 pezzi di viti M3. È possibile utilizzare una cinghia di fissaggio da 25 mm (larghezza) sul recinto per montarlo sull'albero, sulla trave.
Schema elettrico
Schema elettrico per RFID DOMINATOR 2.0
Lo schema elettrico mostra come Arduino Nano è cablato con tutti gli altri componenti. Per LCD2004A, viene utilizzato il bus I2C cablato tramite hardware e per il bus SPI MFRC522. GPIO aggiuntivi vengono utilizzati per le indicazioni dei diodi LED e per il buzzer con supporto PWM.
Pulsante DOMINATOR
Prototipo di pulsante meccanico DOMINATOR
Il PCB standard di RFID DOMINATOR 2.0 può essere utilizzato anche per il pulsante DOMINATOR. L'unica modifica è che il lettore RFID viene rimosso e vengono inseriti due pulsanti con diametro opzionale; è anche possibile utilizzare pulsanti con retroilluminazione a LED.
Galleria
Domande frequenti Domande
Di seguito sono riportate le domande più frequenti della nostra community.
Qual è il consumo energetico del sistema?
Il sistema consuma in genere 40-60 mAh a 5 V, equivalenti a 0,2-0,3 W. Una fonte di alimentazione da 2000 mAh può far funzionare il sistema per 30-35 ore, a seconda del carico.
Posso alimentarlo tramite Powerbank?
Sì, RFID DOMINATOR può essere alimentato direttamente tramite un powerbank tramite la sua uscita da 5 V. RFID DOMINATOR richiede un connettore MiniUSB, ci possono essere anche alcune versioni di Arduino Nano con connettore microUSB.
Come posso caricare il firmware?
Che si tratti di firmware DEMO o FINALE, usa il file .hex fornito compatibile con Arduino. Caricalo usando lo strumento XLoader. Per Arduino Nano con il vecchio bootloader, imposta la velocità a 57600 baud/s, per il nuovo bootloader, usa 115200 baud/s. Il caricamento riuscito è confermato da un messaggio da XLoader, che può informarti del processo di caricamento non riuscito.
Come copiare il firmware esistente?
Carica semplicemente lo stesso file firmware (.hex) che hai ricevuto via e-mail sulla tua prossima unità RFID DOMINATOR. Funzionerà allo stesso modo e reagirà agli stessi braccialetti e tessere RFID. Non c'è limite al numero di cloni che puoi creare, dipende da te.
È possibile cambiare il nome di un team?
Non al momento, ma presto sarà possibile, quando l'estensione dei comandi AT sarà completata. I nomi dei team devono avere al massimo 3 lettere (saranno limitati dal software).
DOMINATOR può essere utilizzato all'esterno?
DOMINATOR non ha una custodia impermeabile. Se è asciutto, può essere utilizzato anche all'esterno. Utilizzato principalmente all'interno o sotto un riparo.
In quale formato è disponibile DOMINATOR?
RFID DOMINATOR è disponibile nella versione minima del codice sorgente - buzzer rimosso, uso esclusivo del display LCD 20x4, max. 1 tessera RFID per entità. Il pulsante DOMINATOR è disponibile come codice macchina .hex, che può essere eseguito direttamente su un MCU ATmega328P (Arduino Uno, Nano), senza accesso al codice sorgente. I file di progettazione DPS e i file .STL della scatola stampata in 3D non sono forniti con il software.
RFID DOMINATOR - codice sorgente
Versione minima, 1 scheda per squadra, senza cicalino, solo per display LCD 20x4
Prova RFID DOMINATOR nel simulatore Wokwi! - Clicca qui
//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
}