Repozitár s testovacími programovými implementáciami pre Airsoft body: Airsoft - WiFi body - Arduino
Firmvér je dostupný zdarma
Arduino DOMINATOR WiFi Stopky Schéma Tlačidlo Capture Points Paintball

WiFi body pre Airsoft | Paintball


Entity v projekte WiFi body:


Tím RED - tlačidlo pre používateľský vstup
Tím RED
Tím GRE - tlačidlo pre používateľský vstup
Tím GRE

Popis projektu WiFi body:


Herný režim Capture Points pre športy Airsoft, Paintball. Body medzi sebou komunikujú prostredníctvom WiFi modulov z rady nRF24L01, pričom si medzi sebou vymieňajú informácie o stave bodu (či je obsadený a akým tímom). Jeden bod je permanentný vysielač a vyžaduje komunikáciu od druhého bodu. Druhý bod je prijímačom a odpovedá na prijatie dát vysielaču, tým sa zamedzuje kolíziám pri komunikácii na WiFi frekvencii 2.4 GHz. Každý z bodov využíva riadiaci mikrokontróler Arduino (Arduino Uno / Nano), prípadne samostatný čip (Atmel) AtMega328P, ktorý ovláda celú logiku systému. V hre sú 2 tímy - RED tím a GRE tím, ktoré proti sebe hrajú a snažia sa obsadiť oba body stlačením príslušného tlačidla. Tlačidlový vstup indikuje akciu obsadenia bodu členom tímu RED, alebo GRE. Využívajú sa spínacie tlačidlá zapojené v režime INPUT_PULLUP. Stlačením tlačidla sa privedie GND signál na vstupný digitálny vývod Arduina (Active-LOW spínací signál). Dĺžka stlačenia / počet stlačení sa neovuje a nie je konfigurovateľný. Bod reaguje okamžite na stlačenie tlačidla. Hra sa končí v momente, kedy sú obsadené oba body rovnakým tímom. Zmenu na bode indikuje hlásič, pri konci hry oba hlásiče pípajú v nekonečnej slučke a zároveň sa preruší WiFi komunikácia medzi modulmi nRF24L01. WiFi moduly nRF24l01 komunikujú na 2,4 GHz. nRF24l01 (bez + PA + LNA) komunikujú na cca 70 metrov, nRF24l01 + PA + LNA aj na kilometer, respektíve v lese a inak zarušenom prostredí na úrovni 450-700 metrov pri maximálnom vysielacom výkone. Pri externom napájaní je nutné použiť adaptér YL-s 3.3V prevodníkom a napájať cez externý adaptér. Nepoužívať 5V napájanie z Arduina, hrozí zničenie regulátora, rovnako tak ani 3V3 vývod nie je vhodný pre napájanie modulu, nakoľko má vysoký prúdový odber vo výkonnejších vysielacích režimoch. Reštart oboch bodov prebieha za pomoci reset tlačidla Arduín, alebo vytiahnutím a pripojením napájania (power-on cyklus).

Bezdrôtové moduly komunikujú na 2.4GHz, nie je to technológia WiFi, nevyžadujú router, alebo prístupový bod! Moduly majú vlastný komunikačný kanál s možnosťou voľby až 140 kanálov.

Podporované rýchlosti modulov nRF24L01:


  • 250 kbps - u starších nRF24L01 nie je táto možnosť podporovaná!
  • 1 Mbps
  • 2 Mbps

  • Výkonové režimy modulov nRF24L01:


  • RF24_PA_MIN=-18dBm
  • RF24_PA_LOW=-12dBm
  • RF24_PA_MED=-6dBM
  • RF24_PA_HIGH=0dBm

  • Bloková schéma - WiFi body - Airsoft:


    Bloková schéma / Block scheme - Capture Points - Airsoft / Paintball, Arduino, nRF24L01

    Kompatibilný riadiaci hardvér pre WiFi Airsoft body:



    Periférie pre WiFi Airsoft body:


    2x WiFi modul nRF24L01 / nRF24L01 + PA + LNA
    2x WiFi modul nRF24L01 / nRF24L01 + PA + LNA
    Spínacie tlačidlo (pushbutton)
    4x spínacie tlačidlo (pushbutton)
    Hlásič
    2x Hlásič
    2x LED diódy
    4x LED diódy

    Schéma zapojenia - WiFi body


    WiFi body - DOMINATOR - schéma zapojenia - Arduino / Airsoft, stopwatch, DOMINATION

    WiFi body - testovacie zapojenie


    WiFi body - - Arduino pre Airsoft, Paintball

    WiFi body - Capture Points - Ukážka funkčnosti:


    Tabuľkové zapojenie vývodov - WiFi body - plne odpovedá schéme zapojenia:

    Arduino Uno / Nano (AtMega328P) nRF24L01
    GND GND
    3V3 / externý zdroj Vcc
    D3 CSN
    D4 CE
    D11 MOSI
    D12 MISO
    D13 SCK
    Arduino Uno / Nano (AtMega328P) LED diódy
    GND GND
    D7 IN (RED)
    D8 IN (GREEN)
    Arduino Uno / Nano (AtMega328P) Tlačidlá (INPUT_PULLUP)
    GND GND
    D5 IN (RED)
    D6 IN (GRE)
    Arduino Uno / Nano (AtMega328P) Buzzer
    D2 IO
    GND GND

    Program - WiFi body


    Program - NODE 1 (permanentný vysielač)


    // nRF24L01 transmitter
    #include <SPI.h>
    #include "RF24.h"
    #define CE 4
    #define CS 3
    RF24 nRF(CE, CS);
    int response = 8;
    int received = 12;
    const int buzzer = 2;
    const int red_team = 5;
    const int blue_team = 6;
    const int red_led = 7;
    const int blue_led = 8;
    byte adresaPrijimac[] = "prijimac00";
    byte adresaVysilac[] = "vysilac00";
    void setup() {
      Serial.begin(9600);
      pinMode(buzzer, OUTPUT);
      pinMode(red_led, OUTPUT);
      pinMode(blue_led, OUTPUT);
      pinMode(red_team, INPUT_PULLUP);
      pinMode(blue_team, INPUT_PULLUP);
      nRF.begin();
      nRF.setDataRate( RF24_250KBPS );
      nRF.setPALevel(RF24_PA_LOW);
      nRF.openWritingPipe(adresaVysilac);
      nRF.openReadingPipe(1, adresaPrijimac);
      nRF.startListening();
    }
    
    void loop() {
      if (response == received) {
        tone( buzzer, 900, 800);
        delay(1000);
      } else {
        nRF.stopListening();
        int output_red = digitalRead(red_team);
        int output_blue = digitalRead(blue_team);
        if (output_red == LOW) {
          response = 1;
          digitalWrite(red_led, HIGH);
          digitalWrite(blue_led, LOW);
        } else if (output_blue == LOW) {
          response = 2;
          digitalWrite(red_led, LOW);
          digitalWrite(blue_led, HIGH);
        }
        nRF.write( &response, sizeof(response) );
        nRF.startListening();
        while (nRF.available()) {
          nRF.read( &received, sizeof(received) );
        }
        Serial.println("Received datas: ");
        Serial.println(received);
        Serial.println("Response: ");
        Serial.println(response);
        delay(50);
      }
    }
    

    Program - NODE 2 (permanentný prijímač s callbackom na vysielač)


    // nRF24L01 receiver
    #include <SPI.h>
    #include "RF24.h"
    int response = 3;
    int received = 4;
    const int buzzer = 2;
    const int red_team = 5;
    const int blue_team = 6;
    const int red_led = 7;
    const int blue_led = 8;
    #define CE 4
    #define CS 3
    RF24 nRF(CE, CS);
    byte adresaPrijimac[] = "prijimac00";
    byte adresaVysilac[] = "vysilac00";
    void setup() {
      Serial.begin(9600);
      pinMode(buzzer, OUTPUT);
      pinMode(red_led, OUTPUT);
      pinMode(blue_led, OUTPUT);
      pinMode(red_team, INPUT_PULLUP);
      pinMode(blue_team, INPUT_PULLUP);
      nRF.begin();
      nRF.setDataRate( RF24_250KBPS );
      nRF.setPALevel(RF24_PA_LOW);
      nRF.openWritingPipe(adresaPrijimac);
      nRF.openReadingPipe(1, adresaVysilac);
      nRF.startListening();
    }
    
    void loop() {
      if (response == received) {
        tone( buzzer, 900, 800);
        delay(1000);
      } else {
        if ( nRF.available()) {
          while (nRF.available()) {
            nRF.read( &received, sizeof(received) );
          }
          Serial.println("Received datas:: ");
          Serial.println(received);
          Serial.println("Response: ");
          Serial.println(response);
          nRF.stopListening();
          int output_red = digitalRead(red_team);
          int output_blue = digitalRead(blue_team);
          if (output_red == LOW) {
            response = 1;
            digitalWrite(red_led, HIGH);
            digitalWrite(blue_led, LOW);
          } else if (output_blue == LOW) {
            response = 2;
            digitalWrite(red_led, LOW);
            digitalWrite(blue_led, HIGH);
          }
          nRF.write( &response, sizeof(response) );
          nRF.startListening();
        }
      }
    }