Mít dvě nebo více desek Arduino, které spolu mohou komunikovat bezdrátově na dálku, otevírá spoustu možností, jako je vzdálené monitorování dat ze senzorů, ovládání robotů, domácí automatizace a další. A pokud jde o to mít levné a přitom spolehlivé dvoucestné rádiové řešení, nikdo neodvede lepší práci než modul vysílače nRF24L01+ od společnosti Nordic Semiconductor.
Modul vysílače nRF24L01+ (plus) lze často sehnat na internetu za méně než dva dolary, což z něj činí jednu z nejlevnějších možností datové komunikace, kterou můžete získat. A co je nejlepší, tyto moduly jsou velmi malé, což vám umožní začlenit bezdrátové rozhraní do téměř jakéhokoli projektu.
- Přehled hardwaru
- Radiová frekvence
- Co je to pásmo ISM 2,4 GHz?
- Příkon
- Rozhraní SPI
- modul nRF24L01+ Vs modul nRF24L01+ PA/LNA
- Co je PA LNA?
- Jak modul transceiveru nRF24L01+ funguje?
- Frekvence kanálu RF
- nRF24L01+ Multiceiver Network
- Protokol Enhanced ShockBurst
- nRF24L01+ Automatic Packet Handling
- Vývody modulu transceiveru nRF24L01+
- Zapojení – Připojení modulu transceiveru nRF24L01+ k Arduinu UNO
- Knihovna Arduino pro modul nRF24L01+
- Kód Arduina – pro vysílač
- Kód Arduino – pro přijímač
- Zvýšení dosahu modulu transceiveru nRF24L01+
- Snížení šumu napájecího zdroje
- Změňte frekvenci kanálu
- Nižší rychlost přenosu dat
- Co znamená citlivost přijímače (Rx)
- Vyšší výstupní výkon
Přehled hardwaru
Radiová frekvence
Modul transceiveru nRF24L01+ je určen pro provoz v celosvětovém frekvenčním pásmu ISM 2,4 GHz a pro přenos dat používá modulaci GFSK. Rychlost přenosu dat může být jedna z 250 kb/s, 1 Mb/s a 2 Mb/s.
Co je to pásmo ISM 2,4 GHz?
Pásmo 2,4 GHz je jedním z pásem ISM (Industrial, Scientific, and Medical), které je mezinárodně vyhrazeno pro použití nelicencovaných zařízení s malým výkonem. Příkladem jsou bezdrátové telefony, zařízení Bluetooth, zařízení pro komunikaci v blízkém poli (NFC) a bezdrátové počítačové sítě (WiFi), které využívají frekvence ISM.
Příkon
Pracovní napětí modulu je od 1,9 do 3.6 V, ale dobrou zprávou je, že logické vývody jsou tolerantní k 5 V, takže jej můžeme snadno připojit k Arduinu nebo jakémukoli mikrokontroléru s logikou 5 V bez použití převodníku logických úrovní.
Modul podporuje programovatelný výstupní výkon, tj. 0 dBm, -6 dBm, -12 dBm nebo -18 dBm, a při přenosu při 0 dBm spotřebuje neuvěřitelných přibližně 12 mA, což je dokonce méně než jedna LED dioda. A co je nejlepší, spotřebuje 26 µA v pohotovostním režimu a 900 nA v režimu vypnutí. Proto se jedná o bezdrátové zařízení pro aplikace s nízkou spotřebou energie.
Rozhraní SPI
Modul vysílače nRF24L01+ komunikuje prostřednictvím 4pólového sériového periferního rozhraní (SPI) s maximální rychlostí přenosu dat 10 Mbps. Všechny parametry, jako je frekvenční kanál (125 volitelných kanálů), výstupní výkon (0 dBm, -6 dBm, -12 dBm nebo -18 dBm) a rychlost přenosu dat (250 kb/s, 1 Mb/s nebo 2 Mb/s), lze konfigurovat prostřednictvím rozhraní SPI.
Sběrnice SPI používá koncept Master a Slave, ve většině běžných aplikací je náš Arduino Master a modul transceiveru nRF24L01+ Slave. Na rozdíl od sběrnice I2C je počet slave na sběrnici SPI omezen, na Arduino Uno můžete použít maximálně dva slave SPI, tj. dva moduly transceiveru nRF24L01+.
Zde jsou kompletní specifikace:
Frekvenční rozsah | 2.4 GHz ISM Band |
Maximální rychlost vzdušných dat | 2 Mb/s |
Modulační formát | GFSK |
Max. Výstupní výkon | 0 dBm |
Provozní napájecí napětí | 1,9 V až 3,6 V |
Max. Provozní proud | 13,5 mA |
Min. Proud (pohotovostní režim) | 26µA |
Logické vstupy | 5V tolerantní |
Komunikační dosah | 800+ m (vedení viditelnosti) |
modul nRF24L01+ Vs modul nRF24L01+ PA/LNA
Na základě čipu nRF24L01+ jsou k dispozici různé moduly. Níže jsou uvedeny nejoblíbenější verze.
První verze používá vestavěnou anténu. To umožňuje kompaktnější verzi rozbočovače. Menší anténa však také znamená menší přenosový dosah. S touto verzí budete moci komunikovat na vzdálenost 100 metrů. To je samozřejmě venku na volném prostranství. V interiéru bude váš dosah, zejména přes zdi, mírně oslaben.
Druhá verze je vybavena konektorem SMA a anténou typu duck, ale to není ten pravý rozdíl. Skutečný rozdíl je v tom, že se dodává se speciálním čipem RFX2401C, který integruje PA, LNA a obvody pro přepínání vysílání a příjmu. Tento čip pro prodloužení dosahu spolu s duck-anténou pomáhá modulu dosáhnout výrazně většího přenosového dosahu přibližně 1000 m.
Co je PA LNA?
PA je zkratka pro výkonový zesilovač. Pouze zvyšuje výkon signálu přenášeného z čipu nRF24L01+. Zatímco LNA je zkratka pro nízkošumový zesilovač. Úkolem LNA je převzít
extrémně slabý a nejistý signál z antény (obvykle v řádu mikrovoltů nebo pod -100 dBm) a zesílit jej na užitečnější úroveň (obvykle kolem 0 dBm).5 až 1V)
Nízkošumový zesilovač (LNA) přijímací cesty a výkonový zesilovač (PA) vysílací cesty se k anténě připojují přes duplexer, který oba signály odděluje a zabraňuje přetížení citlivého vstupu LNA relativně silným výstupem PA. Další informace naleznete v tomto článku na webu digikey.com
Až na tento rozdíl jsou oba moduly drop-in kompatibilní. To znamená, že pokud sestavíte projekt s jedním z nich, můžete jej jednoduše odpojit a použít jiný, aniž byste museli provádět jakékoli změny v systému.
Jak modul transceiveru nRF24L01+ funguje?
Frekvence kanálu RF
Modul transceiveru nRF24L01+ vysílá a přijímá data na určité frekvenci nazývané kanál. Také proto, aby spolu mohly komunikovat dva nebo více transceiverových modulů, musí být na stejném kanálu. Tímto kanálem může být jakákoli frekvence v pásmu ISM 2,4 GHz, přesněji řečeno může být v rozsahu 2,400 až 2,525 GHz (2400 až 2525 MHz).
Každý kanál zabírá šířku pásma menší než 1 MHz. To nám dává 125 možných kanálů s odstupem 1MHz. Modul tedy může využívat 125 různých kanálů, což dává možnost mít síť 125 nezávisle pracujících modemů na jednom místě.
Kanál zabírá šířku pásma menší než 1MHz při rychlosti přenosu dat 250 kb/s a rychlosti přenosu dat vzduchem 1 Mb/s. Při rychlosti vzdušných dat 2Mb/s však zabírá šířku pásma 2MHz (širší než rozlišení nastavení frekvence RF kanálu). Chcete-li tedy zajistit, aby se kanály nepřekrývaly, a omezit vzájemné přeslechy v režimu 2Mb/s, musíte mezi dvěma kanály dodržet odstup 2MHz.
Frekvence RF kanálu vybraného kanálu se nastavuje podle následujícího vzorce:
Frekvence(Vybraný) = 2400 + CH(Vybraný)
Pokud například vyberete 108 jako kanál pro přenos dat, frekvence VF kanálu vašeho kanálu bude 2508MHz (2400 + 108)
nRF24L01+ Multiceiver Network
NRF24L01+ poskytuje funkci zvanou Multiceiver. Je to zkratka pro Multiple Transmitters Single Receiver (více vysílačů s jedním přijímačem). V níž je každý RF kanál logicky rozdělen na 6 paralelních datových kanálů zvaných Data Pipes. Jinými slovy, datová trubka je logický kanál ve fyzickém RF kanálu. Každá datová trubka má svou vlastní fyzickou adresu (Data Pipe Address) a lze ji konfigurovat. To lze znázornit podle následujícího obrázku.
Pro zjednodušení výše uvedeného schématu si představte, že primární přijímač funguje jako rozbočovací přijímač shromažďující informace ze 6 různých vysílacích uzlů současně. Rozbočovací přijímač může kdykoli přestat poslouchat a funguje jako vysílač. To však lze provést pouze po jedné trubce/uzlu.
Protokol Enhanced ShockBurst
Přijímací modul nRF24L01+ používá strukturu paketů známou jako Enhanced ShockBurst. Tato jednoduchá struktura paketu je rozdělena na 5 různých polí, což je znázorněno níže.
Původní struktura ShockBurst se skládala pouze z polí Preamble, Address, Payload a Cyclic Redundancy Check (CRC). Vylepšený ShockBurst přinesl větší funkčnost pro dokonalejší komunikaci pomocí nově zavedeného pole PCF (Packet Control Field).
Tato nová struktura je skvělá z několika důvodů. Zaprvé umožňuje měnit délku užitečného zatížení pomocí specifikátoru délky užitečného zatížení, což znamená, že užitečné zatížení se může pohybovat od 1 do 32 bajtů.
Zadruhé poskytuje každému odesílanému paketu ID paketu, které umožňuje přijímacímu zařízení určit, zda je zpráva nová, nebo zda byla odeslána znovu (a může být tedy ignorována).
Nakonec, a to je nejdůležitější, může každá zpráva požádat o zaslání potvrzení, když ji přijme jiné zařízení.
nRF24L01+ Automatic Packet Handling
Nyní probereme tři scénáře, abychom lépe pochopili, jak spolu dva moduly nRF24L01+ komunikují.
Transakce s potvrzením a přerušenímToto je příklad pozitivního scénáře. Zde vysílač zahájí komunikaci odesláním datového paketu příjemci. Jakmile je celý paket odeslán, čeká (přibližně 130 µs) na přijetí paketu s potvrzením (paket ACK). Jakmile přijímač paket přijme, odešle vysílači paket ACK. Po přijetí paketu ACK vysílač přivolá signál přerušení (IRQ), který signalizuje, že jsou k dispozici nová data.
Transakce se ztrátou datového paketuJedná se o negativní scénář, kdy je nutné opakované vysílání z důvodu ztráty vysílaného paketu. Po odeslání paketu vysílač čeká na přijetí paketu ACK. Pokud jej vysílač neobdrží během doby automatického opakovaného přenosu (ARD), paket se znovu přenese. Když je retransmitovaný paket přijat přijímačem, je vyslán paket ACK, který zase generuje přerušení na vysílači.
Transakce se ztrátou potvrzeníToto je opět negativní scénář, kdy je nutné retransmitovat z důvodu ztráty paketu ACK. Zde, i když příjemce obdrží paket na první pokus, si vysílač v důsledku ztráty paketu ACK myslí, že příjemce paket vůbec nedostal. Proto po uplynutí doby Auto-Retransmit-Delay paket znovu odešle. Když nyní přijímač obdrží paket obsahující stejné ID jako předchozí paket, zahodí jej a znovu odešle paket ACK.
Celé toto zpracování paketů provádí čip nRF24L01+ automaticky bez účasti mikrokontroléru.
Vývody modulu transceiveru nRF24L01+
Podívejme se na vývody obou verzí modulu transceiveru nRF24L01+.
GND je zemnicí pin. Obvykle se označuje zapouzdřením kolíku do čtverečku, aby se dal použít jako reference pro identifikaci ostatních kolíků.
VCC napájí modul. Může mít napětí od 1,9 do 3,9 V. Můžete jej připojit k výstupu 3,3 V z vašeho Arduina. Nezapomeňte, že jeho připojení na 5V pin pravděpodobně zničí váš modul nRF24L01+!
CE (Chip Enable) je pin s aktivním vysokým napětím. Po jeho zvolení bude nRF24L01 buď vysílat, nebo přijímat, podle toho, v jakém režimu se právě nachází.
CSN (Chip Select Not) je aktivní-LOW pin a normálně zůstává HIGH. Když je tento pin nízký, začne nRF24L01 naslouchat na svém portu SPI pro data a podle toho je zpracovává.
SCK (Serial Clock) přijímá hodinové impulsy poskytované sběrnicí SPI Master.
MOSI (Master Out Slave In) je vstup SPI do nRF24L01.
MISO (Master In Slave Out) je výstup SPI z nRF24L01.
IRQ je pin přerušení, který může upozornit master, když jsou k dispozici nová data ke zpracování.
Zapojení – Připojení modulu transceiveru nRF24L01+ k Arduinu UNO
Teď, když jsme dokonale pochopili, jak modul transceiveru nRF24L01+ funguje, můžeme ho začít připojovat k našemu Arduinu!
Na začátek připojte pin VCC na modulu k 3,3 V na Arduinu a pin GND k zemi. Piny CSN a CE lze připojit k libovolnému digitálnímu pinu na Arduinu. V našem případě jsou připojeny k digitálním pinům #8 a #9. Nyní nám zbývají piny, které se používají pro komunikaci SPI.
Jelikož modul vysílače nRF24L01+ vyžaduje velký přenos dat, podají nejlepší výkon, když budou připojeny až k hardwarovým pinům SPI na mikrokontroléru. Hardwarové piny SPI jsou mnohem rychlejší než „bitování“ kódu rozhraní pomocí jiné sady pinů.
Poznamenejte, že každá deska Arduino má jiné piny SPI, které je třeba podle toho připojit. U desek Arduino, jako je UNO/Nano V3.0, jsou tyto piny digitální 13 (SCK), 12 (MISO) a 11 (MOSI).
Pokud máte Mega, jsou tyto piny jiné! Budete chtít použít digitální 50 (MISO), 51 (MOSI), 52 (SCK) a 53 (SS). Pro rychlé pochopení viz níže uvedená tabulka.
MOSI | MISO | SCK | |
Arduino Uno | 11 | 12 | 13 |
Arduino Nano | 11 | 12 | 13 |
Arduino Mega | 51 | 50 | 52 |
V případě, že používáte jinou desku Arduino, než je uvedeno výše, doporučujeme před dalším postupem nahlédnout do oficiální dokumentace Arduina.
Pamatujte! Je třeba vytvořit dva tyto obvody. Jeden funguje jako vysílač a druhý jako přijímač. Zapojení obou je identické.
Jakmile máte vše zapojeno, můžete začít pracovat!
Knihovna Arduino pro modul nRF24L01+
Spojení s modulem vysílače nRF24L01+ je hromada práce, ale naštěstí pro nás existuje řada knihoven. Jednou z oblíbených knihoven je RF24. Tato knihovna existuje již několik let. Je jednoduchá na používání pro začátečníky, ale přesto nabízí mnoho pro pokročilé uživatele. V našich experimentech budeme používat stejnou knihovnu.
Nejnovější verzi knihovny si můžete stáhnout na forku repozitáře RF24 GitHub nebo, stačí kliknout na toto tlačítko a stáhnout si zip:
Pro instalaci otevřete Arduino IDE, přejděte na Sketch > Include Library > Add .ZIP Library a vyberte právě stažený soubor RF24-master. Pokud potřebujete více informací o instalaci knihovny, navštivte tento návod Instalace knihovny Arduino.
Kód Arduina – pro vysílač
V našem experimentu budeme pouze posílat tradiční zprávu „Hello World“ z vysílače do přijímače.
Tady je sketch, který budeme používat pro náš vysílač:
//Include Libraries#include <SPI.h>#include <nRF24L01.h>#include <RF24.h>//create an RF24 objectRF24 radio(9, 8); // CE, CSN//address through which two modules communicate.const byte address = "00001";void setup(){ radio.begin(); //set the address radio.openWritingPipe(address); //Set module as transmitter radio.stopListening();}void loop(){ //Send message to receiver const char text = "Hello World"; radio.write(&text, sizeof(text)); delay(1000);}
Sketch začíná zahrnutím knihoven. Knihovna SPI.h se stará o komunikaci SPI, zatímco nRF24L01.h a RF24.h řídí modul.
//Include Libraries#include <SPI.h>#include <nRF24L01.h>#include <RF24.h>
Následuje vytvoření objektu RF24. Objekt bere jako parametry dvě čísla pinů, ke kterým jsou připojeny signály CE a CSN.
//create an RF24 objectRF24 radio(9, 8); // CE, CSN
Dále musíme vytvořit pole bajtů, které bude představovat adresu roury, přes kterou komunikují dva moduly nRF24L01+.
//address through which two modules communicate.const byte address = "00001";
Hodnotu této adresy můžeme změnit na libovolný 5písmenný řetězec, například „node1“. Tato adresa je nutná, pokud máte v síti několik modulů. Díky adrese si můžete vybrat konkrétní modul, se kterým máte zájem komunikovat, takže v našem případě budeme mít stejnou adresu pro vysílač i přijímač.
Dále ve funkci nastavení: musíme inicializovat rádiový objekt pomocí radio.begin()
a pomocí funkce radio.openWritingPipe()
nastavíme adresu vysílače.
//set the addressradio.openWritingPipe(address);
Nakonec použijeme funkci radio.stopListening()
, která nastaví modul jako vysílač.
//Set module as transmitterradio.stopListening();
V části smyčky: vytvoříme pole znaků, do kterého přiřadíme zprávu „Hello World“. Pomocí funkce radio.write()
odešleme tuto zprávu příjemci. Prvním argumentem je zde zpráva, kterou chceme odeslat. Druhým argumentem je počet bajtů přítomných v této zprávě.
const char text = "Hello World";radio.write(&text, sizeof(text));
Pomocí této metody můžete odeslat až 32 bajtů najednou. To je totiž maximální velikost jednoho paketu, kterou dokáže nRF24L01+ zpracovat. Pokud potřebujete potvrzení, že příjemce data přijal, metoda radio.write()
vrací hodnotu bool
. Pokud vrátí hodnotu TRUE, data k přijímači dorazila. Pokud vrací FALSE, data byla ztracena.
funkce radio.write() blokuje program, dokud nedostane potvrzení nebo dokud nevyčerpá všechny pokusy o opakované vysílání.
Kód Arduino – pro přijímač
Tady je skica, kterou budeme používat pro náš přijímač
//Include Libraries#include <SPI.h>#include <nRF24L01.h>#include <RF24.h>//create an RF24 objectRF24 radio(9, 8); // CE, CSN//address through which two modules communicate.const byte address = "00001";void setup(){ while (!Serial); Serial.begin(9600); radio.begin(); //set the address radio.openReadingPipe(0, address); //Set module as receiver radio.startListening();}void loop(){ //Read the data if available in buffer if (radio.available()) { char text = {0}; radio.read(&text, sizeof(text)); Serial.println(text); }}
Tento program vypadá dost podobně jako program vysílače, až na některé změny.
Na začátku funkce setup spustíme sériovou komunikaci. Dále pomocí funkce radio.setReadingPipe()
nastavíme stejnou adresu jako u vysílače a tím umožníme komunikaci mezi vysílačem a přijímačem.
//set the address radio.openReadingPipe(0, address);
Prvním argumentem je číslo streamu. Lze vytvořit až 6 streamů, které odpovídají na různé adresy. My jsme vytvořili pouze adresu pro stream číslo 0. Druhým argumentem je adresa, na kterou bude stream reagovat pro sběr dat.
Dalším krokem je nastavení modulu jako přijímače a zahájení příjmu dat. K tomu použijeme funkci radio.startListening()
. Od tohoto okamžiku modem čeká na data zaslaná na zadanou adresu.
//Set module as receiver radio.startListening();
Ve funkci smyčka: Sketch pomocí metody radio.available()
zkontroluje, zda na adresu dorazila nějaká data. Tato metoda vrací hodnotu TRUE, pokud máme ve vyrovnávací paměti k dispozici nějaká data.
if (radio.available()) { char text = {0}; radio.read(&text, sizeof(text)); Serial.println(text); }
Pokud data přišla, pak vytvoří pole o 32 znacích vyplněné nulami (později jej program naplní přijatými daty). Pro čtení dat použijeme metodu radio.read (& text, sizeof (text)). Tím se přijatá data uloží do našeho pole znaků.
Na závěr pouze vypíšeme přijatou zprávu na sériový monitor. Pokud jste vše provedli v pořádku a nedošlo k chybám v připojení, měli byste na sériovém monitoru vidět něco takového.
Zvýšení dosahu modulu transceiveru nRF24L01+
Klíčovým parametrem bezdrátového komunikačního systému je komunikační dosah. V mnoha případech je to rozhodující faktor pro výběr RF řešení. Pojďme tedy probrat, co můžeme udělat, abychom dosáhli lepšího dosahu našeho modulu.
Snížení šumu napájecího zdroje
Vf obvod, který generuje radiofrekvenční (RF) signál, je velmi citlivý na šum napájecího zdroje. Pokud není kontrolován, může šum napájecího zdroje výrazně snížit dosah, který můžete získat.
Pokud není zdrojem napájení samostatná baterie, je velká pravděpodobnost, že s generováním napájení je spojen šum. Aby se tento šum nedostal do systému, doporučujeme umístit přes napájecí vedení co nejblíže modulu nRF24L01+ fyzicky filtrační kondenzátor 10 µf.
Nejjednodušší způsob, jak se s tím vyrovnat, je použít velmi levný modul adaptéru pro nRF24L01.
Modul adaptéru má osmipinový konektor samice, který vám umožní připojit modul nRF24L01. Lze do něj umístit oba moduly, o kterých jsme hovořili dříve, tedy jeden s integrovanou anténou a druhý s externí anténou (PA/LNA). Má také 6pinový konektor samec pro připojení SPI a přerušení a 2pinový konektor pro vstup napájení.
Adaptérový modul má vlastní 3,3voltový regulátor napětí a sadu filtračních kondenzátorů, takže jej můžete napájet 5voltovým zdrojem.
Změňte frekvenci kanálu
Dalším potenciálním zdrojem šumu pro RF obvod je vnější prostředí, zejména pokud máte na stejném kanálu nastavené sousední sítě nebo rušení od jiné elektroniky.
Abyste předešli problémům způsobeným těmito signály, doporučujeme používat nejvyšších 25 kanálů vašeho modulu nRF24L01+. Důvodem je, že WiFi využívá většinu nižších kanálů.
Nižší rychlost přenosu dat
Modul nRF24L01+ nabízí nejvyšší citlivost přijímače při rychlosti 250 Kb/s, která je -94 dBm. Při rychlosti přenosu dat 2MBps však citlivost přijímače klesá na -82dBm. Pokud mluvíte tímto jazykem, víte, že přijímač při rychlosti 250Kbps je téměř desetkrát citlivější než při rychlosti 2Mbps. To znamená, že přijímač dokáže dekódovat 10krát slabší signál.
Co znamená citlivost přijímače (Rx)
Citlivost přijímače je nejnižší úroveň výkonu, při které je přijímač schopen detekovat RF signál. Čím větší je absolutní hodnota záporného čísla, tím lepší je citlivost přijímače. Například citlivost přijímače -94 dBm je o 12 dB lepší než citlivost přijímače -82 dBm.
Snížením rychlosti přenosu dat lze tedy výrazně zlepšit dosah, kterého můžete dosáhnout. Také pro většinu našich projektů je rychlost 250 Kb/s více než dostačující.
Vyšší výstupní výkon
Nastavení maximálního výstupního výkonu může také zlepšit dosah komunikace. Model nRF24L01+ umožňuje zvolit jeden z výstupních výkonů, a to 0 dBm, -6 dBm, -12 dBm nebo -18 dBm. Výběrem výstupního výkonu 0 dBm se vysílá silnější signál vzduchem.
.