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);
}
}
Ezt a megjegyzést eltávolította a szerző.
VálaszTörlésJó kis leírás müködött nekem nano-val saját programot drivertól alapvetően akrok írni egy programot, de mivel kuminikációrol van szó ilyenkor kell minimum egy biztosan müködő pont amin tesztelni tudom a sajátomat és ez most a te leírásod lett
VálaszTörlés