RFID DOMINATOR: Stoper dominacji dla Airsoft, Paintball
O RFID DOMINATOR – Airsoft Stoper
RFID DOMINATOR to stoper stworzony do Airsoft, Paintball, który zwiększa wrażenia z gry i wprowadza uczciwość. Nadają się do trybu gry DOMINATOR, Capture the Point. DOMINATOR tworzy punkt, który jest zajmowany przez gracza drużyny. Urządzenie zawiera wyświetlacz LCD, który informuje o aktualnym czasie każdej drużyny. W tym samym czasie dioda LED sygnalizuje aktywną drużynę na punkcie. Gracz zajmuje punkt DOMINATOR, przyczepiając bransoletkę lub kartę RFID. Gdy punkt jest zajęty, rozlega się sygnał dźwiękowy, ogłaszający zmianę punktu. Czas drużyny jest liczony do momentu, aż gracz z innej drużyny przyczepi swój znacznik RFID lub do momentu zatrzymania czasu przez sędziego. Czas jest nadal liczony po zajęciu punktu. DOMINATOR zlicza całkowity czas zajmowany przez wszystkie drużyny w grze. Może być używany dla 2 lub 4 drużyn w jednej grze. Oprócz zatrzymania zegara, sędzia może również zresetować go przed nową grą.
Scenariusze użycia
Idealne na place zabaw, pola oferujące doświadczenie Airsoft / Paintball. Wydarzenia takie jak LARP, MilSim, Scenario, Speedball, ze względu na rozmiar flasha, który obsługuje setki tagów RFID w jednej aplikacji
Obsługiwany sprzęt
Z płytką PCB RFID DOMINATOR 2.0 następujące komponenty są kompatybilne
WERSJA DEMO firmware
RFID DOMINATOR oferuje bezpłatne oprogramowanie DEMO, które umożliwia przetestowanie urządzenia i jego podstawowych funkcji, jeśli jest prawidłowo podłączone, zgodnie ze schematami dostępnymi na stronie internetowej RFID DOMINATOR
Modułowa konstrukcja, przenośne oprogramowanie układowe
Modułowa konstrukcja RFID DOMINATOR pozwala użytkownikowi na wymianę głównych komponentów bez konieczności lutowania czegokolwiek. Dzięki metodzie hot-swap może on wyjąć moduł i włożyć nowy w ciągu kilku sekund. Użytkownik może kopiować i klonować oprogramowanie układowe na dowolną liczbę swoich urządzeń. Zapłać licencję raz, używaj tyle razy, ile potrzebujesz dla swoich urządzeń.
Przystępna cena
Możliwość klonowania
Łatwy do użycia
Open-source przyjazny dla sprzętu
Włączone RFID
Konstrukcja modułowa
Wyświetl wyjście
Pomoc i opinie
Szczegóły
PCB
Specyfikacje PCB RFID DOMINATOR 2.0
104 x 103 x 1,6 mm, dwustronna PCB typu FR4. Sitodruk na PCB oznacza położenie i orientację komponentów, sposób ich lutowania.
Obsługa sprzętu typu open source
Sprzęt zgodny ze sprzętem typu open source
Sprzęt RFID DOMINATOR jest związany z wykorzystaniem sprzętu typu open source. Wykorzystuje moduły Arduino i samą płytkę Arduino do modułowej konstrukcji i zalet sprzętu typu open source (opłacalność, łatwość wymiany).
Zmontowana PCB
Widok PCB po złożeniu z kompatybilnych komponentów
Po złożeniu PCB RFID DOMINATOR 2.0 całkowita wysokość PCB została zwiększona do 45 mm. Na przedniej stronie znajduje się ekran LCD2004A i czytnik MFRC522, a także diody LED i brzęczyk. Z tyłu znajduje się kontroler Arduino Nano V3.0. Główne komponenty wykorzystują złącza pinowe.
Obudowa
Obudowa drukowana w 3D dla RFID DOMINATOR 2.0
Obudowa kompatybilna z PCB RFID DOMINATOR 2.0. Wymiary obudowy to 124 x 123 x 47 mm. Sama płytka PCB jest montowana od wewnątrz, na przedniej stronie obudowy za pomocą 4 śrub M3. Można użyć paska ściągającego o szerokości 25 mm na obudowie, aby zamontować ją na drzewie, belce.
Schemat połączeń
Schemat połączeń dla RFID DOMINATOR 2.0
Schemat połączeń pokazuje, jak Arduino Nano jest połączone ze wszystkimi innymi komponentami. W przypadku LCD2004A zastosowano magistralę I2C okablowaną sprzętowo, a w przypadku MFRC522 magistralę SPI. Dodatkowe GPIO są używane do wskazań diod LED i do brzęczyka z obsługą PWM.
Przycisk DOMINATOR
Prototyp mechanicznego przycisku DOMINATOR
Standardowa płytka PCB RFID DOMINATOR 2.0 może być również używana z przyciskiem DOMINATOR. Jedyną zmianą jest usunięcie czytnika RFID i wstawienie dwóch przycisków o opcjonalnej średnicy, co umożliwia również użycie przycisków z podświetleniem LED.
Galeria
Często zadawane Pytania
Poniżej znajdują się najczęściej zadawane pytania od naszej społeczności.
Jakie jest zużycie energii przez system?
System zazwyczaj zużywa 40–60 mAh przy 5 V, co odpowiada 0,2–0,3 W. Źródło zasilania o pojemności 2000 mAh może zasilać system przez 30–35 godzin, w zależności od obciążenia.
Czy mogę zasilać go za pomocą powerbanku?
Tak, RFID DOMINATOR może być zasilany bezpośrednio za pomocą powerbanku przez jego wyjście 5 V. RFID DOMINATOR wymaga złącza MiniUSB, mogą być również dostępne wersje Arduino Nano ze złączem microUSB.
Jak mogę przesłać oprogramowanie układowe?
Niezależnie od tego, czy jest to oprogramowanie układowe DEMO czy FINAL, użyj dostarczonego pliku .hex zgodnego z Arduino. Prześlij je za pomocą narzędzia XLoader. W przypadku Arduino Nano ze starym bootloaderem ustaw prędkość na 57600 bodów/s, w przypadku nowego bootloadera użyj 115200 bodów/s. Pomyślne przesłanie jest potwierdzane komunikatem z XLoadera, który może poinformować Cię o nieudanym procesie przesyłania.
Jak skopiować istniejące oprogramowanie układowe?
Po prostu prześlij ten sam plik oprogramowania układowego (.hex), który otrzymałeś e-mailem, do swojego kolejnego urządzenia RFID DOMINATOR. Będzie ono działać w ten sam sposób i będzie reagować na te same opaski i karty RFID. Nie ma ograniczeń co do liczby klonów, które możesz utworzyć, to zależy od Ciebie.
Czy można zmienić nazwę zespołu?
Na razie nie, ale wkrótce będzie to możliwe, gdy rozszerzenie poleceń AT zostanie ukończone. Nazwy zespołów muszą mieć maksymalnie 3 litery (oprogramowanie będzie tego ograniczać).
Czy DOMINATOR może być używany na zewnątrz?
DOMINATOR nie ma wodoodpornej obudowy. Jeśli jest sucho, można go używać również na zewnątrz. Głównie w pomieszczeniach lub pod zadaszeniem.
W jakiej formie dostępny jest DOMINATOR?
RFID DOMINATOR dostępny jest w wersji minimalnej z kodem źródłowym - usunięty buzzer, wyłączne wykorzystanie wyświetlacza LCD 20x4, max. 1 karta RFID na podmiot. Przycisk DOMINATOR jest dostępny w postaci kodu maszynowego .hex, który można uruchomić bezpośrednio na MCU ATmega328P (Arduino Uno, Nano) bez dostępu do kodu źródłowego. Pliki projektów DPS i pliki .STL wydrukowanego w 3D pudełka nie są dostarczane z oprogramowaniem.
RFID DOMINATOR – kod źródłowy:
Wersja minimalna, 1 karta na drużynę, bez brzęczyka, tylko dla wyświetlaczy LCD 20x4
Wypróbuj RFID DOMINATOR w Wokwi Simulator! – Kliknij tutaj
//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
}
