Dispositif RFID DOMINATOR avec PCB, équipé dans le boîtier

RFID DOMINATOR : Le chronomètre de domination ultime pour l'airsoft et le paintball

À propos de RFID DOMINATOR – Révolutionner le gameplay compétitif

Le RFID DOMINATOR est un chronomètre de domination de pointe conçu pour l'airsoft, le paintball et d'autres sports de compétition, améliorant la stratégie et l'engagement dans chaque match.

Cet appareil avancé dispose d'un écran intégré qui suit le temps total d'occupation d'un point de contrôle, ce qui le rend indispensable pour les événements organisés et les compétitions par équipes.

Avec la technologie RFID, les joueurs peuvent facilement prendre le contrôle en tapant leur bracelet ou leur carte RFID sur l'appareil. Le chronomètre émet un bip pour indiquer un changement d'équipe, et le chronomètre continue de compter pour l'équipe active jusqu'à ce qu'un joueur adverse réclame le point ou qu'un arbitre interrompe le jeu.

Les arbitres ont également la possibilité de réinitialiser le chronomètre si nécessaire, garantissant ainsi une expérience de jeu fluide et équitable.

Conçu pour la polyvalence, le RFID DOMINATOR prend en charge les matchs standard avec deux équipes et peut être étendu pour accueillir jusqu'à quatre équipes dans une seule compétition.

Améliorez votre avantage concurrentiel et redéfinissez votre façon de jouer avec le RFID DOMINATOR !

Scénarios d'utilisation

Idéal pour les terrains de jeux, les terrains offrant une expérience Airsoft / Paintball. Événements tels que LARP, MilSim, Scenario, Speedball, en raison de la taille du flash qui prend en charge des centaines d'étiquettes RFID dans une seule application

Matériel pris en charge

Avec le PCB RFID DOMINATOR 2.0, les composants suivants sont compatibles

  • Arduino Nano V3.0
  • Lecteur RFID-RC522 MFRC522
  • LCD 2004A avec convertisseur I2C
  • Buzzer au pas de 7,62 mm
  • Diodes LED THT de 5 mm
  • Résistances THT
  • Micrologiciel de démonstration

    RFID DOMINATOR propose un firmware DEMO gratuit qui vous permet de tester l'appareil et ses fonctions de base, s'il est correctement câblé comme sur les schémas disponibles sur la page Web de RFID DOMINATOR

    Conception modulaire, micrologiciel portable

    La conception modulaire du RFID DOMINATOR permet à l'utilisateur de remplacer les principaux composants sans avoir à souder quoi que ce soit. Grâce à la méthode d'échange à chaud, il peut retirer le module et en mettre un nouveau en quelques secondes. L'utilisateur peut copier et cloner le micrologiciel sur n'importe quel autre appareil. Payez une fois, utilisez autant de fois que vous le souhaitez pour vos appareils.

    Abordable

    Clonable

    Facile à utiliser

    Compatible avec le matériel open source

    Compatible RFID

    Conception modulaire

    Sortie d'affichage

    Assistance et commentaires

    Détails

    Vérifiez RFID DOMINATOR
    PCB of RFID DOMINATOR 2.0 and RFID DOMINATOR 1.0. Comparsion of differences

    PCB

    Spécifications du PCB RFID DOMINATOR 2.0

    Circuit imprimé double face type FR4 de 104 x 103 x 1,6 mm. La sérigraphie sur le circuit imprimé indique la position et l'orientation des composants, ainsi que la manière dont ils doivent être soudés.

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

    Prise en charge du matériel open source

    Hardware compatible with open-source hardware

    Le matériel du RFID DOMINATOR est lié à l'utilisation de matériel open source. Il utilise des modules Arduino et la carte Arduino elle-même pour une conception modulaire et ses avantages de matériel open source (rentable, facile à remplacer).

    Assembled PCB of RFID DOMINATOR 2.0

    PCB assemblé

    Vue sur le PCB, après son assemblage par des composants compatibles

    Une fois le PCB RFID DOMINATOR 2.0 assemblé, la hauteur totale du PCB est étendue à 45 mm. Sur la face avant, on trouve l'écran LCD2004A et le lecteur MFRC522, ainsi que des diodes LED et un buzzer. À l'arrière, on trouve le contrôleur Arduino Nano V3.0.

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

    Enceinte

    Boîtier imprimé en 3D pour RFID DOMINATOR 2.0

    Boîtier compatible avec PCB du RFID DOMINATOR 2.0. Les dimensions du boîtier sont de 124 x 123 x 47 mm. Le PCB lui-même est monté de l'intérieur, sur la face avant du boîtier à l'aide de 4 vis M3. Il est possible d'utiliser une courroie d'attache de 25 mm (largeur) sur le boîtier pour le monter sur l'arbre, la solive.

    Schematics, wiring diagrams for RFID DOMINATOR 2.0 hardware

    Schéma de câblage

    Schéma de câblage pour RFID DOMINATOR 2.0

    Le schéma de câblage montre comment l'Arduino Nano est câblé avec tous les autres composants. Pour le LCD2004A, on utilise un bus I2C câblé en matériel et pour le bus SPI MFRC522. Des GPIO supplémentaires sont utilisés pour les indications des diodes LED et pour le buzzer avec prise en charge PWM.

    Bouton Domination Timer - DOMINATOR pour Airsoft / Paintball

    Bouton DOMINATOR

    Prototype de bouton mécanique DOMINATOR

    Le circuit imprimé standard du DOMINATOR RFID 2.0 peut également être utilisé pour le bouton DOMINATOR. La seule différence réside dans le retrait du lecteur RFID et l'insertion de deux boutons de diamètre différent. Il est également possible d'utiliser des boutons avec rétroéclairage LED.

    Questions fréquemment posées

    Vous trouverez ci-dessous les questions les plus fréquemment posées par notre communauté.

    Quelle est la consommation énergétique du système ?

    Le système consomme généralement 40 à 60 mAh à 5 V, soit 0,2 à 0,3 W. Une source d'alimentation de 2 000 mAh peut faire fonctionner le système pendant 30 à 35 heures, selon la charge.

    Puis-je l'alimenter via une banque d'alimentation?

    Oui, le RFID DOMINATOR peut être alimenté directement à l'aide d'une batterie externe via sa sortie 5V.

    Comment puis-je télécharger le firmware ?

    Qu'il s'agisse d'un firmware DEMO ou FINAL, utilisez le fichier .hex fourni compatible avec Arduino. Téléchargez-le à l'aide de l'outil XLoader. Pour Arduino Nano avec l'ancien chargeur de démarrage, définissez la vitesse sur 57 600 bauds/s ; pour le nouveau chargeur de démarrage, utilisez 115 200 bauds/s. Les téléchargements réussis sont confirmés par un message de XLoader.

    Comment copier un firmware existant ?

    Téléchargez simplement le même fichier de micrologiciel que vous avez reçu par e-mail sur votre prochaine unité RFID DOMINATOR. Il fonctionnera de manière identique et reconnaîtra les mêmes bracelets et cartes RFID. Il n'y a aucune limite au nombre de clones que vous pouvez créer.

    Le nom de l’équipe peut-il être modifié ?

    Pas pour le moment, mais cela sera bientôt possible, lorsque l'extension des commandes AT sera terminée. Les noms d'équipe doivent comporter au maximum 3 lettres (cela sera limité par le logiciel).

    Le DOMINATOR peut-il être utilisé à l’extérieur ?

    DOMINATOR ne dispose pas de boîtier étanche. S'il est sec, il peut également être utilisé à l'extérieur. A utiliser principalement en intérieur ou sous un abri.

    Sous quelle forme DOMINATOR est-il disponible ?

    RFID DOMINATOR est disponible sous la forme de la version minimale du code source - buzzer supprimé, utilisation exclusive de l'écran LCD 20x4, max. 1 carte RFID par entité. Le bouton DOMINATOR est disponible sous forme de code machine .hex, qui peut être directement exécuté sur un MCU ATmega328P (Arduino Uno, Nano), sans accès au code source. Les fichiers de conception DPS, les fichiers .STL de la boîte imprimée en 3D ne sont pas fournis avec le logiciel.

    Questions fréquemment posées sur le dispositif RFID DOMINATOR 2.0 adapté à l'utilisation d'Airsoft et de Paintball
    RFID DOMINATOR - code source:
    Version minimale, 1 carte par équipe, sans buzzer, uniquement pour écran LCD 20x4
    Essayez RFID DOMINATOR dans Wokwi Simulator ! - Cliquez ici
     
    //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
    }