Repositorio con implementaciones de software de prueba para puntos de Airsoft: Airsoft - Puntos WiFi - Arduino
El firmware está disponible de forma gratuita
Arduino DOMINATOR WiFi Cronógrafo Esquema Botón Capture Points Paintball

Puntos WiFi para Airsoft paintball


Entidades en el proyecto de puntos WiFi:


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

Descripción del proyecto puntos WiFi:


El modo de juego Capture Points es adecuado para deportes de Airsoft y Paintball. Los puntos se comunican entre sí a través de módulos WiFi nRF24L01, mientras intercambian información sobre el estado del punto (si está ocupado y por qué equipo). El primer punto opera en modo transmisor permanente y espera una respuesta del segundo punto después de que se transmite la información. El segundo punto funciona en modo receptor y responde a la recepción de los datos del transmisor (callback). Este mecanismo de comunicación evita colisiones. La situación de que ambos puntos transmitieran simultáneamente y no pudieran recibir la información no es tan peligrosa. Cada uno de los puntos utiliza un microcontrolador de control Arduino (Arduino Uno/Nano) o un chip separado (Atmel) ATmega328P, que controla la lógica de las pulsaciones de botones. Hay 2 equipos en el juego: equipo RED y equipo GRE que juegan uno contra el otro e intentan ocupar ambos puntos presionando el botón correspondiente. La entrada del botón indica la acción de ocupar un punto por parte de un miembro del equipo RED o GRE. Los botones de conmutación conectados en el modo INPUT_PULLUP se utilizan, se conectan a tierra (señal activa baja). El tiempo de espera/número de pulsaciones no se verifica en la implementación de software disponible. El punto responde inmediatamente cuando se presiona el botón sin pausa.


El juego termina cuando ambos puntos están ocupados por el mismo equipo. Un cambio de punto se indica mediante un detector que emite un pitido cada vez que se presiona un botón. Al final del juego, ambos detectores emiten un pitido en un bucle sin fin. Al mismo tiempo, se interrumpirá la comunicación WiFi entre los módulos nRF24L01 para que no se transmita más información y el resultado del juego sea definitivo. Los módulos WiFi nRF24L01 (versión sin + PA + LNA) se comunican a unos 70 metros, nRF24l01 + PA + LNA también por kilómetro, respectivamente en el bosque y en otro entorno perturbado a un nivel de 450-700 metros con una potencia de transmisión máxima de 1 mW . Con fuente de alimentación externa, es posible utilizar el adaptador YL-105 con un convertidor de 3,3 V y alimentarlo a través de un adaptador externo en el rango de 5 a 18 V. No se recomienda la fuente de alimentación de 5V del Arduino, ya que amenaza con destruir el controlador, ya que no puede suministrar la corriente necesaria para obtener la máxima potencia. Al alimentar el nRF24L01 a través de un terminal Arduino 3V3, es posible suministrar la potencia de transmisión más baja de 0,0158 mW. Ambos puntos se reinician reiniciando el botón de Arduino, o extrayendo y conectando la fuente de alimentación (ciclo de encendido). Teóricamente, los puntos WiFi se pueden extender a 8 puntos (8 pipelines), que se comunican entre sí, respectivamente. solo pueden comunicarse con el transmisor según la lógica propuesta. Sin embargo, es necesario agregar un identificador para cada punto para distinguirlos. El transmisor que inicia la comunicación puede así distinguir la ocupación del equipo en todos los puntos WiFi que se implementen en el sistema. Al transmitir una mayor cantidad de datos, también es posible utilizar una estructura en la que es posible transmitir varios tipos de datos simultáneamente como un paquete. El punto de recepción puede así obtener datos de la estructura esperada en función del tamaño de los tipos de datos individuales.

Los módulos inalámbricos se comunican a 2,4 GHz. Los módulos tienen su propio canal de comunicación con una selección de hasta 140 canales.

Velocidades de módulo admitidas nRF24L01:


  • 250 kbps - Esta opción no es compatible con nRF24L01 anterior!
  • 1 Mbps
  • 2 Mbps

  • Modos de potencia de los módulos 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

  • Diagrama de bloques - Puntos WiFi - Airsoft:


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

    Hardware de control compatible para puntos WiFi Airsoft:



    Periféricos para puntos WiFi Airsoft:


    2x WiFi module nRF24L01 / nRF24L01 + PA + LNA
    2x WiFi module nRF24L01 / nRF24L01 + PA + LNA
    Pushbutton (pushbutton)
    4x Pushbutton
    Buzzer
    2x Buzzer
    2x LEDs
    4x LEDs

    Diagrama de cableado - Puntos WiFi


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

    Puntos WiFi - conexión de prueba


    WiFi body - - Arduino pre Airsoft, Paintball

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


    El cableado de los terminales - puntos WiFi - corresponde completamente al diagrama de cableado:

    Arduino Uno / Nano (AtMega328P) nRF24L01
    GND GND
    3V3 / fuente externa Vcc
    D3 CSN
    D4 CE
    D11 MOSI
    D12 MISO
    D13 SCK
    Arduino Uno / Nano (AtMega328P) LED diods
    GND GND
    D7 IN (RED)
    D8 IN (GREEN)
    Arduino Uno / Nano (AtMega328P) Botones (INPUT_PULLUP)
    GND GND
    D5 IN (RED)
    D6 IN (GRE)
    Arduino Uno / Nano (AtMega328P) Zumbador
    D2 IO
    GND GND

    Bibliotecas disponibles para microcontroladores (Arduino)


    Archivo de la biblioteca (.zip) expandir a C:/Users/[User]/Documents/Arduino/libraries
    El nombre de la biblioteca Función de biblioteca Descargar
    RF24

    Biblioteca para microcontroladores AVR (ATmega) Arduino Uno / Nano / Mega. Permite controlar módulos WiFi nRF24L01 (nRF24L01 + PA + LNA) comunicándose vía bus SPI.

    Descargar

    Programa - Puntos WiFi


    Programa - NODO 1 (transmisor permanente)


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

    Programa - NODO 2 (receptor permanente con devolución de llamada al transmisor)


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