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

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


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


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

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


Режим игры Capture Points подходит для занятий страйкболом и пейнтболом. Точки общаются друг с другом через WiFi-модули nRF24L01, при этом обмениваются информацией о статусе точки (занята ли она и какой командой). Первая точка работает в режиме постоянного передатчика и ожидает ответа от второй точки после передачи информации. Вторая точка работает в режиме приемника и реагирует на прием данных передатчика (обратный вызов). Этот механизм связи предотвращает коллизии. Ситуация, когда обе точки передавали одновременно и не могли получить информацию, не так опасна. В каждой из точек используется управляющий микроконтроллер Arduino (Arduino Uno / Nano) или отдельный чип (Atmel) ATmega328P, который управляет логикой нажатия кнопок. В игре участвуют 2 команды - RED команда и команда GRE которые играют друг против друга и пытаются занять оба очка, нажав соответствующую кнопку. Ввод кнопки указывает на действие по занятию точки членом команды RED или GRE. Используются кнопки переключения, подключенные в режиме INPUT_PULLUP, они заземлены (сигнал активный-низкий). Время удержания / количество нажатий не проверяется в доступной программной реализации. Точка реагирует немедленно, когда кнопка нажата без паузы.


Игра заканчивается, когда обе точки заняты одной и той же командой. Изменение точки обозначается детектором, который подает звуковой сигнал при каждом нажатии кнопки. В конце игры оба детектора издают бесконечный звуковой сигнал. В то же время связь по Wi-Fi между модулями nRF24L01 будет прервана, так что никакая дополнительная информация не будет передана и результат игры будет окончательным. Модули WiFi nRF24L01 (версия без + PA + LNA) обмениваются данными на расстоянии около 70 метров, nRF24l01 + PA + LNA также на километр, соответственно, в лесу и в других нарушенных условиях на уровне 450-700 метров при максимальной мощности передачи 1 мВт. . При внешнем блоке питания можно использовать адаптер YL-105 с преобразователем 3,3 В и питать его через внешний адаптер в диапазоне от 5 до 18 В. Блок питания 5 В от Arduino не рекомендуется, так как это грозит разрушением контроллера, так как он не может обеспечить необходимый ток для максимальной мощности. При питании nRF24L01 через терминал 3V3 Arduino можно обеспечить минимальную мощность передачи 0,0158 мВт. Обе точки перезапускаются путем сброса кнопки Arduín или путем извлечения и подключения источника питания (цикл включения). Теоретически точки WiFi можно расширить до 8 точек (8 конвейеров), которые связываются друг с другом соответственно. они могут связываться с передатчиком только на основе предложенной логики. Однако необходимо добавить идентификатор для каждой точки, чтобы различать их. Таким образом, передатчик, инициирующий обмен данными, может различать занятость команды на всех точках WiFi, реализованных в системе. При передаче большего объема данных также можно использовать структуру, в которой можно передавать несколько типов данных одновременно как один пакет. Таким образом, точка приема может получать данные из ожидаемой структуры на основе размера отдельных типов данных.

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

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


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

  • Режимы питания модулей 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

  • Блок-схема - точки 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

    Доступные библиотеки для микроконтроллеров (Arduino)


    Архив библиотеки (.zip) развернуть до C:/Users/[User]/Documents/Arduino/libraries
    Название библиотеки Библиотечная функция Скачать
    RF24

    Библиотека для микроконтроллеров AVR (ATmega) Arduino Uno / Nano / Mega. Он позволяет управлять модулями WiFi nRF24L01 (nRF24L01 + PA + LNA), общающимися по шине SPI.

    Скачать

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


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


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

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


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