RFID DOMINATOR device with PCB, equipped in the enclosure

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

  • Arduino Nano V3.0
  • Lettore MFRC522 RFID-RC522
  • LCD 2004A con convertitore I2C
  • Buzzer con passo 7,62 mm
  • Diodi LED da 5 mm THT
  • Resistori THT
  • 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

    Controlla RFID DOMINATOR
    PCB of RFID DOMINATOR 2.0 and RFID DOMINATOR 1.0. Comparsion of differences

    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.

    Open-source hardware, Arduino modules Arduino compatible with PCB of RFID DOMINATOR 2.0

    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).

    Assembled PCB of RFID DOMINATOR 2.0

    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.

    RFID DOMINATOR 2.0 enclosure with tie-belt. Mountable on the tree, pipe, wall.

    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.

    Schematics, wiring diagrams for RFID DOMINATOR 2.0 hardware

    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.

    Timer Button Domination - DOMINATOR per Airsoft / Paintball

    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.

    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.

    Frequently asked questions about RFID DOMINATOR 2.0 device suitable for Airsoft, Paintball usage
    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
    }