Référentiel avec des implémentations de logiciels de test pour les points Airsoft: Airsoft - Bornes Wi-Fi - Arduino
Le micrologiciel est disponible gratuitement
Arduino DOMINATOR WiFi Chronomètre Schème Bouton Capture Points Paintball

Points Wi-Fi pour Airsoft Paintball


Entités du projet Points Wi-Fi:


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

Description du projet de points Wi-Fi:


Le mode de jeu Capture Points convient aux sports Airsoft et Paintball. Les points communiquent entre eux via des modules WiFi nRF24L01, tout en échangeant des informations sur l'état du point (s'il est occupé et par quelle équipe). Le premier point fonctionne en mode émetteur permanent et attend une réponse du deuxième point après la transmission de l'information. Le deuxième point fonctionne en mode récepteur et répond à la réception des données de l'émetteur (rappel). Ce mécanisme de communication évite les collisions. La situation dans laquelle les deux points ont transmis simultanément et n'ont pas pu recevoir les informations n'est pas si dangereuse. Chacun des points utilise un microcontrôleur de contrôle Arduino (Arduino Uno / Nano) ou une puce séparée (Atmel) ATmega328P, qui contrôle la logique des pressions sur les boutons. Il y a 2 équipes dans le jeu - l'équipe RED et l'équipe GRE qui jouent les uns contre les autres et tentent d'occuper les deux points en appuyant sur le bouton approprié. L'entrée du bouton indique l'action d'occuper un point par un membre de l'équipe RED ou GRE. Les boutons de commutation connectés en mode INPUT_PULLUP sont utilisés, ils sont commutés à la masse (signal actif-bas). Le temps de maintien/nombre d'appuis n'est pas vérifié dans l'implémentation logicielle disponible. Le point répond immédiatement lorsque le bouton est enfoncé sans pause.


Le jeu se termine lorsque les deux points sont occupés par la même équipe. Un changement de point est indiqué par un détecteur qui émet un bip à chaque pression sur un bouton. À la fin du jeu, les deux détecteurs émettent un bip en boucle sans fin. Dans le même temps, la communication WiFi entre les modules nRF24L01 sera interrompue afin qu'aucune autre information ne soit transmise et que le résultat du jeu soit définitif. Les modules WiFi nRF24L01 (version sans + PA + LNA) communiquent à environ 70 mètres, nRF24l01 + PA + LNA également par kilomètre, respectivement en forêt et en environnement autrement perturbé au niveau de 450-700 mètres à une puissance d'émission maximale de 1 mW . Avec alimentation externe, il est possible d'utiliser l'adaptateur YL-105 avec un convertisseur 3.3V et de l'alimenter via un adaptateur externe dans la plage de 5 à 18V. L'alimentation 5V de l'Arduino n'est pas recommandée, car elle menace de détruire le contrôleur, car elle n'est pas en mesure de fournir le courant requis pour une puissance maximale. Lors de l'alimentation du nRF24L01 via un terminal Arduino 3V3, il est possible de fournir la puissance d'émission la plus faible de 0,0158 mW. Les deux points sont redémarrés en réinitialisant le bouton Arduín ou en débranchant et en connectant l'alimentation (cycle de mise sous tension). Théoriquement, les points WiFi peuvent être étendus à 8 points (8 pipelines), qui communiquent entre eux, respectivement. ils ne peuvent communiquer avec l'émetteur qu'en fonction de la logique proposée. Cependant, il est nécessaire d'ajouter un identifiant pour chaque point afin de les distinguer. L'émetteur qui initie la communication peut ainsi distinguer l'occupation de l'équipe sur tous les points WiFi qui sont implémentés dans le système. Lors de la transmission d'une plus grande quantité de données, il est également possible d'utiliser une structure dans laquelle il est possible de transmettre plusieurs types de données simultanément sous la forme d'un seul paquet. Le point de réception peut ainsi obtenir des données à partir de la structure attendue en fonction de la taille des types de données individuels.

Les modules sans fil communiquent à 2,4 GHz. Les modules disposent de leur propre canal de communication avec un choix allant jusqu'à 140 canaux.

Vitesses de module prises en charge nRF24L01:


  • 250 kbps - cette option n'est pas prise en charge pour les anciens nRF24L01 !
  • 1 Mbps
  • 2 Mbps

  • Modes d'alimentation des modules 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

  • Schéma fonctionnel - Points WiFi - Airsoft:


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

    Matériel de contrôle compatible pour les points WiFi Airsoft:



    Périphériques pour points WiFi Airsoft:


    2x WiFi module nRF24L01 / nRF24L01 + PA + LNA
    2x modules Wi-Fi nRF24L01 / nRF24L01 + PA + LNA
    Pushbutton (pushbutton)
    4x Boutons
    Buzzer
    2x Ronfleur
    2x LEDs
    4x LED

    Schéma de câblage - Points WiFi


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

    Points Wi-Fi - test de connexion


    WiFi body - - Arduino pre Airsoft, Paintball

    Points WiFi - Points de capture - Démonstration de fonctionnalité:


    Le câblage des bornes - points WiFi - correspond parfaitement au schéma de câblage:

    Arduino Uno / Nano (AtMega328P) nRF24L01
    GND GND
    3V3 / source externe Vcc
    D3 CSN
    D4 CE
    D11 MOSI
    D12 MISO
    D13 SCK
    Arduino Uno / Nano (AtMega328P) LED
    GND GND
    D7 IN (RED)
    D8 IN (GREEN)
    Arduino Uno / Nano (AtMega328P) Boutons (INPUT_PULLUP)
    GND GND
    D5 IN (RED)
    D6 IN (GRE)
    Arduino Uno / Nano (AtMega328P) Ronfleur
    D2 IO
    GND GND

    Bibliothèques disponibles pour les microcontrôleurs (Arduino)


    Archive de la bibliothèque (.zip) développer en C:/Users/[User]/Documents/Arduino/libraries
    Le nom de la bibliothèque Fonction bibliothèque Télécharger
    RF24

    Bibliothèque pour microcontrôleurs AVR (ATmega) Arduino Uno / Nano / Mega. Il permet de contrôler les modules WiFi nRF24L01 (nRF24L01 + PA + LNA) communiquant via le bus SPI.

    Télécharger

    Programme - Points Wi-Fi


    Programme - NODE 1 (émetteur permanent)


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

    Programme - NODE 2 (récepteur permanent avec rappel vers l'émetteur)


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