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