Repository mit Testsoftware-Implementierungen für Airsoft WiFi-Punkte: Airsoft - WiFi-Punkte - Arduino
Die Firmware ist kostenlos erhältlich
Arduino DOMINATOR WiFi Stoppuhr Planen Taste Capture Points Paintball

WiFi Punkte für Airsoft | Paintball


Entitäten im WiFi-Punkte-Projekt:


Mannschaft RED
Mannschaft RED
Mannschaft GRE
Mannschaft GRE

Projektbeschreibung für WiFi-Punkte:


Der Spielmodus Capture Points eignet sich für Airsoft- und Paintball-Sportarten. Die Weichen kommunizieren über WLAN-Module nRF24L01 miteinander, während sie Informationen über den Status der Weiche austauschen (ob belegt und von welchem Team). Der erste Punkt arbeitet im permanenten Sendermodus und erwartet eine Antwort vom zweiten Punkt, nachdem die Informationen gesendet wurden. Der zweite Punkt arbeitet im Empfängermodus und reagiert auf den Empfang der Senderdaten (Callback). Dieser Kommunikationsmechanismus verhindert Kollisionen. Die Situation, dass beide Punkte gleichzeitig übermittelten und die Informationen nicht empfangen konnten, ist nicht so gefährlich. Jeder der Punkte verwendet einen Arduino-Steuerungsmikrocontroller (Arduino Uno / Nano) oder einen separaten Chip (Atmel) ATmega328P, der die Logik der Tastendrücke steuert. Es gibt 2 Teams im Spiel - ROTE Team und GRE Team die gegeneinander spielen und versuchen, beide Punkte durch Drücken der entsprechenden Taste zu besetzen. Die Tasteneingabe zeigt die Aktion der Besetzung eines Punktes durch ein Mitglied des RED- oder GRE-Teams an. Die im INPUT_PULLUP-Modus angeschlossenen Schalttaster werden verwendet, sie werden auf Masse geschaltet (Active-Low-Signal). Die Haltezeit / Anzahl der Druckvorgänge wird in der verfügbaren Softwareimplementierung nicht überprüft. Der Punkt reagiert sofort, wenn die Taste ohne Pause gedrückt wird.


Das Spiel endet, wenn beide Punkte von derselben Mannschaft besetzt sind. Eine Punktänderung wird durch einen Detektor angezeigt, der bei jedem Tastendruck piept. Am Ende des Spiels piepsen beide Detektoren in einer Endlosschleife. Gleichzeitig wird die WLAN-Kommunikation zwischen den nRF24L01-Modulen unterbrochen, so dass keine weiteren Informationen übertragen werden und das Spielergebnis endgültig ist. WLAN-Module nRF24L01 (Version ohne + PA + LNA) kommunizieren auf ca. 70 Meter, nRF24l01 + PA + LNA auch pro Kilometer, jeweils im Wald und sonst gestörter Umgebung auf der Höhe von 450-700 Metern bei einer maximalen Sendeleistung von 1 mW . Bei externer Stromversorgung ist es möglich, den YL-105-Adapter mit einem 3,3-V-Wandler zu verwenden und über einen externen Adapter im Bereich von 5 bis 18 V zu versorgen. Die 5V-Stromversorgung vom Arduino ist nicht zu empfehlen, da sie den Controller zu zerstören droht, da dieser nicht in der Lage ist, den erforderlichen Strom für die maximale Leistung zu liefern. Bei der Stromversorgung des nRF24L01 über ein 3V3-Arduino-Terminal ist es möglich, die niedrigste Sendeleistung von 0,0158 mW bereitzustellen. Beide Punkte werden durch Zurücksetzen der Arduín-Taste oder durch Herausziehen und Anschließen des Netzteils (Einschaltzyklus) neu gestartet. Theoretisch können WLAN-Punkte auf 8 Punkte (8 Pipelines) erweitert werden, die jeweils miteinander kommunizieren. sie können nur basierend auf der vorgeschlagenen Logik mit dem Sender kommunizieren. Es ist jedoch erforderlich, für jeden Punkt eine Kennung hinzuzufügen, um sie zu unterscheiden. Der die Kommunikation auslösende Sender kann somit die Besetzung des Teams an allen im System implementierten WLAN-Punkten unterscheiden. Bei der Übertragung einer größeren Datenmenge kann auch eine Struktur verwendet werden, bei der mehrere Datentypen gleichzeitig als ein Paket übertragen werden können. Die Empfangsstelle ist somit in der Lage, aufgrund der Größe der einzelnen Datentypen Daten aus der erwarteten Struktur zu entnehmen.

Drahtlose Module kommunizieren mit 2,4 GHz, es handelt sich nicht um WiFi-Technologie, sie benötigen keinen Router oder Zugangspunkt! Die Module verfügen über einen eigenen Kommunikationskanal mit einer Auswahl von bis zu 140 Kanälen.

Unterstützte Modulgeschwindigkeiten nRF24L01:


  • 250 kbps - Diese Option wird für ältere nRF24L01 nicht unterstützt!
  • 1 Mbps
  • 2 Mbps

  • Leistungsmodi von nRF24L01-Modulen:


  • 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

  • Blockdiagramm - WiFi-Punkte - Airsoft:


    Blockschema - Punkte erfassen - Airsoft / Paintball, Arduino, nRF24L01

    Kompatible Steuerungshardware für WiFi-Airsoft-Punkte:



    Peripheriegeräte für WiFi Airsoft-Punkte:


    2x WLAN-Modul nRF24L01 / nRF24L01 + PA + LNA
    2x WiFi-Modul nRF24L01 / nRF24L01 + PA + LNA
    Schaltknopf
    4x Schaltknopf
    Summer
    2x Summer
    4x LEDs
    4x LEDs

    Schaltplan - WiFi-Punkte


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

    WiFi-Punkte - Verbindung testen


    WiFi body - - Arduino pre Airsoft, Paintball

    WiFi Punkte - Capture Points - Demonstration der Funktionalität:



    Die Verdrahtung der Klemmen - Konfigurierbarer DOMINATOR - entspricht vollständig dem Schaltplan:


    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 Dioden
    GND GND
    D7 IN (RED)
    D8 IN (GREEN)
    Arduino Uno / Nano (ATmega328P) Taste (INPUT_PULLUP)
    GND GND
    D5 IN (RED)
    D6 IN (GRE)
    Arduino Uno / Nano (ATmega328P) Summer
    D2 IO
    GND GND

    Verfügbare Bibliotheken für Mikrocontroller (Arduino)


    Bibliotheksarchiv (.zip) erweitern auf C:/Users/[User]/Documents/Arduino/libraries
    Name der Bibliothek Bibliotheksfunktion Herunterladen
    RF24

    Bibliothek für AVR-Mikrocontroller (ATmega) Arduino Uno / Nano / Mega. Es ermöglicht die Steuerung von WiFi-Modulen nRF24L01 (nRF24L01 + PA + LNA), die über den SPI-Bus kommunizieren.

    Herunterladen

    Programm - WiFi-Punkte


    Programm - NODE 1 (permanenter Sender)


    // 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);
      }
    }
    

    Programm - NODE 2 (Dauerempfänger mit Rückruf zum Sender)


    // 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();
        }
      }
    }