AEQ-WEB

NRF24L01 PA LNA Arduino Uno
Arduino
07.07.2018

Switch language to: en Englisch

Arduino NRF24L01 Funkmodul

Zu diesem Artikel gibt es auch ein Video auf Youtube: Arduino NRF24L01+PA+LNA


NRF24L01 & Arduino

Das NRF24L01 Funkmodul ist eine Weiterentwicklung vom klassischen NRF24. Die neue Version wird auch gerne als nRF24L01+PA+LNA bezeichnet. Diese Version hat eine stärkere Endstufe und einen externen Antennenanschluss, wo Reichweiten von bis zu 1000 Metern möglich sein sollen. Das Modul wird mit in diesem Artikel mit einem Arduino Uno Board betrieben, wovon ein Modul der Sender und ein Modul der Empfänger ist. Da jedes Modul senden und empfangen kann, ist ein Datenaustausch in beide Richtungen möglich.


Arduino NRF20L01 Schaltplan nRF24L01+PA+LNA

Das Modul am Arduino

Das Modul verwendet die SPI-Schnittstelle für die Verbindung zum Arduino. Zusätzlich werden noch zwei weitere Pins (CSN & CE) benötigt. Das Modul benötigt keine zusätzliche Stromversorgung, jedoch muss es an den 3,3 Volt Pin angeschlossen werden. Das Modul darf nicht mit 5 Volt betrieben werden! Die Datenleitungen können ohne Spannungsreduzierung direkt an das Modul angeschlossen werden.


Software

Der Sender und der Empfänger haben jeweils eine eigene Software. Die Konfiguration und Pinbelegung ist jedoch an beiden Seiten gleich. Der Parameter, der übertragen wird, kann als String gesendet werden und wird auch auf der Empfängerseite als String ausgegeben. Mit einer entsprechenden Software Erweiterung kann der String geteilt werden, wodurch es leicht möglich ist, mit einer Sendung mehrere Parameter auszutauschen. Der Beispielcode ist sehr vereinfacht und zeigt hier die minimalen Einstellungen für einen Datenaustausch. Zusätzlich wird auch noch die NRF24 Library benötigt.


Code für den Sender

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>


const byte rxAddr[6] = "00001"; //TX adress (Same as on RX)
int counter = 0; //Count TX (Only for demo example)
RF24 radio(8, 9); //Define Radio (CE-PIN,CSN-PIN)

void setup() {
while (!Serial);
Serial.begin(9600);
radio.begin();

radio.setPALevel(RF24_PA_MAX); // Transmit Power (MAX,HIGH,LOW,MIN)
radio.setDataRate( RF24_250KBPS ); //Transmit Speeed (250 Kbits)
radio.setRetries(15, 15);
radio.openWritingPipe(rxAddr);

// Disable Receiver
radio.stopListening();
}

void loop() {
counter++;

String str = "Send Counter: ";
str += String(counter);

int str_len = str.length() + 1;
char char_array[str_len];
str.toCharArray(char_array, str_len);
radio.write(&char_array, sizeof(char_array));

Serial.print("Actual Transmission: ");
Serial.println( char_array );
delay(250);
}


Code für den Empfänger

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

RF24 radio(8, 9); //Define radio (CE-PIN,CSN-PIN)
const byte rxAddr[6] = "00001"; //RX adress (Same as on TX)
String received_data;

void setup()
{
// Start the serial
Serial.begin(9600);
Serial.println("NRF24 Receiver");
radio.begin();
radio.setPALevel(RF24_PA_LOW); // Transmit Power (MAX,HIGH,LOW,MIN)
radio.setDataRate( RF24_250KBPS ); //Transmit Speeed (250 Kbits)
radio.openReadingPipe(0, rxAddr);
radio.startListening();

}

void loop()
{
if (radio.available())
{
char text[100] = {0}; //Buffer
radio.read(&text, sizeof(text));
received_data = String(text);
Serial.println(received_data);
delay(20);
}
}


Reichweite

Da die Module sehr leistungsstrak sind, soll eine Datenübertragung von mehreren Hundert Metern möglich sein. Dazu werden wir mit den Modulen noch einen Reichweitentest machen. In unseren ersten Test haben wir eine saubere Datenübertragung auf einer Entfernung von 130 Metern (freie Sicht) bereits geschafft.



Von Alex @ AEQ-WEB 213