NRF24L01+ 2.4GHz Wireless Transceiver

July 20, 2014 00:00   guider, elektronik
Snabbguide hur man sätter upp ett trådlöst nätverk med hjälp av Arduino´s samt NRF24L01.

Att kunna ha två eller flera Arduinos som kommunicera med varandra trådlöst över ett ganska långt avstånd öppnar många möjligheter.

Bakgrunds information

Frekvensen ligger på det olicensierade bandet 2,4 GHz som många WiFi-routrar och trådlösa telefoner använder. Radiomoduler är baserade på Nordic Semiconductor NRF24L01 + chipet dessa kan både skicka och ta emot data i "paket" av flera byte i taget i hastigheter upp mot 1 Mbps. Det finns inbyggd felkorrigering och omsändning, och det är möjligt att för en enhet kommunicera med upp till 6 andra liknande enheter samtidigt. Med en relativt låg effekt klarar en räckvidd på ca 100-200 meter vid fri sikt, med hjälp av extern antenn kan man nå sträckor på upp till 1000meter. Transceiver är finns tillgänglig med inbyggd antenn för under $ 3.

VIKTIGT

Matningen är 1,9 - 3.6 Volt och inte den "vanliga" Arduinio 5 volt spänning som man är van vid, kommunikationen går dock att köra via 5V så inga konvertering eller mellan kretsar behövs. Enligt många sidor på internet så är det vanligaste felet att 3.3V matningen inte är stabil nog, enklaste lösningen är att sätta en kondesator på 10uF över matningen till sändaren.

 

 

 

Tabell för I/O´s för olika bilbliotek som finns att hitta på nätet.

Eftersom det går åt ett ganska stort antal digitala pinnar lämpar denna sig snarare för en MEGA än en Uno men det beror ju helt på användnings området. 

 

 

Mjukvara

Jag använder ett bibliotek från Maniac vilket verkar vara stabilt.

I setup skapas en "radio" class som sedan anropas vid sändning, precis som vanliga Serial.println()

På mottagar sidan görs samma setup men med tilllägget startListening().

/*-----( Import needed libraries )-----*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
/*-----( Declare Constants and Pin Numbers )-----*/ #define CE_PIN 9 #define CSN_PIN 10 #define PIN_1 A0 #define PIN_2 A1
// NOTE: the "LL" at the end of the constant is "LongLong" type const uint64_t pipe = 0xE8E8F0F0E1LL; // Define the transmit pipe /*-----( Declare objects )-----*/ RF24 radio(CE_PIN, CSN_PIN); // Create a Radio
/*-----( Declare Variables )-----*/ int value[2]; // 2 element array holding Joystick readings void setup()
{ radio.begin(); radio.openWritingPipe(pipe); } void loop() { value[0] = analogRead(PIN_1); value[1] = analogRead(PIN_2); radio.write( value, sizeof(value) ); }

I loop väntar man på inkommande samt att hela paketet är mottaget.

/*-----( Import needed libraries )-----*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
/*-----( Declare Constants and Pin Numbers )-----*/ #define CE_PIN 9 #define CSN_PIN 10 // NOTE: the "LL" at the end of the constant is "LongLong" type const uint64_t pipe = 0xE8E8F0F0E1LL; // Define the transmit pipe /*-----( Declare objects )-----*/ RF24 radio(CE_PIN, CSN_PIN); // Create a Radio
/*-----( Declare Variables )-----*/ int value[2]; // 2 element array holding analog readings void setup() { radio.begin(); radio.openReadingPipe(1,pipe); radio.startListening();; } void loop() { if ( radio.available() ){ // Read the data payload until we've received everything bool done = false;
while (!done){ // Fetch the data payload done = radio.read( value, sizeof(value) );
} } }