[ Príspevok: 1 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 17.02.14
Prihlásený: 22.03.19
Príspevky: 381
Témy: 147 | 147
Bydlisko: Poprad

Dnes by som vám rád predstavil projekt, ktorý som kedysi vytváral pre airsoftový tím. Hlavnou požiadavkou bolo naprogramovať zariadenie - DOMINATOR, ktorý by bolo možné ovládať za pomoci RFID tagov, náramkov a kariet.

Čo ten DOMINATOR vlastne je?
Jedná sa o zariadenie, ktoré sa používa pri hraní herného módu King of the Hill, teda kráľa kopca (bodu). Zariadenie by malo disponovať displejom s dvomi časmi pre oba herné tímy. Tím, ktorý sa k DOMINATOR-u dostane stlačí tlačidlo (pri mechanickej verzii) a čas sa začne pripočítavať jeho tímu. (Oba časy sú počiatočne nastavené na 00 hodín, 00 minút a 00 sekúnd). Čas sa pripočítava do momentu, kým bod neobsadí iný tím a tlačidlom nezmení pripočítavanie času na svoju stranu, respektíve v tomto prípade som využil som RFID čítačku, ktorá dokáže čítať karty a kľúčenky na 13.56MHz (existuje aj ekvivalent na 125kHz) a týmto spôsobom môžeme nahradiť mechanické tlačidlá.
Airsoft / Paintball DOMINATOR - Arduino + RFID

Ako teda systém funguje s RFID čítačkou oproti mechanickým tlačidlám?
RFID čítačka dokáže čítať karty a kľúčenky na spomínanej frekvencii vo vzdialenosti do 3-5cm. Vyžaduje sa teda fyzická prítomnosť niektorého člena tímu. Každý člen tímu má kartu, alebo kľúčenku, ktorej kód je vopred zaznamenaný a uložený do programu. Každý kód je priradený k tímu. Načítanie karty signalizuje aj hlásič - buzzer, ktorý oznamuje zmenu. Čas sa začne pripočítavať tímu, ktorý kartu, alebo kľúčenku priložil. Okrem dvoch tímov som využil aj špeciálne kľúčenky pre organizátora, ktorý dokáže po priložení karty zapauzovať čas v prípade sťažnosti hráča na zásah, zranenie, alebo kvôli inej situácii v hre, ktorá by mohla inému tímu priniesť výhodu. Súčasťou systému je ešte jeden používateľ - tzv. eraser, ktorý dokáže časy vynulovať a zapauzovať zároveň. Používa sa napríklad pri neplatnom odštartovaní hry, neplatnom priložení kľúčenky (napríklad vyradený hráč). Systém nie je limitovaný počtom členov tímu, záleží najmä od pamäťovej náročnosti pre beh programu, nakoľko celý systém pracuje s interným timerom - millisom.

Aký hardvér bol využitý?
    Riadiaci mikrokontróler - Arduino Nano/Atmega328P

    2x led diódy - indikácia, ktorému tímu sa pripočítava čas (modrá/červená)
    20x4 LCD displej - displej s real-time časmi tímov
    2x relé - pre pripojenie svetiel na 230V (SSR/elmg.) - napríklad v noci - funkčnosť na základe ledky
    1x hlásič
    1x RFID čítačka RC522 na 13.56MHz
    12x karty/kľúčenky/tagy (5x pre tímy, 1x organizátor, 1x eraser)

Princíp programu: Program pracuje s millisom, čo je procesorový čas od zapnutia. V pravidelných intervaloch, raz za 0.01 sekundy sa vykoná logika systému, ktorá overuje, či sa už niektorému tímu má pripočítavať čas, ak áno, čas sa počíta a vyobrazuje, teda 100x sa vypíše na LCD displej za sekundu, teda 100x refresh/sekunda. Pri využití intervalu 0.001 sekundy bol systém nepresný a komunikácia s rýchlosťou 1000x refresh/sekunda po I2C zbernici na displej nefungovala korektne, nakoľko nejaký čas zaberalo aj samotné čítanie kariet. Knižnica RFID pre čítačku RC522 dokáže prerušením indikovať záznam karty, čo aktivuje hlásič. Na základe výsledku overenia cez jednoduchú if podmienku s adresami kariet (fyzickými) aktivujeme premennú, ktorá pracuje s časom a má v sebe logiku - desatiny, sekundy, minúty a hodiny.

V systéme sú 2 podprogramy, ktoré sú tvorené bool premennými. Každá bool premenná je pre jeden tím. Ak sa nastaví na true, začne sa vykonávať logika pre ten daný tím. Ak sa priloží kľúčenka rovnakého tímu, nič sa nezmení. Ak sa priloží kľúčenka iného tímu, bool pre tím, ktorému sa počítač čas sa zmení na false a pre tím, ktorému sa začne počítať čas na true. Ak kľúčenku priloží organizátor, obe bool premenné sa nastavia na false. Hodnoty - sekundy, minúty a hodiny sú uložené v dynamických globálnych premenných, s ktorými sa vo vnútrie true boolových hodnôt pracuje. Ak kľúčenku priloží eraser, obe bool premenné sa nastavia na false a všetky globálne premenné na 0.

Aký je maximálny časový rozsah systému?
Maximálny časový rozsah pri aktuálnom nastavení pozície na LCD displeji je maximálny rozsah 99 hodín, 59 minút, 59 sekúnd. V skutočnosti ale systém dokáže bežať až takmer 50 dní do pretečenia millisu. Pre koho je systém vhodný? Systém je vhodný pre tímy, amatérskych hráčov, ktorí si chcú hru prikrášliť, taktiež aj pre niekoľko-dňové akcie typu Fort Benning, možnosť využiť v externých i interných priestoroch, vhodné aj pre športový areál prevádzkujúci Airsoft/Paintball. Nastavenie adries a program sa nahrá iba raz a funguje nepretržite, až ho hráči "zodrú" I keď... Skôr zničia.. Celý systém je možné osadiť i na DPS. Rozmer závisí najmä od použitého displeja, dá sa použiť 20x4 ako na foto vyššie, alebo 16x2, ktorý dokáže výrazne zmenšiť výsledný rozmer DPS.

Niečo z testovania: - princíp funkčnosti - VIDEO:
Youtube: https://www.youtube.com/watch?v=cx90uJY1UUM

Wiring Arduino pin --> periféria (kompatibilné pre R3 dosky + Nano)
Arduino a prepojenie s LCD s I2C prevodníkom:
    A4 --> SDA
    A5 --> SCK/SCL
    5V --> Vcc
    GND --> GND

Arduino a prepojenie s čítačkou:
    RC522 3.3V --> 3.3V
    GND --> GND
    D9 --> RST
    D10 --> CS
    D11 --> MOSI
    D12 --> MISO
    D13 --> SCK

Arduino a prepojenie hlásiča - v prípade 3-pinového treba priviesť ešte 5V z Arduina:
    D5 --> INPUT
    GND --> GND

Arduino a prepojenie LED + relé:
    5V --> 5V relé
    GND --> GND
    D3--> Anóda dióda + relé IN1
    D4 --> Anóda dióda + relé IN2

Knižnice:

Program pre Arduino (načítanie adries kariet a kľúčeniek):
Kód:
#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN         9
#define SS_1_PIN        10
#define NR_OF_READERS   1
byte ssPins[] = {SS_1_PIN};
MFRC522 mfrc522[NR_OF_READERS];
void setup() {
  Serial.begin(9600);
  while (!Serial);
  SPI.begin();
  for (uint8_t reader = 0; reader < NR_OF_READERS; reader++) {
    mfrc522[reader].PCD_Init(ssPins[reader], RST_PIN);
    Serial.print(F("Reader "));
    Serial.print(reader);
    Serial.print(F(": "));
    mfrc522[reader].PCD_DumpVersionToSerial();
  }
}

void loop() {
  for (uint8_t reader = 0; reader < NR_OF_READERS; reader++) {
    if (mfrc522[reader].PICC_IsNewCardPresent() && mfrc522[reader].PICC_ReadCardSerial()) {
      Serial.print(F("Reader "));
      Serial.print(reader);
      Serial.print(F(": Card UID:"));
      dump_byte_array(mfrc522[reader].uid.uidByte, mfrc522[reader].uid.size);
      Serial.println();
      Serial.print(F("PICC type: "));
      MFRC522::PICC_Type piccType = mfrc522[reader].PICC_GetType(mfrc522[reader].uid.sak);
      Serial.println(mfrc522[reader].PICC_GetTypeName(piccType));
      mfrc522[reader].PICC_HaltA();
      mfrc522[reader].PCD_StopCrypto1();
    }
  }
}

void dump_byte_array(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
  }
  Serial.print("Kod:");
  unsigned long kod = 10000 * buffer[4] + 1000 * buffer[3] + 100 * buffer[2] + 10 * buffer[1] + buffer[0]; //finalny kod karty
  Serial.print(kod);
}


Fungujúci program s logikou systému s nutnosťou doplnenia vašich kariet:
Kód:
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN         9          // Configurable, see typical pin layout above
#define SS_1_PIN        10         // Configurable, take a unused pin, only HIGH/LOW required, must be diffrent to SS 2
#define SS_2_PIN        8          // Configurable, take a unused pin, only HIGH/LOW required, must be diffrent to SS 1

#define NR_OF_READERS   1

byte ssPins[] = {SS_1_PIN, SS_2_PIN};

MFRC522 mfrc522[NR_OF_READERS];   // Create MFRC522 instance.

#define I2C_ADDR    0x3F  // Define I2C Address where the PCF8574A is
                          // Address can be changed by soldering A0, A1, or A2
                          // Default is 0x27

// map the pin configuration of LCD backpack for the LiquidCristal class
#define BACKLIGHT_PIN 3
#define En_pin  2
#define Rw_pin  1
#define Rs_pin  0
#define D4_pin  4
#define D5_pin  5
#define D6_pin  6
#define D7_pin  7

LiquidCrystal_I2C lcd(I2C_ADDR,
                      En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin,
                      BACKLIGHT_PIN, POSITIVE);
unsigned long kod;
boolean run = false;
boolean run2 = false;
long timer = 0; //The timer
int second = 0;
int minute = 0;
int tenth = 0;
int hour =0;
int second2 = 0;
int minute2 = 0;
int tenth2 = 0;
int hour2 =0;
const int rfrele = 3;
const int gdprele = 4;
const int buzzer = 5;
void setup() {
  Serial.begin(9600);
  SPI.begin();
  pinMode(rfrele,OUTPUT);
  pinMode(gdprele,OUTPUT);
  pinMode(buzzer,OUTPUT);
    for (uint8_t reader = 0; reader < NR_OF_READERS; reader++) {
    mfrc522[reader].PCD_Init(ssPins[reader], RST_PIN); // Init each MFRC522 card
    Serial.print(F("Reader "));
    Serial.print(reader);
    Serial.print(F(": "));
    mfrc522[reader].PCD_DumpVersionToSerial();
  }
  lcd.begin(20, 4);                // intialise the LCD.
     lcd.setBacklight(HIGH); // Turn on backlight, LOW for off
  lcd.setCursor(0,0);
  lcd.print("  RP2018 DOMINATOR");
  lcd.setCursor(0,1);
   lcd.print("--------------------");
  lcd.setCursor(0,2);
  lcd.print("RF  00:00:00");
   lcd.setCursor(0,3);
   lcd.print("GDP 00:00:00");
}

void tickClock() {
  if((timer - millis()/100) >= 100 || timer == 0) {
    tick();
    tick2();
    timer = millis()/100;
  }
 
}

void loop() {
   for (uint8_t reader = 0; reader < NR_OF_READERS; reader++) {
    if (mfrc522[reader].PICC_IsNewCardPresent() && mfrc522[reader].PICC_ReadCardSerial()) {
      Serial.print(F("Reader "));
      Serial.print(reader);
      // Show some details of the PICC (that is: the tag/card)
      Serial.print(F(": Card UID:"));
      dump_byte_array(mfrc522[reader].uid.uidByte, mfrc522[reader].uid.size);
      Serial.println();
      Serial.print(F("PICC type: "));
      MFRC522::PICC_Type piccType = mfrc522[reader].PICC_GetType(mfrc522[reader].uid.sak);
      Serial.println(mfrc522[reader].PICC_GetTypeName(piccType));

      // Halt PICC
      mfrc522[reader].PICC_HaltA();
      // Stop encryption on PCD
      mfrc522[reader].PCD_StopCrypto1();
    } //if (mfrc522[reader].PICC_IsNewC
  } //for(uint8_t reader
  if(kod==4294946665 || kod==23101 || kod==8151 || kod==4294951443 || kod==4294953039 || kod==24519 || kod==4294945657 || kod==3801 || kod==4294945187){
     
       digitalWrite(rfrele, LOW);
             digitalWrite(gdprele, HIGH);
      run = false;
      run2 = true;
        }else if(kod==4294956915 || kod==4294958051 || kod==4294961082 || kod==4294960491 || kod==4294958039 || kod==4294958091 || kod==4294946987 || kod==4294961057 || kod==4294959927){
       
           digitalWrite(rfrele, HIGH);
             digitalWrite(gdprele, LOW);
          run = true;
      run2 = false;
          }else if(kod==12619){
           
             digitalWrite(rfrele, LOW);
             digitalWrite(gdprele, LOW);
            run = false;
      run2 = false;
            }else if(kod==4294962506){
           
             digitalWrite(rfrele, LOW);
             digitalWrite(gdprele, LOW);
       second = 0;
 minute = 0;
 tenth = 0;
 hour =0;
 second2 = 0;
 minute2 = 0;
 tenth2 = 0;
 hour2 =0;
 updateLCD();
 updateLCD2();
  run = false;
      run2 = false;
              }
  tickClock(); //Start ticking the clock
}

void tick() {
  if(run) {
    updateLCD();
   
   
   
    if(tenth == 9) {
      tenth = 0;
     
      if(second == 59) {
        second = 0;
        minute++;
       
      }else {
        second++;
      }
     
      if(minute == 60) {
        minute = 0;
        hour++;
       
      }
    } else {
    tenth++;
    }
  }
}
void tick2() {
  if(run2) {
    updateLCD2();
   
   
   
    if(tenth2 == 9) {
      tenth2 = 0;
     
      if(second2 == 59) {
        second2 = 0;
        minute2++;
       
      }else {
        second2++;
      }
     
      if(minute2 == 60) {
        minute2 = 0;
        hour2++;
       
      }
    } else {
    tenth2++;
    }
  }
}
void updateLCD() {
   lcd.setCursor(4,2);
 if(hour < 10) {      // If hour does not have 2 digits
    lcd.print("0");
  }
   lcd.print(hour, DEC);
  lcd.print(":");
  if(minute < 10) {      // If hour does not have 2 digits
    lcd.print("0");
  }
  lcd.print(minute, DEC);
  lcd.print(":");

  if(second < 10) {    // If minute does not have 2 digits
    lcd.print("0");
  }
  lcd.print(second, DEC);
  //
 
}
void updateLCD2() {
  lcd.setCursor(4,3);
  if(hour2 < 10) {      // If hour does not have 2 digits
    lcd.print("0");
  }
   lcd.print(hour2, DEC);
  lcd.print(":");
  if(minute2 < 10) {      // If hour does not have 2 digits
    lcd.print("0");
  }
  lcd.print(minute2, DEC);
  lcd.print(":");

  if(second2 < 10) {    // If minute does not have 2 digits
    lcd.print("0");
  }
  lcd.print(second2, DEC);
 
}












void dump_byte_array(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {

  }
  kod = 10000*buffer[4]+1000*buffer[3]+100*buffer[2]+10*buffer[1]+buffer[0]; 
    tone(buzzer, 4000, 100);
  Serial.println("Zaznamenany kod karty: ");
  Serial.println(kod);
}


Ak vás projekt zaujal, navštívte i môj web, kde sa môžete o projekte dozvedieť viac: https://arduino.php5.sk/airsoft-dominator.php
Cieľom článku bolo ukázať využitie Arduina ako herného prvku - DOMINATORA pre extrémne športy typu Airsoft, Paintball, Nerf Wars.


 [ Príspevok: 1 ] 


Airsoft / Paintball DOMINATOR - Arduino + RFID



Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy.

DOMINATOR cez Arduino pre Airsoft / Paintball / Nerf Wars

v Články

2

1784

30.11.2018 21:41

eon5

V tomto fóre nie sú ďalšie neprečítané témy.

Airsoft & Paintball

[ Choď na stránku:Choď na stránku: 1 ... 26, 27, 28 ]

v Šport a pohyb

826

30549

03.11.2013 18:21

SNAKE_3

V tomto fóre nie sú ďalšie neprečítané témy.

Capture points (DOMINATION) - Airsoft - Arduino + WiFi

v Články

0

2568

24.02.2019 0:27

martinius96

V tomto fóre nie sú ďalšie neprečítané témy.

Paintball v BA

v Voľný čas a hobby

4

521

24.06.2009 21:11

Andreso

V tomto fóre nie sú ďalšie neprečítané témy.

Airsoft-AK47

v Šport a pohyb

28

1643

30.10.2009 18:06

Svolo

V tomto fóre nie sú ďalšie neprečítané témy.

Gotcha! paintball (pc hra) internet

v Počítačové hry

0

673

07.03.2010 11:48

Nick_177

V tomto fóre nie sú ďalšie neprečítané témy.

Otazka o RFID

v Operačné systémy Microsoft

2

85

28.10.2013 22:47

sqbo

V tomto fóre nie sú ďalšie neprečítané témy.

RFID chips READ-WRITE (windows)

v Ostatné programy

2

105

08.01.2014 2:02

Sayllo

V tomto fóre nie sú ďalšie neprečítané témy.

I/P: Airsoft samopal Tokyo Marui MP5A4

v Predám

19

1192

01.06.2012 18:37

Sabone

V tomto fóre nie sú ďalšie neprečítané témy.

Arduino

v Assembler, C, C++, Pascal, Java

6

216

05.04.2018 17:25

ado130

V tomto fóre nie sú ďalšie neprečítané témy.

Externé disky Freecom s ochrannou technologiou RFID

v Novinky

5

491

12.07.2009 23:15

mimkork

Táto téma je zamknutá, nemôžete posielať nové príspevky alebo odpovedať na staršie.

P: Airsoft - KWC SIG SAUER GSR 1911 METAL CO2

v Predám

4

324

23.11.2013 11:58

DJ46

V tomto fóre nie sú ďalšie neprečítané témy.

RFID systém so správou on-line s wifi konektivitou

v Články

1

2232

26.01.2019 23:35

martinius96

V tomto fóre nie sú ďalšie neprečítané témy.

Populárny RFID čip používaný aj v londýnskom metre cra

v Novinky

3

391

07.10.2008 19:48

Svolo

V tomto fóre nie sú ďalšie neprečítané témy.

Cena RFID čipu sa zníži na cent, budú všade

v Novinky

1

780

16.03.2007 15:57

marzo

V tomto fóre nie sú ďalšie neprečítané témy.

Arduino 8bit computer

v Mikropočítače

1

456

20.02.2015 13:34

jankalman



© 2005 - 2019 PCforum, edited by JanoF