NRF24L01 vezetéknélküli WiFi modul kommunikációja

15.Projekt -- NRF24L01 vezetéknélküli modul kommunikációja -- V1.0

 by Roboworld Hobbielektronika


Rövid leírás:
Ebben a rövid projektben bemutatjuk neked hogyan tudsz egy NRF24L01 típusú vezetéknélküli modullal adatokat küldeni és fogadni két Arduino között.

Hardware
1db Arduino Uno
1db Geekcreit Uno Replika (Arduino Uno klón)
2db nRF24L01 2.4G vezetéknélküli adó/vevő modul
Jumper kábel

Kapcsolási rajz:

A projekt során szükség lesz 2 db Arduino-ra, amelyből az egyik az adatok küldésére a másik pedig azoknak a fogadására szolgál. Az adatküldés sikerességéről a Serial Monitor fog informálni minket.

NRF24L01 vezetéknélküli adóvevő modulról
Ez a vezetéknélküli modul egy 2.4GHz-es frekvenciával működő közepes távolságra használható eszköz. Legnagyobb távolsága zavaró tényezők nélkül kb. 100m, normál esetben ez olyan 10m. Adatátviteli sebessége: 250kbps, 1Mbps és 2Mbps. A kommunikáláshoz pedig az SPI interface-t használja.

Fontos megjegyezni, hogy számos felhasználónak okoz problémát a vezeték nélküli modul táplálása, mivel csak 3.3V-on lehet használni. Az 5V-os üzem tönkreteheti. További probléma, hogy a 3.3V-os üzem nem tud elég áramot leadni ezért előfordulhat olyan eset, hogy megszakad a kapcsolat és adatvesztés történik. Ennek a problémának a kiküszöbölésére célszerű egy legalább 3.3uF - 10uF-os kondenzátort helyezni a VCC és a GND lábak közé.

Programozás, mintakód
Ahogy már korábban említettem a kommunikáció létrejöttéhez két Arduinora van szükségünk. Az egyik az adó szerepét fogja játszani, míg a másik a vevőét. Töltsd fel az „RF_ado.ino” programot az egyik Aduinora, majd a másikra a „RF_vevo.ino” programot. Az adatok sikeres megérkeztét a Serail Monitoron nyomon tudjuk követni.

Annak érdekében, hogy a két modul kommunikáljon egymással egy közös kommunikációs vonalat, csövet (pipe) kell létrehozni. Ennek a kommunikációs vonalnak adni kell egy címet. Mindkét modulnak írnia és olvasnia kell a vonalon lévő adatokat a kommunikáció érdekében. A kommunikáció létrehozásához 3 dolog kell: Cím, csatorna, adatsebesség.

Az első a cím, amely „0” nevet kapja.

A második a csatorna amelyiken információt akarunk közvetíteni. Mivel az NRF24L01 chip összesen 126 különböző csatornát támogat, így könnyedén tudunk választani. Fontos, hogy a két modul ugyanazon csatornára legyen beállítva, máskülönben nem jön létre a kapcsolat és az információ csere. A mintakódban a 115 csatornát használjuk.

A harmadik pedig az adatátviteli sebesség. A mintakódban 250Kbs sebességet választottuk, amely a legkisebb lehetséges adatátviteli sebesség, mindezt annak érdekében, hogy nagyobb távolságra eljusson a jel.

A következőkben az adatstruktúráról lesz szó:

A mintakód elején meglett határozva az az adathalmaz, amit elakarunk küldeni. Ez a halmaz áll egy „int” egy „float” és egy „char” tömbből. Ez azért fontos, mivel így a vevő oldalon is ennek megfelelő struktúrára kell beállítani az eszközt. A vevő oldalon várunk egészen addig ameddig a csőben nem jelenik meg adat. Amint elérhető, eltároljuk, majd a struktúrát kiírjuk a Serial Monitorra.
Megvalósítás


Figyelem a jobb alsó sarokban a kommunikációs csatornát állítsuk át „115200 baud”-ra


Mintakód ADÓ
#include <SPI.h>       // SPI kommunikáció library-je 
#include "RF24.h"      // vezetéknélküli modul library-je 
RF24 myRadio (7, 8); 
byte addresses[][6] = {"0"};   // Cím "0" nevet kapja 
struct package                                                                 //Adatstruktúra definiálása 
{ 
int id=1; 
float temperature = 18.3; 
char  text[100] = "Szoveg elkuldve"; 
}; 

typedef struct package Package; 
Package data; 

void setup() 
{                             

Serial.begin(115200);                   // Serial monitor kommunikáció 
delay(1000);                            //vár 1mp-et 
myRadio.begin();  
myRadio.setChannel(115);                // 115-ös csatorna kiválasztása 
myRadio.setPALevel(RF24_PA_MAX);        //maximális átviteli teljesítmény megadása. Több energiát használ //de a hatótávot növeli. 
myRadio.setDataRate( RF24_250KBPS ) ;   //Adatátviteli sebesség meghatározása 
myRadio.openWritingPipe( addresses[0]); // Adó oldalról megnyitni a Pipe-ot a 0-ás címen és írni benne. 
delay(1000); 
} 

void loop() 
{ 
myRadio.write(&data, sizeof(data));     // Adatsturktúra írása a csőbe 
Serial.print("\nPackage:"); 
Serial.print(data.id); 
Serial.print("\n"); 
Serial.println(data.temperature); 
Serial.println(data.text); 
data.id = data.id + 1; 
data.temperature = data.temperature+0.1; 
delay(1000); 
} 

Mintakód VEVŐ
#include <SPI.h>              // SPI kommunikáció library-je 
#include "RF24.h"             // vezetéknélküli modul library-je 
RF24 myRadio (7, 8); 
struct package                //Adatstruktúra definiálása 
{                             // 
int id=0; 
float temperature = 0.0; 
char  text[100] ="empty"; 
}; 
byte addresses[][6] = {"0"};      // Cím "0" nevet kapja 
typedef struct package Package; 
Package data; 

void setup() 
{ 
Serial.begin(115200);             // Serial monitor kommunikáció 
delay(1000);                      //vár 1mp-et 
myRadio.begin();      // 
myRadio.setChannel(115);          // 115-ös csatorna kiválasztása 
myRadio.setPALevel(RF24_PA_MAX);  //maximális átviteli teljesítmény megadása. Több energiát használ de a hatótávot növeli. 
myRadio.setDataRate( RF24_250KBPS ) ;       //Adatátviteli sebesség meghatározása 
myRadio.openReadingPipe(1, addresses[0]);   // Vevő oldalról megnyitni a Pipe-ot a 0-ás címen és olvasni benne. 
myRadio.startListening();                                     // Olvasás kezdete a csőben. 
} 

void loop()  
{ 
if ( myRadio.available())     // Ha a csőben adat érhető el, akkor azt kiolvassa és kiírja a Serial Monitorra. 
{ 
  while (myRadio.available()) 
 { 
   myRadio.read( &data, sizeof(data) ); 
 } 
   Serial.print("\nPackage:");       
   Serial.print(data.id); 
   Serial.print("\n"); 
   Serial.println(data.temperature); 
   Serial.println(data.text); 
} 
} 

Megjegyzések

Megjegyzés küldése