Wifi body cez Arduino Nano


Využitý hardvér:

  • Arduino NanoEthernet Shield Wiznet W5100
  • Nrf24l01 + PA + LNA
  • Pushbuttony
  • LED diódy
  • Hlásiče
  • Popis funkčnosti a použitie:

  • Systém je určený pre športy typu Airsoft/Paintball/Nerf Wars pre herný mód Capture point.
  • Systém využíva dvojicu Arduino Nano pre 2 body, o ktoré hráči bojujú, na každej z dosiek sú dve diódy, dva hlásiče, dva wifi moduly nRF24l01 + PA + LNA. Okrem týchto súčiastok sú pri doskách umiestnené i tlačidlá pre každý z tímov.
  • Jedno tlačidlo je pre Tím 1 (žltý tím) a druhé pre Tím 2 (červený tím). Tím pri obsadení stlačí svoje tlačidlo, čo zmení farbu bodu podľa ich tímu.
  • Ak jeden tím obsadí oba body, rozuzvučia sa hlásiče na oboch bodoch (hra sa skončí, alebo pokračuje ďalej podľa pravidiel organizátora akcie) Môže to napríklad znamenať len koniec kola, alebo prípočet bodov. V reálnom čase medzi sebou obe Arduiná komunikujú s modulmi nRF24l01 + PA + LNA. Odozva medzi oboma Arduinami je na úrovni 1-5ms.
  • Vďaka modulom nRF24l01 je možné komunikovať medzi Arduinami na obrovské vzdialenosti na stovky metrov v nezarušenom prostredí (nRF24l01 ponúka vyše 120 kanálov pre komunikáciu na 2,4Ghz.) Pri využití externého 5v/3.3v zdroja je možné komunikovať až na 1,1 kilometra.
  • Prijímač

    // nRF24L01 prijimac
    #include <SPI.h> //arduino kniznica pre SPI zbernicu
    #include "RF24.h" //kniznica pre moduly
    int odezva = 3; //globalna premenna pre odosielany stav timu
    int prijem = 4; //globalna premenna pre citany stav timu
    const int buzzer = 2; //pin pre hlasic
    const int cervenytim = 5; //pin pre cerveny button
    const int zltytim = 6;  //pin pre zlty button
    const int cervenaled = 7;
    const int zltaled = 8;
    #define CE 4 //chip state pin
    #define CS 3 //chip select pin
    RF24 nRF(CE, CS); //nrf s volitelnymi pinmi CE a CS
    byte adresaPrijimac[] = "prijimac00"; //adresa prijimac
    byte adresaVysilac[] = "vysilac00"; //adresa vysielac
    void setup() {
      Serial.begin(9600); //Serial monitor na 9600 baud/s
      pinMode(buzzer, OUTPUT); //hlasic nastavit ako vystup
        pinMode(cervenaled, OUTPUT);
      pinMode(zltaled, OUTPUT);
      pinMode(cervenytim, INPUT_PULLUP); //tlacidla ako vstup na pullup rezistor
      pinMode(zltytim, INPUT_PULLUP); //tlacidla ako vstup na pullup rezistor
      nRF.begin(); //zapnut komunikaciu s nRF modulom
      nRF.setDataRate( RF24_250KBPS ); //najnizsia rychlost pre najvacsiu moznu vzidalenost
      nRF.setPALevel(RF24_PA_HIGH); //napajacie napatie na high moznost MAX potrebuje externy zdroj na 5v (3.3v pri napojeni napriamo)
      nRF.openWritingPipe(adresaPrijimac); //zapisujeme na prijimac na jeho adresu
      nRF.openReadingPipe(1, adresaVysilac); //citame na svojej adrese na kanale XX
      nRF.startListening();
    }
    
    void loop() {
     if(odezva == prijem){
              
      tone( buzzer, 900, 800);
     
      delay(1000);
          }else{
            noTone(buzzer);
             int vystupcerveny = digitalRead(cervenytim);
      int vystupzlty = digitalRead(zltytim);
      if(vystupcerveny==LOW){
        odezva = 1;
        digitalWrite(cervenaled, HIGH);
        digitalWrite(zltaled, LOW);
        }else if(vystupzlty==LOW){
        odezva = 2;
         digitalWrite(cervenaled, LOW);
        digitalWrite(zltaled, HIGH);
        }
       
      if ( nRF.available()) {
        // čekání na příjem dat
        while (nRF.available()) {
          nRF.read( &prijem, sizeof(prijem) );
        }
        Serial.println("Prijata volba: ");
        Serial.println(prijem);
        Serial.println("Odozva: ");
        Serial.println(odezva);
        nRF.stopListening();
        nRF.write( &odezva, sizeof(odezva) );
        nRF.startListening();
      }
            }  
    
    }
    					 

    Vysielač

    // nRF24L01 vysielac
    #include <SPI.h>
    #include "RF24.h"
    #define CE 4
    #define CS 3
    RF24 nRF(CE, CS);
    int odezva = 8;
    int prijem = 12;
    const int buzzer = 2;
    const int cervenytim = 5;
    const int zltytim = 6;
    const int cervenaled = 7;
    const int zltaled = 8;
    byte adresaPrijimac[]= "prijimac00";
    byte adresaVysilac[]= "vysilac00";
    void setup() {
      Serial.begin(9600);
      pinMode(buzzer, OUTPUT);
      pinMode(cervenaled, OUTPUT);
      pinMode(zltaled, OUTPUT);
      pinMode(cervenytim, INPUT_PULLUP);
      pinMode(zltytim, INPUT_PULLUP);
      nRF.begin();
      nRF.setDataRate( RF24_250KBPS );
      nRF.setPALevel(RF24_PA_HIGH);
      nRF.openWritingPipe(adresaVysilac);
      nRF.openReadingPipe(1,adresaPrijimac);
      nRF.startListening();
    }
    
    void loop() {
     if(odezva == prijem){
              
      tone( buzzer, 900, 800);
     
      delay(1000);
          }else{
            noTone;
            int vystupcerveny = digitalRead(cervenytim);
      int vystupzlty = digitalRead(zltytim);
      if(vystupcerveny==LOW){
        odezva = 1;
        digitalWrite(cervenaled, HIGH);
        digitalWrite(zltaled, LOW);
        }else if(vystupzlty==LOW){
        odezva = 2;
        digitalWrite(cervenaled, LOW);
        digitalWrite(zltaled, HIGH);
        }
        
        nRF.stopListening();
         nRF.write( &odezva, sizeof(odezva) );
        nRF.startListening();
     while (nRF.available()) {
          nRF.read( &prijem, sizeof(prijem) );
        }
        Serial.println("Prijata volba: ");
        Serial.println(prijem);
        Serial.println("Odozva: ");
        Serial.println(odezva);
        delay(50);
            
            
            }
      
      
      }