Repozytorium z implementacjami oprogramowania testowego dla punktów Airsoft: Airsoft - Punkty Wi-Fi - Arduino
Oprogramowanie układowe jest dostępne za darmo
Arduino DOMINATOR WiFi Stopek Schemat Przycisk Capture Points Paintball

Punkty Wi-Fi dla Airsoft Paintball


Podmioty w projekcie punktów WiFi:


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

Opis projektu punktów Wi-Fi:


Tryb gry Capture Points jest odpowiedni dla sportów Airsoft i Paintball. Punkty komunikują się ze sobą poprzez moduły WiFi nRF24L01, wymieniając jednocześnie informacje o stanie punktu (czy jest zajęty i przez jaką drużynę). Pierwszy punkt działa w trybie stałego nadajnika i oczekuje odpowiedzi z drugiego punktu po przesłaniu informacji. Drugi punkt działa w trybie odbiornika i odpowiada na odbiór danych z nadajnika (callback). Ten mechanizm komunikacji zapobiega kolizjom. Sytuacja, w której oba punkty nadawały jednocześnie i nie były w stanie odebrać informacji, nie jest tak groźna. Każdy z punktów wykorzystuje mikrokontroler sterujący Arduino (Arduino Uno/Nano) lub osobny układ (Atmel) ATmega328P, który steruje logiką naciśnięć przycisków. W grze są 2 drużyny - RED team i GRE team którzy grają przeciwko sobie i próbują zająć oba punkty, naciskając odpowiedni przycisk. Wejście przycisku wskazuje akcję zajmowania punktu przez członka drużyny RED lub GRE. Wykorzystywane są przyciski przełączające podłączone w trybie INPUT_PULLUP, przełączane są do masy (sygnał aktywny-niski). Czas przetrzymania / liczba naciśnięć nie jest weryfikowana w dostępnej implementacji oprogramowania. Punkt reaguje natychmiast po naciśnięciu przycisku bez zatrzymywania.


Gra kończy się, gdy oba punkty są zajęte przez tę samą drużynę. Zmiana punktu jest sygnalizowana przez czujnik, który wydaje sygnał dźwiękowy przy każdym naciśnięciu przycisku. Pod koniec gry oba detektory emitują sygnał dźwiękowy w nieskończonej pętli. Jednocześnie komunikacja WiFi pomiędzy modułami nRF24L01 zostanie przerwana, aby nie były przesyłane żadne dalsze informacje, a wynik gry jest ostateczny. Moduły WiFi nRF24L01 (wersja bez +PA+LNA) komunikują się na odległość około 70 metrów, nRF24l01+PA+LNA również na kilometr odpowiednio w lesie i innym zakłóconym środowisku na poziomie 450-700 metrów przy maksymalnej mocy transmisji 1mW . Przy zasilaniu zewnętrznym istnieje możliwość zastosowania zasilacza YL-105 z konwerterem 3,3V i zasilania go poprzez zasilacz zewnętrzny w zakresie od 5 do 18V. Zasilanie 5V z Arduino nie jest zalecane, gdyż grozi zniszczeniem kontrolera, który nie jest w stanie dostarczyć wymaganego prądu dla maksymalnej mocy. Przy zasilaniu nRF24L01 przez terminal Arduino 3V3, możliwe jest dostarczenie najniższej mocy nadawania 0,0158 mW. Oba punkty są ponownie uruchamiane przez zresetowanie przycisku Arduín lub przez wyciągnięcie i podłączenie zasilania (cykl włączania). Teoretycznie punkty WiFi można rozszerzyć do 8 punktów (8 potoków), które komunikują się ze sobą odpowiednio. mogą komunikować się z nadajnikiem tylko w oparciu o proponowaną logikę. Jednak konieczne jest dodanie identyfikatora dla każdego punktu, aby je odróżnić. Nadajnik inicjujący komunikację może dzięki temu rozróżnić zajęcie zespołu na wszystkich punktach WiFi, które są zaimplementowane w systemie. Przy przesyłaniu większej ilości danych możliwe jest również wykorzystanie struktury, w której możliwe jest jednoczesne przesyłanie wielu typów danych jako jednego pakietu. Punkt odbiorczy jest zatem w stanie uzyskać dane z oczekiwanej struktury na podstawie rozmiaru poszczególnych typów danych.

Moduły bezprzewodowe komunikują się na częstotliwości 2,4 GHz. Moduły posiadają własny kanał komunikacyjny z możliwością wyboru aż 140 kanałów.

Obsługiwane prędkości modułów nRF24L01:


  • 250 kb/s — ta opcja nie jest obsługiwana w starszych modelach nRF24L01! <
  • 1 Mb/s
  • 2 Mb/s

  • Tryby zasilania modułów nRF24L01:


  • RF24_PA_MIN = -18 dBm -> 0,0158 mW
  • RF24_PA_LOW = -12 dBm -> 0,0631 mW
  • RF24_PA_MED = -6 dBm -> 0,2512 mW
  • RF24_PA_HIGH = 0 dBm -> 1 mW

  • Schemat blokowy - Punkty WiFi - Airsoft:


    Schemat blokowy - Punkty WiFi - Airsoft

    Kompatybilny sprzęt sterujący - ASG Punkty Wi-Fi:


    Mikrokontroler sterujący ATmega328P DIP
    ATmega328P - DIP28
    Mikrokontroler sterujący ATmega328P SMD
    ATmega328P - SMD

    Kompatybilne urządzenia peryferyjne - ASG Punkty Wi-Fi:



    Schemat połączeń - punkty WiFi


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

    Punkty Wi-Fi - testowe połączenie


    WiFi body - - Arduino pre Airsoft, Paintball

    Punkty WiFi - Punkty przechwytywania - Demonstracja funkcjonalności:


    Tabela połączeń zacisków - punkty WiFi - w pełni odpowiada schematowi elektrycznemu:

    Arduino Uno / Nano (ATmega328P) nRF24L01
    GND GND
    3V3 / źródło zewnętrzne Vcc
    D3 CSN
    D4 CE
    D11 MOSI
    D12 MISO
    D13 SCK
    Arduino Uno / Nano (ATmega328P) diody LED
    GND GND
    D7 IN (RED)
    D8 IN (GREEN)
    Arduino Uno / Nano (ATmega328P) Guziki (INPUT_PULLUP)
    GND GND
    D5 IN (RED)
    D6 IN (GRE)
    Arduino Uno / Nano (ATmega328P) Brzęczyk
    D2 IO
    GND GND

    Dostępne biblioteki dla mikrokontrolerów (Arduino)


    Archiwum biblioteki (.zip) rozwiń do C:/Users/[User]/Dokumenty/Arduino/libraries
    Nazwa biblioteki Funkcja biblioteki Ściągnij
    RF24

    Biblioteka dla mikrokontrolerów AVR (ATmega) Arduino Uno / Nano / Mega. Pozwala na sterowanie modułami WiFi nRF24L01 (nRF24L01 + PA + LNA) komunikującymi się poprzez magistralę SPI.

    Ściągnij

    Program - Punkty WiFi


    Program - NODE 1 (stały nadajnik)


    // nRF24L01 transmitter
    //WiFi points for Airsoft Points
    //Created by: martinius96@gmail.com
    //Donate coffee: paypal.me/chlebovec
    
    #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";
    boolean last_packet = false;
    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 ); //RF24_250KBPS, RF24_1MBPS, RF24_2MBPS
      nRF.setPALevel(RF24_PA_LOW); //RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
      nRF.openWritingPipe(adresaVysilac);
      nRF.openReadingPipe(1, adresaPrijimac);
      nRF.startListening();
    }
    
    void loop() {
      if (response == received) {
        if (last_packet == false) {
          last_packet = true;
          nRF.stopListening();
          nRF.write( &response, sizeof(response) );
          delay(50);
        }
        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 (stały odbiornik z oddzwonieniem do nadajnika)


    // nRF24L01 receiver
    //WiFi points for Airsoft Points
    //Created by: martinius96@gmail.com
    
    #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";
    boolean last_packet = false;
    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 ); //RF24_250KBPS, RF24_1MBPS, RF24_2MBPS
      nRF.setPALevel(RF24_PA_LOW); //RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
      nRF.openWritingPipe(adresaPrijimac);
      nRF.openReadingPipe(1, adresaVysilac);
      nRF.startListening();
    }
    
    void loop() {
      if (response == received) {
        if (last_packet == false) {
          last_packet = true;
          nRF.stopListening();
          nRF.write( &response, sizeof(response) );
          delay(50);
        }
        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();
        }
      }
    }