Hvis to eller flere Arduino-kort er i stand til at kommunikere trådløst med hinanden over en afstand åbner masser af muligheder som f.eks. fjernovervågning af sensordata, styring af robotter, automatisering af hjemmet og listen fortsætter. Og når det drejer sig om at have billige, men pålidelige 2-vejs RF-løsninger, er der ingen, der gør et bedre stykke arbejde end nRF24L01+ transceivermodulet fra Nordic Semiconductor.
nRF24L01+ (plus) transceivermodulet kan ofte fås online for mindre end to dollars, hvilket gør det til en af de billigste datakommunikationsmuligheder, som du kan få. Og det bedste af det hele er, at disse moduler er superlille, så du kan inkorporere en trådløs grænseflade i næsten ethvert projekt.
- Hardwareoversigt
- Radiofrekvens
- Hvad er 2,4 GHz ISM-båndet?
- Effektforbrug
- SPI-interface
- nRF24L01+ modul Vs nRF24L01+ PA/LNA modul
- Hvad er PA LNA?
- Hvordan fungerer nRF24L01+ transceivermodulet?
- RF kanalfrekvens
- nRF24L01+ Multiceiver-netværk
- Enhanced ShockBurst Protocol
- nRF24L01+ Automatic Packet Handling
- nRF24L01+ transceivermodul Pinout
- Kobling – Tilslutning af nRF24L01+ transceivermodul til Arduino UNO
- RF24 Arduino Library for nRF24L01+ Module
- Arduino-kode – til sender
- Arduino-kode – til modtager
- Forbedring af rækkevidden af nRF24L01+ transceivermodul
- Reducer strømforsyningsstøj
- Opnyt din kanalfrekvens
- Lavere datahastighed
- Hvad betyder modtagerens (Rx) følsomhed?
- Højere udgangseffekt
Hardwareoversigt
Radiofrekvens
Det nRF24L01+ transceivermodul er designet til at fungere i det verdensomspændende ISM-frekvensbånd på 2,4 GHz og bruger GFSK-modulation til datatransmission. Dataoverførselshastigheden kan være en af 250 kbps, 1 Mbps og 2 Mbps.
Hvad er 2,4 GHz ISM-båndet?
2,4 GHz-båndet er et af de industrielle, videnskabelige og medicinske (ISM) bånd, der er internationalt reserveret til brug for ulicenseret lav-effekt-enheder. Eksempler er trådløse telefoner, Bluetooth-enheder, NFC-enheder (Near Field Communication) og trådløse computernetværk (WiFi) bruger alle ISM-frekvenserne.
Effektforbrug
Driftsspændingen for modulet er fra 1,9 til 3.6V, men den gode nyhed er, at logikstifterne er 5-volt tolerante, så vi kan nemt tilslutte det til en Arduino eller en hvilken som helst 5V logisk mikrocontroller uden at bruge nogen logikniveaukonverter.
Modulet understøtter programmerbar udgangseffekt dvs. 0 dBm, -6 dBm, -12 dBm eller -18 dBm og forbruger utroligt nok omkring 12 mA under transmissionen ved 0 dBm, hvilket er endnu lavere end en enkelt LED. Og det bedste af det hele er, at den bruger 26 µA i standbytilstand og 900 nA i sluktilstand. Derfor er de den foretrukne trådløse enhed til applikationer med lavt strømforbrug.
SPI-interface
Transceivermodulet nRF24L01+ kommunikerer over et 4-pin Serial Peripheral Interface (SPI) med en maksimal datahastighed på 10 Mbps. Alle parametre såsom frekvenskanal (125 valgbare kanaler), udgangseffekt (0 dBm, -6 dBm, -12 dBm eller -18 dBm) og datahastighed (250kbps, 1Mbps eller 2Mbps) kan konfigureres via SPI-interface.
SPI-bussen anvender et koncept med en Master og Slave, i de mest almindelige applikationer er vores Arduino Master og nRF24L01+ transceivermodulet er Slave. I modsætning til I2C-bussen er antallet af slaver på SPI-bussen begrænset, på Arduino Uno kan du maksimalt bruge to SPI-slaver, dvs. to nRF24L01+ transceivermoduler.
Her er de komplette specifikationer:
Frekvensområde | 2.4 GHz ISM-bånd |
Maximal luftdatahastighed | 2 Mb/s |
Moduleringsformat | GFSK |
Max. Udgangseffekt | 0 dBm |
Bedriftsforsyningsspænding | 1,9 V til 3,6 V |
Max. Driftsstrøm | 13,5mA |
Min. Strøm (standbytilstand) | 26µA |
Logiske indgange | 5V tolerant |
Kommunikationsområde | 800+ m (linje of sight) |
nRF24L01+ modul Vs nRF24L01+ PA/LNA modul
Der findes en række forskellige moduler baseret på nRF24L01+ chippen. Nedenfor er de mest populære versioner.
Den første version bruger indbygget antenne. Dette giver mulighed for en mere kompakt version af breakoutet. Den mindre antenne betyder dog også en lavere transmissionsrækkevidde. Med denne version vil du kunne kommunikere over en afstand på 100 meter. Det er selvfølgelig udendørs på et åbent sted. Din rækkevidde indendørs, især gennem vægge, vil være lidt svækket.
Den anden version kommer med et SMA-stik og en ande-antenne, men det er ikke den egentlige forskel. Den virkelige forskel er, at den kommer med en særlig RFX2401C-chip, som integrerer PA, LNA og sende-modtage-koblingskredsløb. Denne range extender-chip sammen med en duck-antenne hjælper modulet med at opnå en betydeligt større transmissionsrækkevidde på ca. 1000 m.
Hvad er PA LNA?
Pa står for Power Amplifier. Den øger blot effekten af det signal, der transmitteres fra nRF24L01+-chippen. Hvorimod LNA står for Low-Noise Amplifier (forstærker med lavt støjniveau). LNA’ens funktion er at tage det
ekstremt svage og usikre signal fra antennen (normalt i størrelsesordenen mikrovolt eller under -100 dBm) og forstærke det til et mere brugbart niveau (normalt ca. 0.5 til 1V)
Den støjsvage forstærker (LNA) i modtagervejen og effektforstærkeren (PA) i sendevejen forbindes med antennen via en duplexer, som adskiller de to signaler og forhindrer, at den relativt kraftige PA-udgang overbelaster den følsomme LNA-indgang. For yderligere oplysninger se denne artikel på digikey.com
Bortset fra denne forskel er begge moduler drop-in-kompatible. Det betyder, at hvis du bygger dit projekt med det ene, kan du bare trække stikket ud og bruge det andet uden at skulle foretage ændringer i systemet.
Hvordan fungerer nRF24L01+ transceivermodulet?
RF kanalfrekvens
Det nRF24L01+ transceivermodul sender og modtager data på en bestemt frekvens kaldet kanal. For at to eller flere transceivermoduler kan kommunikere med hinanden, skal de også befinde sig på samme kanal. Denne kanal kan være en hvilken som helst frekvens i ISM-båndet på 2,4 GHz eller mere præcist mellem 2,400 og 2,525 GHz (2400 og 2525 MHz).
Hver kanal optager en båndbredde på mindre end 1 MHz. Dette giver os 125 mulige kanaler med 1 MHz mellemrum. Modulet kan altså bruge 125 forskellige kanaler, hvilket giver mulighed for at have et netværk af 125 uafhængigt fungerende modemmer på ét sted.
Kanalen optager en båndbredde på mindre end 1 MHz ved 250 kbit/s og 1 Mbps luftdatahastighed. Men ved en luftdatahastighed på 2 Mbps er 2 MHz båndbredde optaget (bredere end opløsningen af RF-kanalfrekvensindstillingen). Så for at sikre, at kanalerne ikke overlapper hinanden, og for at reducere krydstale i 2 Mbps-tilstand skal du holde en afstand på 2 MHz mellem to kanaler.
RF-kanalfrekvensen for din valgte kanal indstilles i henhold til følgende formel:
Freq(Selected) = 2400 + CH(Selected)
Til eksempel, hvis du vælger 108 som din kanal til datatransmission, vil RF-kanalfrekvensen for din kanal være 2508 MHz (2400 + 108)
nRF24L01+ Multiceiver-netværk
Den nRF24L01+ har en funktion kaldet Multiceiver. Det er en forkortelse for Multiple Transmitters Single Receiver. I hvilken hver RF-kanal er logisk opdelt i 6 parallelle datakanaler kaldet Data Pipes. Med andre ord er et datapipe en logisk kanal i den fysiske RF-kanal. Hvert datapipe har sin egen fysiske adresse (Data Pipe Address) og kan konfigureres. Dette kan illustreres som vist nedenfor.
For at forenkle ovenstående diagram forestiller man sig, at den primære modtager fungerer som en hub-modtager, der indsamler oplysninger fra 6 forskellige senderknudepunkter samtidig. Hubmodtageren kan til enhver tid stoppe med at lytte og fungerer som en sender. Men dette kan kun ske ét rør/en knude ad gangen.
Enhanced ShockBurst Protocol
Det nRF24L01+ transceivermodul anvender en pakkestruktur, der er kendt som Enhanced ShockBurst. Denne enkle pakkestruktur er opdelt i 5 forskellige felter, som er illustreret nedenfor.
Den oprindelige ShockBurst-struktur bestod kun af Preamble-, Adresse-, Payload- og CRC-felterne (Cyclic Redundancy Check – Cyclic Redundancy Check). Enhanced ShockBurst medførte større funktionalitet til mere forbedret kommunikation ved hjælp af et nyligt indført Packet Control Field (PCF).
Denne nye struktur er fantastisk af en række årsager. For det første giver den mulighed for payloads af variabel længde med en payload length specifier, hvilket betyder, at payloads kan variere fra 1 til 32 bytes.
For det andet giver den hver sendt pakke et pakke-id, som gør det muligt for den modtagende enhed at afgøre, om en meddelelse er ny, eller om den er blevet genudsendt (og dermed kan ignoreres).
Endeligt og vigtigst af alt kan hver meddelelse anmode om, at der sendes en kvittering, når den modtages af en anden enhed.
nRF24L01+ Automatic Packet Handling
Nu skal vi diskutere tre scenarier for at få en bedre forståelse af, hvordan to nRF24L01+-moduler transagerer med hinanden.
Transaktion med kvittering og afbrydelseDette er et eksempel på et positivt scenarie. Her starter senderen en kommunikation ved at sende en datapakke til modtageren. Når hele pakken er sendt, venter den (ca. 130 µs) på at modtage kvitteringspakken (ACK-pakke). Når modtageren modtager pakken, sender den en ACK-pakke til senderen. Ved modtagelse af ACK-pakken aktiverer senderen interrupt-signalet (IRQ) for at angive, at de nye data er tilgængelige.
Transaktion med tabt datapakkeDette er et negativt scenarie, hvor der er behov for en genudsendelse på grund af tab af den overførte pakke. Efter at pakken er overført, venter senderen på at modtage ACK-pakken. Hvis senderen ikke modtager den inden for ARD-tiden (Auto-Retransmit-Delay), genudsendes pakken. Når modtageren modtager den genudsendte pakke, sendes ACK-pakken, som igen genererer en afbrydelse hos senderen.
Transaktion med mistet kvitteringDette er igen et negativt scenarie, hvor en genudsendelse er nødvendig på grund af tab af ACK-pakken. Selv om modtageren modtager pakken i første forsøg, tror senderen her, at modtageren slet ikke har modtaget pakken på grund af tabet af ACK-pakken, at modtageren ikke har modtaget pakken. Så efter udløbet af den automatiske videresendelsesforsinkelsestid videresender den pakken. Når modtageren nu modtager pakken, der indeholder samme pakke-ID som den foregående, kasserer den den og sender ACK-pakken igen.
Hele denne pakkehåndtering udføres automatisk af nRF24L01+-chippen uden inddragelse af mikrocontrolleren.
nRF24L01+ transceivermodul Pinout
Lad os se på pinoutet for begge versioner af nRF24L01+ transceivermodulet.
GND er Ground Pin. Den er normalt markeret ved at indkapsle stiften i en firkant, så den kan bruges som reference til at identificere de andre stifter.
VCC leverer strøm til modulet. Dette kan være et sted fra 1,9 til 3,9 volt. Du kan tilslutte den til 3,3 V-udgangen fra din Arduino. Husk at tilslutning af den til 5V-stiften vil sandsynligvis ødelægge dit nRF24L01+-modul!
CE (Chip Enable) er en aktiv-HIGH-stift. Når den er valgt, vil nRF24L01 enten sende eller modtage, afhængigt af hvilken tilstand den er i øjeblikket.
CSN (Chip Select Not) er en aktiv-LOW pin og holdes normalt HIGH. Når denne pin går lavt, begynder nRF24L01 at lytte på sin SPI-port efter data og behandler dem i overensstemmelse hermed.
SCK (Serial Clock) accepterer clockimpulser, der leveres af SPI-busmasteren.
MOSI (Master Out Slave In) er SPI-indgang til nRF24L01.
MISO (Master In Slave Out) er SPI-udgang fra nRF24L01.
IRQ er en interrupt-pin, der kan advare masteren, når der er nye data til rådighed til behandling.
Kobling – Tilslutning af nRF24L01+ transceivermodul til Arduino UNO
Nu da vi har en fuldstændig forståelse af, hvordan nRF24L01+ transceivermodulet fungerer, kan vi begynde at tilslutte det til vores Arduino!
Til at begynde med skal du forbinde VCC-stiften på modulet til 3,3 V på Arduino’en og GND-stiften til jord. Stifterne CSN og CE kan forbindes til en hvilken som helst digital pin på Arduino’en. I vores tilfælde er det forbundet til henholdsvis digital pin#8 og #9. Nu er vi tilbage med de pins, der bruges til SPI-kommunikation.
Da nRF24L01+ transceivermodulet kræver meget dataoverførsel, vil de give den bedste ydelse, når de er tilsluttet op til hardware-SPI-pins på en mikrocontroller. Hardware-SPI-stifterne er meget hurtigere end at “bit-banging” grænsefladekoden ved hjælp af et andet sæt stifter.
Bemærk, at hvert Arduino Board har forskellige SPI-stifter, som skal tilsluttes i overensstemmelse hermed. For Arduino boards som UNO/Nano V3.0 er disse pins digitale 13 (SCK), 12 (MISO) og 11 (MOSI).
Hvis du har en Mega, er pinsene anderledes! Du skal bruge digital 50 (MISO), 51 (MOSI), 52 (SCK), og 53 (SS). Se nedenstående tabel for hurtig forståelse.
MOSI | MISO | SCK | ||
Arduino Uno | 11 | 11 | 12 | 13 |
Arduino Nano | 11 | 12 | 13 | |
Arduino Mega | 51 | 50 | 52 |
Hvis du bruger et andet Arduino-board end det ovenfor nævnte, er det tilrådeligt at tjekke den officielle Arduino-dokumentation, før du går videre.
Husk! Du skal lave to af disse kredsløb. Det ene fungerer som en sender og det andet som en modtager. Ledningerne til begge er identiske.
Når du har alt tilsluttet, er du klar til at gå i gang!
RF24 Arduino Library for nRF24L01+ Module
Interfacing med nRF24L01+ transceivermodul er en masse arbejde, men heldigvis for os, er der en række biblioteker til rådighed. Et af de populære biblioteker er RF24. Dette bibliotek har eksisteret i flere år. Det er enkelt at bruge for begyndere, men tilbyder alligevel en masse for avancerede brugere. I vores eksperimenter vil vi bruge det samme bibliotek.
Du kan downloade den seneste version af biblioteket på RF24 GitHub repository fork eller, bare klik på denne knap for at downloade zip-filen:
For at installere det skal du åbne Arduino IDE, gå til Sketch Include Library > Add .ZIP Library, og vælg derefter RF24-master-filen, som du lige har downloadet. Hvis du har brug for flere oplysninger om installation af et bibliotek, kan du besøge denne vejledning i installation af et Arduino-bibliotek.
Arduino-kode – til sender
I vores eksperiment vil vi blot sende en traditionel ‘Hello World’-meddelelse fra senderen til modtageren.
Her er den skitse, vi vil bruge til vores sender:
//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);}
Skitsen starter med at inkludere bibliotekerne. SPI.h-biblioteket håndterer SPI-kommunikationen, mens nRF24L01.h og RF24.h styrer modulet.
//Include Libraries#include <SPI.h>#include <nRF24L01.h>#include <RF24.h>
Dernæst skal vi oprette et RF24-objekt. Objektet tager to pin-numre som parametre, som signalerne CE og CSN er forbundet med.
//create an RF24 objectRF24 radio(9, 8); // CE, CSN
Næst skal vi oprette et byte array, som skal repræsentere den pipe-adresse, hvorigennem to nRF24L01+ moduler kommunikerer.
//address through which two modules communicate.const byte address = "00001";
Vi kan ændre værdien af denne adresse til en hvilken som helst streng på 5 bogstaver, f.eks. “node1”. Adressen er nødvendig, hvis du har nogle få moduler i et netværk. Takket være adressen kan du vælge et bestemt modul, som du er interesseret i at kommunikere med, så i vores tilfælde vil vi have den samme adresse til både senderen og modtageren.
Næst i opsætningsfunktionen: Vi skal initialisere radio-objektet ved hjælp af radio.begin()
og ved hjælp af radio.openWritingPipe()
-funktionen indstiller vi adressen på senderen.
//set the addressradio.openWritingPipe(address);
Sidst skal vi bruge funktionen radio.stopListening()
, som indstiller modulet som sender.
//Set module as transmitterradio.stopListening();
I sløjfeafsnittet: Vi opretter et array af tegn, som vi tildeler meddelelsen “Hello World” til. Ved hjælp af radio.write()
-funktionen sender vi denne besked til modtageren. Det første argument her er den meddelelse, som vi ønsker at sende. Det andet argument er antallet af bytes, der er til stede i denne meddelelse.
const char text = "Hello World";radio.write(&text, sizeof(text));
Med denne metode kan du sende op til 32 bytes ad gangen. Fordi det er den maksimale størrelse af en enkelt pakke, som nRF24L01+ kan håndtere. Hvis du har brug for en bekræftelse på, at modtageren har modtaget data, returnerer metoden radio.write()
en bool
-værdi. Hvis den returnerer TRUE, er dataene nået frem til modtageren. Hvis den returnerer FALSE, er dataene gået tabt.
Funktionen radio.write() blokerer programmet, indtil den modtager bekræftelsen eller løber tør for alle forsøg på genudsendelse.
Arduino-kode – til modtager
Her er den skitse, vi skal bruge til vores modtager
//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); }}
Dette program ligner programmet for senderen ganske meget, bortset fra nogle ændringer.
I begyndelsen af opsætningsfunktionen starter vi den serielle kommunikation. Dernæst ved hjælp af radio.setReadingPipe()
-funktionen indstiller vi den samme adresse som senderen, og på den måde aktiverer vi kommunikationen mellem sender og modtager.
//set the address radio.openReadingPipe(0, address);
Det første argument er nummeret på strømmen. Du kan oprette op til 6 streams, der reagerer på forskellige adresser. Vi har kun oprettet adresse til stream nummer 0. Det andet argument er den adresse, som stream’en skal reagere på for at indsamle data.
Det næste trin er at indstille modulet som modtager og begynde at modtage data. For at gøre det bruger vi radio.startListening()
funktionen. Fra det øjeblik venter modemet på data, der sendes til den angivne adresse.
//Set module as receiver radio.startListening();
I loop-funktionen: Skitsen kontrollerer, om der er ankommet data til adressen ved hjælp af radio.available()
-metoden. Denne metode returnerer TRUE-værdien, hvis vi nogen data er tilgængelige i bufferen.
if (radio.available()) { char text = {0}; radio.read(&text, sizeof(text)); Serial.println(text); }
Hvis data er modtaget, opretter den et array på 32 tegn fyldt med nuller (senere vil programmet fylde det med de modtagne data). For at læse dataene bruger vi metoden radio.read (& text, sizeof (text))). Dette gemmer de modtagne data i vores karakterarray.
I slutningen udskriver vi bare den modtagne meddelelse på den serielle skærm. Hvis du gjorde alt ok, og der ikke er nogen fejl i forbindelserne, bør du se noget som dette i din seriel monitor.
Forbedring af rækkevidden af nRF24L01+ transceivermodul
En nøgleparameter for et trådløst kommunikationssystem er kommunikationsområdet. I mange tilfælde er det den afgørende faktor for valget af en RF-løsning. Så lad os diskutere, hvad vi kan gøre for at få en bedre rækkevidde for vores modul.
Reducer strømforsyningsstøj
Et RF-kredsløb, der genererer et radiofrekvens (RF)-signal, er meget følsomt over for strømforsyningsstøj. Hvis den ikke kontrolleres, kan strømforsyningsstøjen reducere den rækkevidde, du kan få, betydeligt.
Medmindre strømkilden er et selvstændigt batteri, er der en god chance for, at der er støj forbundet med genereringen af strømmen. For at forhindre, at denne støj kommer ind i systemet, anbefales det at placere en 10 µf-filterkondensator på tværs af strømforsyningsledningen så fysisk tæt på nRF24L01+-modulet som muligt.
En nemmeste måde at komme over med er at bruge et meget billigt adaptermodul til nRF24L01.
Adaptermodulet har et 8-pin hun-stik, så du kan tilslutte dit nRF24L01-modul. Det kan rumme begge de moduler, vi diskuterede tidligere, det ene med integreret antenne og det andet med ekstern antenne (PA/LNA). Det har også et 6-pin han-stik til SPI- og interrupt-forbindelser og et 2-pin-stik til strømindgang.
Adaptermodulet har sin egen 3,3 volts spændingsregulator og et sæt filterkondensatorer, så du kan forsyne det med en 5 volts strømforsyning.
Opnyt din kanalfrekvens
En anden potentiel kilde til støj for et RF-kredsløb er det ydre miljø, især hvis du har nabonetværk indstillet på samme kanal eller interferens fra anden elektronik.
For at forhindre, at disse signaler forårsager problemer, foreslår vi, at du bruger de højeste 25 kanaler dit nRF24L01+-modul. Årsagen til dette er, at WiFi bruger de fleste af de lavere kanaler.
Lavere datahastighed
Den nRF24L01+ tilbyder den højeste modtagerfølsomhed ved 250Kbps hastighed, som er -94dBm. Men ved en datahastighed på 2 MBps falder modtagerens følsomhed til -82 dBm. Hvis du taler dette sprog, ved du, at modtageren ved 250Kbps er næsten 10 gange mere følsom end ved 2Mbps. Det betyder, at modtageren kan afkode et signal, der er 10 gange så svagt.
Hvad betyder modtagerens (Rx) følsomhed?
Emfangsfølsomhed er det laveste effektniveau, ved hvilket modtageren kan registrere et RF-signal. Jo større den absolutte værdi af det negative tal er, jo bedre er modtagerens følsomhed. F.eks. er en modtagerfølsomhed på -94 dBm 12 dB bedre end en modtagerfølsomhed på -82 dBm.
Så en nedsættelse af datahastigheden kan forbedre den rækkevidde, du kan opnå, betydeligt. Desuden er en hastighed på 250 Kbps for de fleste af vores projekter mere end tilstrækkelig.
Højere udgangseffekt
Indstilling af den maksimale udgangseffekt kan også forbedre kommunikationsområdet. Med nRF24L01+ kan du vælge en af udgangseffekten, nemlig 0 dBm, -6 dBm, -12 dBm eller -18 dBm. Hvis du vælger 0 dBm udgangseffekt, sendes der et stærkere signal over luften.