Att ha två eller flera Arduino-kort som kan kommunicera med varandra trådlöst på distans öppnar upp för många möjligheter, t.ex. fjärrövervakning av sensordata, styrning av robotar, hemautomatisering och listan kan göras lång. Och när det gäller att ha billiga men tillförlitliga 2-vägs RF-lösningar är det ingen som gör ett bättre jobb än nRF24L01+ transceivermodulen från Nordic Semiconductor.

nRF24L01+ (plus) transceivermodulen kan ofta fås på nätet för mindre än två dollar, vilket gör den till ett av de billigaste datakommunikationsalternativen som du kan få. Och det bästa av allt är att dessa moduler är superlilla, vilket gör att du kan införliva ett trådlöst gränssnitt i nästan vilket projekt som helst.

Hårdvaruöversikt

Radiofrekvens

Transceivermodulen nRF24L01+ är utformad för att fungera i det världsomspännande ISM-frekvensbandet på 2,4 GHz och använder GFSK-modulering för dataöverföring. Dataöverföringshastigheten kan vara en av 250 kbps, 1 Mbps och 2 Mbps.

Vad är 2,4 GHz ISM-bandet?

2,4 GHz-bandet är ett av de industriella, vetenskapliga och medicinska (ISM) banden som är internationellt reserverade för användning av olicensierade enheter med låg effekt. Exempel är Sladdlösa telefoner, Bluetooth-enheter, NFC-enheter (Near Field Communication) och trådlösa datornätverk (WiFi) använder alla ISM-frekvenserna.

Effektförbrukning

Driftsspänningen för modulen är från 1,9 till 3.6V, men den goda nyheten är att logikstiften är 5-voltstoleranta, så vi kan enkelt ansluta den till en Arduino eller någon 5V logisk mikrokontroller utan att använda någon logiknivåomvandlare.

Modulen har stöd för programmerbar utgångseffekt, dvs. 0 dBm, -6 dBm, -12 dBm eller -18 dBm, och förbrukar otroligt nog omkring 12 mA under sändning vid 0 dBm, vilket till och med är lägre än en enda lysdiod. Och det bästa av allt är att den förbrukar 26 µA i standby-läge och 900 nA i avstängningsläge. Det är därför de är den bästa trådlösa enheten för applikationer med låg effekt.

SPI-gränssnitt

Transceivermodulen nRF24L01+ kommunicerar via ett 4-stifts Serial Peripheral Interface (SPI) med en maximal datahastighet på 10 Mbps. Alla parametrar såsom frekvenskanal (125 valbara kanaler), utgångseffekt (0 dBm, -6 dBm, -12 dBm eller -18 dBm) och datahastighet (250kbps, 1Mbps eller 2Mbps) kan konfigureras via SPI-gränssnittet.

SPI-bussen använder sig av begreppet Master och Slave, i de vanligaste tillämpningarna är vår Arduino Master och transceivermodulen nRF24L01+ är Slave. Till skillnad från I2C-bussen är antalet slavar på SPI-bussen begränsat, på Arduino Uno kan du använda högst två SPI-slavar, dvs. två nRF24L01+ transceivermoduler.

Här finns fullständiga specifikationer:

Frekvensområde 2.4 GHz ISM-bandet
Max. luftdatahastighet 2 Mb/s
Modulationsformat GFSK
Max. Utgångseffekt 0 dBm
Befattningsspänning 1,9 V till 3,6 V
Max. Driftström 13.5mA
Min. Ström (standby-läge) 26µA
Logiska ingångar 5V toleranta
Kommunikationsområde 800+ m (linje of sight)

nRF24L01+-modul Vs nRF24L01+ PA/LNA-modul

Det finns en mängd olika moduler tillgängliga baserade på nRF24L01+-chipet. Nedan följer de mest populära versionerna.

nRF24L01+ trådlös modul

Den första versionen använder inbyggd antenn. Detta möjliggör en mer kompakt version av breakouten. Den mindre antennen innebär dock också en lägre överföringsräckvidd. Med den här versionen kan du kommunicera över ett avstånd på 100 meter. Det är naturligtvis utomhus i ett öppet utrymme. Din räckvidd inomhus, särskilt genom väggar, kommer att försvagas något.

nRF24L01+ PA LNA Wireless Transceiver Module with External Antenna

Den andra versionen kommer med en SMA-anslutning och en anka-antenn men det är inte den verkliga skillnaden. Den verkliga skillnaden är att den kommer med ett speciellt RFX2401C-chip som integrerar PA-, LNA- och sändar-mottagningsomkopplingskretsen. Detta chip för förlängning av räckvidden tillsammans med en ankantenn hjälper modulen att uppnå en betydligt större sändningsräckvidd på cirka 1000 meter.

Vad är PA LNA?

Pa står för Power Amplifier (effektförstärkare). Den förstärker bara effekten av signalen som sänds från nRF24L01+-chipet. Medan LNA står för Low-Noise Amplifier (lågbrusförstärkare). LNA:s funktion är att ta

nRF24L01+ PA/LNA Blockdiagram

extremt svag och osäker signal från antennen (vanligen i storleksordningen mikrovolt eller under -100 dBm) och förstärka den till en mer användbar nivå (vanligen omkring 0.5 till 1 V)

Mottagningsvägens lågbrusförstärkare (LNA) och sändningsvägens effektförstärkare (PA) ansluts till antennen via en duplexer, som separerar de två signalerna och förhindrar att den relativt kraftfulla PA-utgången överbelastar den känsliga LNA-ingången. För mer information se denna artikel på digikey.com

Med undantag för denna skillnad är båda modulerna drop-in-kompatibla. Det innebär att om du bygger ditt projekt med en kan du bara dra ur den och använda en annan utan att behöva göra några ändringar i systemet.

Hur fungerar transceivermodulen nRF24L01+?

RF-kanalfrekvens

Transceivermodulen nRF24L01+ sänder och tar emot data på en viss frekvens som kallas kanal. För att två eller flera transceivermoduler ska kunna kommunicera med varandra måste de också befinna sig på samma kanal. Denna kanal kan vara vilken frekvens som helst i ISM-bandet 2,4 GHz eller närmare bestämt mellan 2,400 och 2,525 GHz (2400 och 2525 MHz).

Varje kanal upptar en bandbredd på mindre än 1 MHz. Detta ger oss 125 möjliga kanaler med 1 MHz mellanrum. Modulen kan alltså använda 125 olika kanaler, vilket ger möjlighet att ha ett nätverk med 125 oberoende fungerande modem på ett och samma ställe.

Kanalen upptar en bandbredd på mindre än 1MHz vid 250kbps och 1Mbps datahastighet i luften. Vid 2 Mbps datahastighet upptas dock 2 MHz bandbredd (bredare än upplösningen för inställningen av RF-kanalfrekvensen). För att säkerställa att kanalerna inte överlappar varandra och för att minska överhörningen i 2 Mbps-läget måste du hålla ett avstånd på 2 MHz mellan två kanaler.

RF-kanalfrekvensen för den valda kanalen ställs in enligt följande formel:

Freq(Selected) = 2400 + CH(Selected)

Till exempel, om du väljer 108 som kanal för dataöverföring är RF-kanalfrekvensen för din kanal 2508MHz (2400 + 108)

nRF24L01+ Multiceiver-nätverk

Den nRF24L01+ har en funktion som kallas Multiceiver. Det är en förkortning för Multiple Transmitters Single Receiver. Där varje RF-kanal är logiskt uppdelad i 6 parallella datakanaler som kallas Data Pipes. Med andra ord är ett datapipe en logisk kanal i den fysiska RF-kanalen. Varje datarör har sin egen fysiska adress (Data Pipe Address) och kan konfigureras. Detta kan illustreras enligt nedan.

nRF24L01+ Multiceiver Network – Multiple Transmitters Single Receiver

För att förenkla diagrammet ovan, föreställ dig att den primära mottagaren agerar som en navmottagare som samlar in information från 6 olika sändarnoder samtidigt. Navmottagaren kan när som helst sluta lyssna och fungerar som en sändare. Men detta kan bara göras ett rör/nod åt gången.

Enhanced ShockBurst Protocol

Transceivermodulen nRF24L01+ använder en paketstruktur som kallas Enhanced ShockBurst. Denna enkla paketstruktur är uppdelad i 5 olika fält, vilket illustreras nedan.

nRF24L01+ Förbättrad ShockBurst-paketstruktur

Den ursprungliga ShockBurst-strukturen bestod endast av fälten Preamble (preambel), Address (adress), Payload (nyttolast) och Cyclic Redundancy Check (CRC). Förbättrad ShockBurst medförde större funktionalitet för mer förbättrad kommunikation med hjälp av ett nyinfört Packet Control Field (PCF).

Denna nya struktur är utmärkt av flera skäl. För det första möjliggör den nyttolaster av varierande längd med en specificerare för nyttolastlängd, vilket innebär att nyttolasten kan variera från 1 till 32 byte.

För det andra förser den varje skickat paket med ett paket-ID, vilket gör det möjligt för den mottagande enheten att avgöra om ett meddelande är nytt eller om det har sänts om (och därmed kan ignoreras).

För det sista, och viktigast av allt, kan varje meddelande begära att en bekräftelse skickas när det tas emot av en annan enhet.

nRF24L01+ Automatisk pakethantering

Nu ska vi diskutera tre scenarier för att få en bättre förståelse för hur två nRF24L01+-moduler transagerar med varandra.

Transaktion med bekräftelse och avbrottDetta är ett exempel på ett positivt scenario. Här startar sändaren en kommunikation genom att skicka ett datapaket till mottagaren. När hela paketet har överförts väntar den (cirka 130 µs) på att ta emot bekräftelsepaketet (ACK-paketet). När mottagaren tar emot paketet skickar den ACK-paketet till sändaren. Vid mottagandet av ACK-paketet aktiverar sändaren signalen för avbrott (IRQ) för att indikera att nya data är tillgängliga.

Transaktion med datapaket som gått förloratDetta är ett negativt scenario där en återutsändning behövs på grund av att det överförda paketet går förlorat. Efter att paketet har överförts väntar sändaren på att ACK-paketet ska tas emot. Om sändaren inte får det inom ARD-tiden (Auto-Retransmit-Delay) återutsänds paketet. När det återutsända paketet tas emot av mottagaren sänds ACK-paketet, vilket i sin tur genererar ett avbrott hos sändaren.

Transaktion med förlorad bekräftelseDetta är återigen ett negativt scenario där en återutsändning behövs på grund av att ACK-paketet går förlorat. Även om mottagaren tar emot paketet i första försöket tror sändaren att mottagaren inte har fått paketet alls på grund av förlusten av ACK-paketet. Efter att tiden för automatisk återutsändningsfördröjning har löpt ut återutsänder sändaren paketet. När mottagaren nu tar emot paketet som innehåller samma paket-ID som tidigare, förkastar den det och skickar ACK-paketet igen.

Hela denna pakethantering görs automatiskt av nRF24L01+-chippet utan inblandning av mikrokontrollern.

nRF24L01+ Transceiver Module Pinout

Låt oss ta en titt på pinout för båda versionerna av nRF24L01+ transceiver Module.

GND är Ground Pin. Den markeras vanligen genom att stiftets stift omsluts av en fyrkant så att det kan användas som en referens för att identifiera de andra stiften.

VCC levererar ström till modulen. Detta kan vara någonstans mellan 1,9 och 3,9 volt. Du kan ansluta den till 3,3 V-utgången från din Arduino. Kom ihåg att om du ansluter den till 5V-stiftet kommer du sannolikt att förstöra din nRF24L01+-modul!

CE (Chip Enable) är ett aktivt högt stift. När den väljs kommer nRF24L01 att antingen sända eller ta emot, beroende på vilket läge den för närvarande befinner sig i.

CSN (Chip Select Not) är en aktiv-LOW-stift och hålls normalt på HIGH. När denna stift går på låg nivå börjar nRF24L01 lyssna på sin SPI-port för data och bearbetar dem i enlighet med detta.

SCK (Serial Clock) accepterar klockpulser som tillhandahålls av SPI-bussens Master.

MOSI (Master Out Slave In) är SPI-ingång till nRF24L01.

MISO (Master In Slave Out) är SPI-utgång från nRF24L01.

IRQ är en avbrottsstift som kan varna mastern när nya data är tillgängliga att bearbeta.

Koppling – Anslutning av nRF24L01+ transceivermodul till Arduino UNO

När vi nu har en fullständig förståelse för hur nRF24L01+ transceivermodulen fungerar kan vi börja koppla den till vår Arduino!

För att börja med ansluter du VCC-stiftet på modulen till 3,3 V på Arduino och GND-stiftet till jord. Stiften CSN och CE kan anslutas till vilken digital stift som helst på Arduino. I vårt fall är de anslutna till digital stift nr 8 respektive 9. Nu återstår de stift som används för SPI-kommunikation.

Då nRF24L01+ transceivermodulen kräver mycket dataöverföring kommer de att ge bäst prestanda när de är anslutna till hårdvarans SPI-stift på en mikrokontroller. SPI-stiften är mycket snabbare än att ”bittra” gränssnittskoden med hjälp av en annan uppsättning stift.

Observera att varje Arduinokort har olika SPI-stift som bör anslutas i enlighet med detta. För Arduino-kort som UNO/Nano V3.0 är dessa stift digitala 13 (SCK), 12 (MISO) och 11 (MOSI).

Om du har en Mega är stiften annorlunda! Du vill använda digitala 50 (MISO), 51 (MOSI), 52 (SCK) och 53 (SS). Se nedanstående tabell för snabb förståelse.

MOSI MISO SCK
Arduino Uno 11 12 13
Arduino Nano 11 12 13
Arduino Mega 51 50 52

Infall du använder ett annat Arduinokort än det som nämns ovan, är det lämpligt att kontrollera den officiella dokumentationen för Arduino innan du fortsätter.

Koppling av nRF24L01+ trådlös transceivermodul till Arduino UNO
Koppling av nRF24L01+ PA LNA trådlös modul till Arduino UNO

Håll dig till godo! Du måste göra två av dessa kretsar. Den ena fungerar som sändare och den andra som mottagare. Ledningarna för båda är identiska.

När du har allting kopplat ihop är du redo att sätta igång!

RF24 Arduino Library for nRF24L01+ Module

Interfacing with nRF24L01+ transceiver module is a bunch of work, but luckily for us, there are a number of libraries available. Ett av de populära biblioteken är RF24. Detta bibliotek har funnits i flera år. Det är enkelt att använda för nybörjare, men erbjuder ändå mycket för avancerade användare. I våra experiment kommer vi att använda samma bibliotek.

Du kan ladda ner den senaste versionen av biblioteket på RF24 GitHub repository fork eller, klicka bara på den här knappen för att ladda ner zip-filen:

För att installera den öppnar du Arduino IDE, går till Sketch > Include Library > Add .ZIP Library och väljer sedan RF24-master-filen som du just laddat ner. Om du behöver mer information om hur du installerar ett bibliotek kan du gå till den här handledningen Installera ett Arduino-bibliotek.

Arduino-kod – för sändare

I vårt experiment kommer vi bara att skicka ett traditionellt ”Hello World”-meddelande från sändaren till mottagaren.

Här är skissen som vi kommer att använda för vår sändare:

//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);}

Skissen börjar med att inkludera biblioteken. Biblioteket SPI.h hanterar SPI-kommunikationen medan nRF24L01.h och RF24.h styr modulen.

//Include Libraries#include <SPI.h>#include <nRF24L01.h>#include <RF24.h>

Nästan måste vi skapa ett RF24-objekt. Objektet tar två stiftnummer som parametrar till vilka signalerna CE och CSN är anslutna.

//create an RF24 objectRF24 radio(9, 8); // CE, CSN

Nästan måste vi skapa en byte array som kommer att representera den pipe-adress genom vilken två nRF24L01+ moduler kommunicerar.

//address through which two modules communicate.const byte address = "00001";

Vi kan ändra värdet på denna adress till en valfri sträng med fem bokstäver, till exempel ”node1”. Adressen är nödvändig om du har några få moduler i ett nätverk. Tack vare adressen kan du välja en viss modul som du är intresserad av att kommunicera med, så i vårt fall kommer vi att ha samma adress för både sändaren och mottagaren.

Nästan i inställningsfunktionen: vi måste initialisera radioobjektet med hjälp av radio.begin() och med hjälp av radio.openWritingPipe()-funktionen ställer vi in sändarens adress.

//set the addressradio.openWritingPipe(address);

Slutligt kommer vi att använda funktionen radio.stopListening() som ställer in modulen som sändare.

//Set module as transmitterradio.stopListening();

I slingaavsnittet: Vi skapar en array av tecken till vilken vi tilldelar meddelandet ”Hello World”. Med hjälp av funktionen radio.write() skickar vi detta meddelande till mottagaren. Det första argumentet här är det meddelande som vi vill skicka. Det andra argumentet är antalet bytes som finns i det meddelandet.

const char text = "Hello World";radio.write(&text, sizeof(text));

Med den här metoden kan man skicka upp till 32 bytes åt gången. Eftersom det är den maximala storleken på ett enskilt paket kan nRF24L01+ hantera. Om du behöver en bekräftelse på att mottagaren har tagit emot data returnerar metoden radio.write() ett bool-värde. Om den returnerar TRUE har data nått mottagaren. Om den returnerar FALSE har data gått förlorade.

Funktionen radio.write() blockerar programmet tills den tar emot bekräftelsen eller tar slut på alla försök till återutsändning.

Arduino-kod – för mottagare

Här är skissen som vi kommer att använda för vår mottagare

//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); }}

Det här programmet ser ganska likt ut som programmet för sändaren förutom några förändringar.

I början av setup-funktionen startar vi den seriella kommunikationen. Därefter använder vi radio.setReadingPipe()-funktionen för att ställa in samma adress som sändaren och på så sätt aktiverar vi kommunikationen mellan sändare och mottagare.

 //set the address radio.openReadingPipe(0, address);

Det första argumentet är numret på strömmen. Du kan skapa upp till 6 strömmar som svarar på olika adresser. Vi skapade endast adress för stream nummer 0. Det andra argumentet är den adress som strömmen kommer att reagera på för att samla in data.

Nästa steg är att ställa in modulen som en mottagare och börja ta emot data. För att göra det använder vi funktionen radio.startListening(). Från det ögonblicket väntar modemet på data som skickas till den angivna adressen.

//Set module as receiver radio.startListening();

I loop-funktionen: Skissen kontrollerar om några data har anlänt till adressen med hjälp av radio.available()-metoden. Denna metod returnerar värdet TRUE om det finns data i bufferten.

if (radio.available()) { char text = {0}; radio.read(&text, sizeof(text)); Serial.println(text); }

Om data tas emot skapas en array med 32 tecken fylld med nollor (senare kommer programmet att fylla den med den mottagna datan). För att läsa data använder vi metoden radio.read (& text, sizeof (text)). Detta kommer att lagra de mottagna uppgifterna i vår teckenarray.

I slutet skriver vi bara ut det mottagna meddelandet på den seriella monitorn. Om du gjorde allt ok och det inte finns några fel i anslutningarna bör du se något liknande i din seriella monitor.

nRF24L01+ transceiverutgång på seriella monitorn

Förbättra räckvidden för nRF24L01+ transceivermodul

En nyckelparameter för ett trådlöst kommunikationssystem är kommunikationsräckvidden. I många fall är det den avgörande faktorn för valet av en RF-lösning. Så låt oss diskutera vad vi kan göra för att få en bättre räckvidd för vår modul.

Reducera strömförsörjningsbrus

En RF-krets som genererar en radiofrekvenssignal (RF-signal) är mycket känslig för strömförsörjningsbrus. Om det inte kontrolleras kan bruset från strömförsörjningen avsevärt minska den räckvidd du kan få.

Om inte strömkällan är ett fristående batteri finns det en god chans att det finns brus i samband med genereringen av strömmen. För att förhindra att detta brus kommer in i systemet rekommenderas det att placera en 10 µf filterkondensator över strömförsörjningsledningen så fysiskt nära nRF24L01+-modulen som möjligt.

Ett enkelt sätt att komma över detta är att använda en mycket billig adaptermodul för nRF24L01.

nRF24L01+ Adapter

Adaptermodulen har en 8-polig kvinnlig kontakt för att du ska kunna koppla in din nRF24L01-modul. Den kan rymma både den modul vi diskuterade tidigare, den ena med integrerad antenn och den andra med extern antenn (PA/LNA). Den har också en 6-polig manlig kontakt för SPI- och avbrottsanslutningar och en 2-polig kontakt för strömförsörjning.

Adaptermodulen har en egen spänningsregulator på 3,3 volt och en uppsättning filterkondensatorer, så att du kan försörja den med ett 5-volts nätaggregat.

Byt kanalfrekvens

En annan potentiell källa till brus för en RF-krets är den yttre miljön, särskilt om du har grannnätverk som är inställda på samma kanal eller störningar från annan elektronik.

För att förhindra att dessa signaler orsakar problem föreslår vi att du använder de högsta 25 kanalerna din nRF24L01+-modul. Anledningen till detta är att WiFi använder de flesta av de lägre kanalerna.

Lägre datahastighet

Den nRF24L01+ erbjuder högsta mottagarkänslighet vid 250Kbps hastighet vilket är -94dBm. Vid en datahastighet på 2 MBps sjunker mottagarkänsligheten dock till -82dBm. Om du talar det här språket vet du att mottagaren vid 250 Kbps är nästan 10 gånger känsligare än vid 2 Mbps. Det betyder att mottagaren kan avkoda en signal som är 10 gånger svagare.

Vad betyder mottagarens (Rx) känslighet?

Mottagarens känslighet är den lägsta effektnivå vid vilken mottagaren kan upptäcka en RF-signal. Ju större absolut värde på det negativa talet, desto bättre mottagarkänslighet. Till exempel är en mottagarkänslighet på -94 dBm bättre än en mottagarkänslighet på -82 dBm med 12 dB.

Så, en sänkning av datahastigheten kan avsevärt förbättra den räckvidd du kan uppnå. För de flesta av våra projekt är dessutom 250 Kbps hastighet mer än tillräckligt.

Högre utgångseffekt

Inställning av maximal utgångseffekt kan också förbättra kommunikationsräckvidden. Med nRF24L01+ kan du välja en av utgångseffekterna 0 dBm, -6 dBm, -12 dBm eller -18 dBm. Om du väljer 0 dBm utgångseffekt skickas en starkare signal över luften.

Lämna ett svar

Din e-postadress kommer inte publiceras.