Repozitár s testovacími programovými implementáciami pre Airsoft body: Airsoft - WiFi body - Arduino
Pri záujme o kúpu firmvéru pre WiFi body kontaktujte na: martinius96@gmail.com
Arduino LCD WiFi Stopky Schéma Tlačidlo Capture Points Paintball DOMINATOR

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

    Testovací program - WiFi body


    Cieľom testovacieho programu je otestovať kompatibilitu hardvéru (verzie nRF24L01 modulov s prenosovou rýchlosťou 250kbps, nakoľko ju nie všetky podporujú). Test a realizácia spojenia medzi vysielačom a prijímačom s callbackom prijímača, ktorý vráti vysielaču odoslané dáta. Prijímač má integrovaný buzzer, ktorý pípa v prípade, že zaznamená určité dáta - oznamuje tak, že existuje spojenie s vysielačom a dáta tečú. Tester je vhodné používať aj v Airsoft hre pre prvotné otestovanie dosahu a komunikácie medzi oboma uzlami. Vysielač vysiela vždy, prijímač iba ako odpoveď vysielaču po prijatí dát. Možno prenášať rôzne dáta v štruktúre, väčšie pakety.

    Tester pre vysielač (Toto nie je program pre Airsoft WiFi projekt! - Projekt je platený)

    //nRF24L01 + PA + LNA - Transmitter tester
    //Author: Martin Chlebovec (martinius96)
    //Web: https://arduino.php5.sk
    //Donate: https://paypal.me/chlebovec
    
    #include <SPI.h>
    #include "RF24.h"
    // nastavení propojovacích pinů
    #define CE 4
    #define CS 3
    // inicializace nRF s piny CE a CS
    RF24 nRF(CE, CS);
    // nastavení adres pro přijímač a vysílač,
    // musí být nastaveny stejně v obou programech!
    byte adresaPrijimac[]= "prijimac00";
    byte adresaVysilac[]= "vysilac00";
    void setup() {
      // komunikace přes sériovou linku rychlostí 9600 baud
      Serial.begin(9600);
      // zapnutí komunikace nRF modulu
      nRF.begin();
      nRF.setDataRate( RF24_250KBPS );
      // nastavení výkonu nRF modulu,
      // možnosti jsou RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH and RF24_PA_MAX,
      // pro HIGH a MAX je nutnýv externí 3,3V zdroj
      nRF.setPALevel(RF24_PA_LOW);
      // nastavení zapisovacího a čtecího kanálu
      nRF.openWritingPipe(adresaVysilac);
      nRF.openReadingPipe(1,adresaPrijimac);
      // začátek příjmu dat
      nRF.startListening();
    }
    
    void loop() {
      // for smyčka pro postupné odeslání
      // hodnot 0 až 3 pro načtení všech dat
      // z přijímače
      for (int i=0; i < 4; i++ ) {
        // ukončení příjmu dat
        nRF.stopListening();
        // vytisknutí aktuální volby po sériové lince
        Serial.print("Posilam volbu ");
        Serial.println(i);
        // uložení startovního času komunikace
        unsigned long casZacatek = micros();
        // odeslání aktuální volby, v případě selhání
        // vytištění chybové hlášky na sériovou linku
        if (!nRF.write( &i, sizeof(i) )){
           Serial.println("Chyba při odeslání!");
        }
        nRF.startListening();
        unsigned long casCekaniOdezvy = micros();
        boolean timeout = false;
        while ( ! nRF.available() ){
        if (micros() - casCekaniOdezvy > 200000 ){
              timeout = true;
              break;
          }      
        }
        if ( timeout ){
          Serial.println("Chyba při prijmu, vyprseni casu na odezvu!");
        }
        else{
         
            unsigned long prijataData;
            nRF.read( &prijataData, sizeof(prijataData) );
            unsigned long casKonec = micros();
            Serial.print("Odeslana volba: ");
            Serial.print(i);
            Serial.print(", prijata data: ");
            Serial.println(prijataData);
            Serial.print("Delka spojeni: ");
            Serial.print(casKonec - casZacatek);
            Serial.println(" mikrosekund.");
        }
        delay(200);
      }
    }
    

    Prijímač tester (Toto nie je program pre Airsoft WiFi projekt! - Projekt je platený)

    //nRF24L01 + PA + LNA - Receiver tester
    //Author: Martin Chlebovec (martinius96)
    //Web: https://arduino.php5.sk
    //Donate: https://paypal.me/chlebovec
    
    #include <SPI.h>
    #include "RF24.h"
    int prijem;
    const int buzzer = 2;
    #define CE 4
    #define CS 3
    RF24 nRF(CE, CS);
    byte adresaPrijimac[] = "prijimac00";
    byte adresaVysilac[] = "vysilac00";
    void setup() {
      Serial.begin(9600);
      pinMode(buzzer, OUTPUT);
      nRF.begin();
      nRF.setDataRate( RF24_250KBPS );
      nRF.setPALevel(RF24_PA_LOW);
      nRF.openWritingPipe(adresaPrijimac);
      nRF.openReadingPipe(1, adresaVysilac);
      nRF.startListening();
    }
    
    void loop() {
      unsigned long odezva;
      if ( nRF.available()) {
        // čekání na příjem dat
        while (nRF.available()) {
          nRF.read( &prijem, sizeof(prijem) );
        }
        Serial.print("Prijata volba: ");
        Serial.print(prijem);
        switch ( prijem ) {
          case 1:
    
            odezva = millis();
    
            tone(buzzer, 50, 500);
    
            break;
          case 2:
            odezva = millis() / 1000;
            break;
          case 3:
            odezva = micros();
            break;
          default:
            odezva = 0;
            break;
        }
        nRF.stopListening();
        nRF.write( &odezva, sizeof(odezva) );
        nRF.startListening();
      }
    }