Lekcja 19: Komunikacja radiowa

Tematem lekcji jest komunikacja między dwoma urządzeniami za pomocą fal radiowych. Do tego celu wykorzystamy dwa moduły radiowe 2,4GHz nRF24L01 - jeden do nadawania, drugi do odbioru wiadomości.
Wciskanie przycisków w układzie nadawczym będzie skutkowało zapalaniem się odpowiednich diod w układzie odbiorczym.

Części potrzebne do projektu:

  • Moduł radiowy nRF24L01+ PA LNA 2,4GHz - transceiver THT - 2 szt.,
  • Arduino Uno - 2 szt.,
  • 3 diody led,
  • 3 przyciski,
  • przewody.

Specyfikacja modułu radiowego nRF24L01:

  • Napięcie zasilania: od 1,9 V do 3,6 V,
  • Pobór prądu: 11 mA (przy 0 dbm mocy wejściowej),
  • Częstotliwość pracy: 2,4GHz,
  • Interfejs komunikacyjny: SPI,
  • Prędkość transmisji: 250 kbps, 1 Mbps lub 2 Mbps,
  • Modulacja GFSK,
  • 32-bitowe rejestry FIFO dla nadajnika i odbiornika,
  • Zasięg: do 1000 m,
  • Złącze antenowe: antena 110 mm w zestawie,
  • Automatyczna transmisja pakietów,
  • Wymiary: 40 x 15 mm,
  • Montaż: przewlekany - raster 2,54.

Układ radiowy łączymy z Arduino Uno wg tabeli:

Moduł RF24L01Arduino UNO
GNDGND
CEPin 9
SCK13
MISO12
VCC3,3V !!!!
CSN10
MOSI11

KOD 1 - Piszemy kod w arduino IDE dla układu nadawczego:

#include < SPI.h>
#include < nRF24L01.h>
#include < RF24.h>

RF24 radio(7, 8);
const byte rxAddr[6] = "00001";
int buttonPin0 = 2, buttonPin1 = 3, buttonPin2 = 4;
void setup()
{
  radio.begin();
  radio.setRetries(15, 15);
  radio.openWritingPipe(rxAddr);
  pinMode(buttonPin0, INPUT);
  digitalWrite(buttonPin0, HIGH);
  pinMode(buttonPin1, INPUT);
  digitalWrite(buttonPin1, HIGH);
  pinMode(buttonPin2, INPUT);
  digitalWrite(buttonPin2, HIGH);
  radio.stopListening();
}
void loop()
{
  char dane[3]={
    (char)(digitalRead(buttonPin0)+48),
    (char)(digitalRead(buttonPin1)+48),
    (char)(digitalRead(buttonPin2)+48)
  };
  radio.write(&dane,sizeof(dane));
  delay(200);
}
        

KOD 2 - Piszemy kod w arduino IDE dla układu odbiorczego:

#include 
#include 
#include 

RF24 radio(7, 8);
const byte rxAddr[6] = "00001";
void setup()
{
  while (!Serial);
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(0, rxAddr);
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  radio.startListening();
}
void loop()
{
  if (radio.available())
  {
    char text[3] = {""};
    radio.read(&text, sizeof(text));

    digitalWrite(3,(text[0]=='0')?HIGH:LOW);
    digitalWrite(4,(text[1]=='0')?HIGH:LOW);
    digitalWrite(5,(text[2]=='0')?HIGH:LOW);
  }
  delay(200);
}

Opis kodu 1:

  • W liniach 1-3 - deklarujemy niezbędne biblioteki SPI, nRF24L01 oraz RF24.
  • Linia 5 - z biblioteki RF24 tworzymy obiekt radio na pinach 7 i 8.
  • Linia 6 - deklarujemy adres odbiornika radiowego.
  • Linia 7 - ustawiamy piny dla trzech przycisków.
  • Linia 8 - początek funkcji setup().
  • Linia 10 - ustawianie modemu do współpracy z programem
  • Linia 11 - metoda .setRetries() ustala co jaki czas i ile razy nadajnik ma ponawiać wysyłanie danych.
  • Linia 12 - metoda .openWritingPipes() ustawia adres odbiornika, do którego wysyłamy dane.
  • W liniach 13-18 - ustawiamy tryby obsługi portów cyfrowych dla przycisków, w tym przypadku ustawiamy do odczytu oraz ustawiamy stan napięcia na HIGH.
  • Linia 19 - metoda .stopListening() kończy nasłuchiwanie modemu automatycznie przełączając go na tryb nadawania.
  • Linia 21 - początek funkcji loop()
  • Linia 23 - tworzymy wektor z 3 elementami zawierającymi obecne stany napięć portów cyfrowych, do których podłączone są przyciski.
  • Linia 28 - metodą .write() nadajemy wcześniej odczytane przez nas dane, drugim argumentem jest ilość bajtów jaką radio ma pobrać ze zmiennej do wysłania.
  • Linia 29 - ustawiamy opóźnienie na 200ms.

Opis kodu 2:

  • W liniach 1-3 - deklarujemy potrzebne biblioteki SPI, nRF24L01 oraz RF24.
  • Linia 5 - z biblioteki RF24 tworzymy obiekt radio na pinach 7 i 8.
  • Linia 6 - deklarujemy adres nadajnika radiowego.
  • Linia 7 - początek funkcji setup().
  • Linia 9 - oczekiwanie aż port USB w Arduino przełączy się w tryb portu szeregowego COM.
  • Linia 10 - rozpoczęcie komunikacji z komputerem.
  • Linia 11 - ustawianie modemu do współpracy z programem.
  • Linia 12 - deklaracja adresu nadajnika.
  • W liniach 13-15 - ustawienie trybu działania portów cyfrowych, do których podłączone są diody.
  • Linia 16 - metodą .startListening() rozpoczynamy nasłuchiwanie.
  • Linia 18 - początek funkcji loop().
  • Linia 20 - sprawdzanie metodą .available() czy modem odebrał dane.
  • Linia 22 - przygotowywanie nowego wektora do zapisania odebranych danych.
  • Linia 23 - metodą .read() zapisujemy odebrane dane do wektora „text”.
  • W liniach 25-27 - interpretacja odebranych danych i ustawianie stanu napięcia diód.
  • Linia 29 - ustawienie opóźnienia na 200ms.


Powrót do spisu materiałów

Nowy zakup

Zakupiliśmy nowy moduł Arduino Leonardo i Yun z obsługą sieci przez Ethernet i WiFi.

Nowe czujniki

Mamy nowe czujniki żyroskopowe. Możemy kontrolować położenie robota.

Zajęcia otwarte

Zapraszamy na zajęcia otwarte uczniów klas SP, które odbywają się w każdy poniedziałek w godz. 15.00-16.00 (Prosimy o kontakt w celu zebrania grupy).