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