Репозиторий с тестовыми программными реализациями для точек Airsoft WiFi: Airsoft - точки WiFi - Arduino
Прошивка доступна бесплатно
Arduino DOMINATOR WiFi Секундомер Схема Кнопка Capture Points Paintball

Точки Wi-Fi для Airsoft | Paintball


Сущности в проекте точек WiFi:


RED команда
RED команда
GRE команда
GRE команда

Описание проекта точек WiFi:


Режим игры «Захват очков» для страйкбола и пейнтбола. Точки общаются друг с другом через модули WiFi из серии nRF24L01, при этом обмениваются информацией о статусе точки (занята ли она и какой командой). Одна точка является постоянным передатчиком и требует связи с другой точкой. Вторая точка - это приемник, который реагирует на данные, полученные передатчиком, что позволяет избежать коллизий при обмене данными на частоте Wi-Fi 2,4 ГГц. В каждой из точек используется управляющий микроконтроллер Arduino (Arduino Uno / Nano) или отдельный чип (Atmel) AtMega328P, который контролирует всю логику системы. В игре 2 команды - RED команда и GRE команда, которые играют друг против друга и пытаются занять обе точки, нажав соответствующую кнопку. Ввод кнопки указывает на действие по занятию точки членом команды RED или GRE. Используются кнопки, подключенные в режиме INPUT_PULLUP. Нажатие кнопки подает сигнал GND на цифровой входной терминал Arduino (сигнал переключения Active-LOW). Продолжительность / количество нажатий не контролируется и не настраивается. Точка немедленно реагирует на нажатие кнопки. Игра заканчивается, когда обе точки заняты одной и той же командой. Смена точки индицируется детектором, в конце игры оба детектора издают бесконечный звуковой сигнал, при этом связь по WiFi между модулями nRF24L01 прерывается. Модули WiFi nRF24l01 обмениваются данными на частоте 2,4 ГГц. nRF24l01 (без + PA + LNA) обменивается данными на расстоянии около 70 метров, nRF24l01 + PA + LNA также на километр, соответственно, в лесу или в других нарушенных условиях на уровне 450-700 метров при максимальной мощности передачи. Для внешнего питания необходимо использовать YL-адаптер с преобразователем на 3,3 В и запитать его через внешний адаптер. Не используйте блок питания 5V от Arduino, есть риск вывести из строя контроллер, а также клемма 3V3 не подходит для питания модуля, так как имеет высокое потребление тока в более мощных режимах передачи. Перезапуск обеих точек выполняется путем сброса кнопки Arduín или путем извлечения и подключения источника питания (цикл включения).

Беспроводные модули обмениваются данными на частоте 2,4 ГГц, это не технология WiFi, им не нужен роутер или точка доступа! Модули имеют собственный канал связи с возможностью выбора до 140 каналов.

Поддерживаемые скорости модулей nRF24L01:


  • 250 kbps - эта опция не поддерживается для более старых моделей nRF24L01!
  • 1 Mbps
  • 2 Mbps

  • Режимы питания модулей nRF24L01:


  • RF24_PA_MIN=-18dBm
  • RF24_PA_LOW=-12dBm
  • RF24_PA_MED=-6dBM
  • RF24_PA_HIGH=0dBm

  • Блок-схема - точки WiFi - страйкбол:


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

    Совместимое оборудование управления для точек Wi-Fi Airsoft:



    Периферийные устройства для точек WiFi Airsoft:


    2 модуля WiFi nRF24L01 / nRF24L01 + PA + LNA
    2 модуля WiFi nRF24L01 / nRF24L01 + PA + LNA
    Кнопка питания (pushbutton)
    4x Кнопка питания
    Зуммер
    2x Зуммер
    2x Светодиоды
    4x Светодиоды

    Схема подключения - точки WiFi


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

    Точки WiFi - тестовое соединение


    WiFi body - - Arduino pre Airsoft, Paintball

    Точки WiFi - Capture Points - Демонстрация функциональности:



    Таблица подключения клемм - точек WiFi - полностью соответствует схеме подключения:


    Arduino Uno / Nano (AtMega328P) nRF24L01
    GND GND
    3V3 /внешний источник 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) Кнопки (INPUT_PULLUP)
    GND GND
    D5 IN (RED)
    D6 IN (GRE)
    Arduino Uno / Nano (AtMega328P) Зуммер
    D2 IO
    GND GND

    Программа - точки WiFi


    Программа - УЗЕЛ 1 (постоянный передатчик)


    // nRF24L01 transmitter
    #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";
    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 );
      nRF.setPALevel(RF24_PA_LOW);
      nRF.openWritingPipe(adresaVysilac);
      nRF.openReadingPipe(1, adresaPrijimac);
      nRF.startListening();
    }
    
    void loop() {
      if (response == received) {
        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);
      }
    }
    

    Программа - УЗЕЛ 2 (постоянный приемник с обратным вызовом на передатчик)


    // nRF24L01 receiver
    #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";
    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 );
      nRF.setPALevel(RF24_PA_LOW);
      nRF.openWritingPipe(adresaPrijimac);
      nRF.openReadingPipe(1, adresaVysilac);
      nRF.startListening();
    }
    
    void loop() {
      if (response == received) {
        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();
        }
      }
    }