Устройство RFID DOMINATOR с печатной платой, установленное в корпусе

RFID DOMINATOR: Лучший секундомер для страйкбола и пейнтбола

О RFID DOMINATOR – революционный соревновательный игровой процесс

RFID DOMINATOR — это современный секундомер, созданный для страйкбола, пейнтбола и других соревновательных видов спорта, повышающий уровень стратегии и вовлеченности в каждом матче.

Это передовое устройство оснащено встроенным дисплеем, который отслеживает общее время занятия контрольной точки, что делает его незаменимым для организованных мероприятий и командных соревнований.

Благодаря технологии RFID игроки могут без труда заявить о своем контроле, приложив свой браслет RFID или карту к устройству. Секундомер издает звуковой сигнал, указывающий на смену команды, а таймер продолжает отсчет для активной команды, пока игрок противника не заберет очко или судья не остановит игру.

Судьи также имеют возможность сбрасывать таймер при необходимости, обеспечивая бесшовный и честный игровой процесс.

RFID DOMINATOR, разработанный для универсальности, поддерживает стандартные матчи с двумя командами и может быть расширен для размещения до четырех команд в одном соревновании.

Повысьте свое конкурентное преимущество и переопределите свой способ игры с RFID DOMINATOR!

Сценарии применения

Идеально подходит для игровых площадок, полей, предлагающих опыт страйкбола/пейнтбола. Такие мероприятия, как LARP, MilSim, Scenario, Speedball, благодаря размеру вспышки, который поддерживает сотни RFID-меток в одном приложении

Поддерживаемое оборудование

With RFID DOMINATOR 2.0 PCB, the following components are compatible

  • Arduino Nano V3.0
  • Считыватель RFID-RC522 MFRC522
  • ЖК-дисплей 2004A с преобразователем I2C
  • Зуммер с шагом 7,62 мм.
  • Светодиоды THT 5 мм.
  • Резисторы THT
  • ДЕМО прошивка

    RFID DOMINATOR предлагает бесплатную ДЕМО-прошивку, которая позволяет вам протестировать устройство и его основные функции, если оно подключено правильно, как показано на схемах, доступных на веб-странице RFID DOMINATOR.

    Модульная конструкция, Портативная прошивка

    Модульная конструкция RFID DOMINATOR позволяет пользователю заменять основные компоненты без необходимости что-либо паять. С помощью метода горячей замены он может снять модуль и установить новый за считанные секунды. Пользователь может копировать и клонировать прошивку на любое количество своих устройств. Оплатите лицензию один раз, используйте столько раз, сколько вам нужно для ваших устройств.

    Доступный

    Клонируемый

    Легко использовать

    Совместимость с Arduino HW

    RFID включен

    Модульная конструкция

    Вывод на дисплей

    Поддержка и обратная связь

    Подробности

    Чек RFID DOMINATOR
    PCB of RFID DOMINATOR 2.0 and RFID DOMINATOR 1.0. Comparsion of differences

    PCB

    Технические характеристики печатной платы RFID DOMINATOR 2.0

    104 x 103 x 1,6 мм, двухсторонняя печатная плата типа FR4. Шелкография на печатной плате отмечает положение и ориентацию компонентов, как их нужно паять.

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

    Поддержка оборудования с открытым исходным кодом

    Аппаратное обеспечение, совместимое с оборудованием с открытым исходным кодом

    Аппаратное обеспечение RFID DOMINATOR связано с использованием оборудования с открытым исходным кодом. Оно использует модули Arduino и саму плату Arduino для модульной конструкции и преимуществ оборудования с открытым исходным кодом (рентабельность, простота замены).

    Assembled PCB of RFID DOMINATOR 2.0

    Собранная печатная плата

    Вид на печатную плату после сборки совместимыми компонентами

    После сборки печатной платы RFID DOMINATOR 2.0 общая высота печатной платы увеличивается до 45 мм. На передней стороне находится экран LCD2004A и считыватель MFRC522, а также светодиоды и зуммер. С задней стороны находится контроллер Arduino Nano V3.0. Основные компоненты используют штыревые разъемы.

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

    Корпус

    3D-печатный корпус для RFID DOMINATOR 2.0

    Корпус совместим с печатной платой RFID DOMINATOR 2.0. Размеры корпуса 124 x 123 x 47 мм. Сама печатная плата крепится изнутри, на передней стороне корпуса, с помощью 4 винтов M3. На корпусе можно использовать стяжной ремень шириной 25 мм для крепления его на дереве, балке.

    Schematics, wiring diagrams for RFID DOMINATOR 2.0 hardware

    Схема электропроводки

    Схема электропроводки для RFID DOMINATOR 2.0

    Схема электропроводки показывает, как Arduino Nano подключается ко всем остальным компонентам. Для LCD2004A используется аппаратно подключенная шина I2C, а для MFRC522 — SPI-шина. Дополнительные GPIO используются для светодиодных индикаторов и для зуммера с поддержкой ШИМ.

    Таймер доминирования кнопки - DOMINATOR для страйкбола и пейнтбола

    Кнопка ДОМИНАТОР

    Прототип механической кнопки DOMINATOR

    Стандартная печатная плата RFID DOMINATOR 2.0 также может использоваться для Button DOMINATOR. Единственное изменение заключается в том, что RFID-считыватель убирается, а вместо него устанавливаются две кнопки с дополнительным диаметром. Также возможно использование кнопок со светодиодной подсветкой.

    Часто задаваемые вопросы

    Ниже приведены наиболее часто задаваемые вопросы нашего сообщества.

    Каково энергопотребление системы?

    Система обычно потребляет 40–60 мАч при 5 В, что эквивалентно 0,2–0,3 Вт. Источник питания емкостью 2000 мАч может обеспечить работу системы в течение 30–35 часов в зависимости от нагрузки.

    Могу ли я питать его через Powerbank?

    Да, RFID DOMINATOR можно питать напрямую через Powerbank через его выход 5 В.

    Как загрузить прошивку?

    Будь то ДЕМО или ФИНАЛЬНАЯ прошивка, используйте предоставленный файл .hex, совместимый с Arduino. Загрузите его с помощью инструмента XLoader. Для Arduino Nano со старым загрузчиком установите скорость 57600 бод/с; для нового загрузчика используйте 115200 бод/с. Успешная загрузка подтверждается сообщением от XLoader.

    Как скопировать существующую прошивку?

    Просто загрузите тот же файл прошивки, который вы получили по электронной почте, на свой следующий блок RFID DOMINATOR. Он будет функционировать идентично и распознавать те же браслеты и карты RFID. Нет ограничений на количество создаваемых клонов.

    Можно ли изменить название команды?

    В данный момент нет, но скоро это станет возможным, когда будет завершено расширение AT-команд. Названия команд должны содержать максимум 3 буквы (это будет ограничено программным обеспечением).

    Можно ли использовать DOMINATOR на открытом воздухе?

    У DOMINATOR нет водонепроницаемого бокса. Если он сухой, его можно использовать и на открытом воздухе. Используйте в основном в помещении или под навесом.

    В какой форме доступен DOMINATOR?

    RFID DOMINATOR доступен в виде исходного кода минимальной версии – удален зуммер, эксклюзивное использование ЖК-дисплея 20х4, макс. 1 RFID-карта на предприятие. Кнопка DOMINATOR доступна в виде машинного кода .hex, который можно запускать непосредственно на микроконтроллере ATmega328P (Arduino Uno, Nano) без доступа к исходному коду. Файлы дизайна DPS и файлы .STL коробки, напечатанной на 3D-принтере, не поставляются с программным обеспечением.

    Часто задаваемые вопросы об устройстве RFID DOMINATOR 2.0, подходящем для использования в страйкболе и пейнтболе
    RFID DOMINATOR - исходный код
    Минимальная версия, 1 карта на команду, без звукового сигнала, только для ЖК-дисплея 20x4
    Попробуйте RFID DOMINATOR в Wokwi Simulator! - Нажмите здесь
     
    //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
    }