Zur Startseite

2,4 GHz (ISM-Band) 10-Kanal Anlage
mit nRF24L01-Modulen

Nachdem ich für meine RC-Modelle in den letzten Jahren eine kommerzielle 40 MHZ MX16s von Graupner genutzt habe, wollte ich Anfang 2021 doch noch einmal einen echten Eigenbau versuchen. Im Netz gab es verschiedene Bauberichte über Anlagen mit nRF24L01 Modulen. Sowas sollte es also werden!


Die NRF-Module arbeiten im 2,4 GHz ISM-Band. Jedes Modul kann sowohl Sender als auch Empfänger sein. Sie lassen sich komplett über Software steuern. Ein Arduino ist perfekt geeignet dafür.

Das Bild zeigt die beiden aktuell verfügbaren Typen. Links das nRF24L01+ Modul mit der PCB-Antenne verfügt über maximal 0 dBM (1 mW) Ausgangspower. Die Ausgangsleistung kann in den Stufen 0, -6, -12 und -18 dBm eingestellt werden.
Die Empfindlichkeit des Empfängers liegt abhängig von der Datenrate zwischen -82 dBm (2 Mbps) und -94 dBm (250 Kbps).
Mit zwei solcher Module als Sender-Empfänger lässt sich eine Anlage für Haus-Reichweiten realisieren.

Rechts ist das Stärkere nRF24L01-PA Modul mit der externen Antenne abgebildet. Dieses Modul enthält zusätzlich zum normalen nRF24L01 Schaltkreis noch den RFX2401C. Der letztere erhöht die Ausgangsleistung auf maximale 20 dBm (100 mW). Damit sollten Reichweiten bis zu 1000 m im Freifeld möglich sein.

Beide Module sind pinkompatibel und arbeiten ausschließlich mit 3,3 V VCC. Betrieb mit 5 V tötet so ein Modul u. U. sofort! Im Netz werden zwar diverse Schaltungen propagiert, die den 3,3 V Ausgang des Arduino für den Betrieb der nRFs nutzen. Das empfiehlt sich aber höchstens für das schwächere nRF24L01+ Modul.

Das stärkere PA-Modul kann in Maximal-Settings deutlich über 100 mA ziehen, wie dieses Diagramm aus dem Datenblatt zeigt. Das kann der 3,3 V ausgang des Arduino nicht leisten. Maximal zulässige Last am 3,3 V Pin des Nano ist 50 mA. Man braucht also dafür einen separaten 3,3 V-Regler. Ein Blockkondensator, dicht am 3,3 V-Pin des nRF wird dringend empfohlen.

Wichtiger Hinweis:
Mein erster Versuch mit zwei "normalen" nRF24L01+ funktionierte sehr gut. Als ich aber auf der Senderseite den stärkeren PA-Typ nutzen wollte, ging nichts mehr! Insgesamt drei verschiedene PA-Module brachten alle kein Ergebnis. Schließlich fand ich im Netz den Hinweis, dass im Nahfeld die Sendeleistung des PA-Typs reduziert werden muß. Nachdem -18 dBm eingestellt waren (rot im Code unten), liefen alle Module perfekt.

Für diese ersten Versuche habe ich den folgenden Aufbau genutzt:

Das Schema zeigt die Sender-Seite. Genutzt wird das "schwächere" Modul, daher die Speisung aus dem 3,3 V Pin vom Arduino. Am A0 hängt das Poti dessen Wert zum Empfänger übertragen wird.

Die Empfänger-Seite sieht genauso aus, nur fehlt das Poti am A0. Dafür hängt der Arduino permanent über USB am Terminal und gibt dort den empfangenen Poti-Wert aus.

Test-Sender Code:

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

const uint64_t my_radio_pipe = 0xE8E8F0F0E1LL;
RF24 radio(9, 10);

struct Data_to_be_sent {
byte ch1;
};

Data_to_be_sent sent_data;

void setup()
{
radio.begin();
radio.setPALevel(RF24_PA_MIN); // nötig für PA-Typ
radio.setAutoAck(false);
radio.setDataRate(RF24_250KBPS);
radio.openWritingPipe(my_radio_pipe);
sent_data.ch1 = 127;
}

void loop()
{
sent_data.ch1 = map( analogRead(A0), 0, 1024, 0, 255);
radio.write(&sent_data, sizeof(Data_to_be_sent));
}

Test-Empfänger Code:

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

const uint64_t pipeIn = 0xE8E8F0F0E1LL;
RF24 radio(9, 10);

struct Received_data {
byte ch1;
};

int ch1_value = 0;
Received_data received_data;

void setup()
{
Serial.begin(9600);
received_data.ch1 = 127;
radio.begin();
radio.setAutoAck(false);
radio.setDataRate(RF24_250KBPS);
radio.openReadingPipe(1,pipeIn);
radio.startListening();
}

unsigned long last_Time = 0;
void receive_the_data()
{
while ( radio.available() ) {
radio.read(&received_data, sizeof(Received_data));
last_Time = millis();
}
}

void loop()
{
receive_the_data();
ch1_value = map(received_data.ch1,0,255,1000,2000);
Serial.println(ch1_value);
delay(500);
}

Im Terminal der Arduino IDE werden nun hoffentlich die Potiwerte im Bereich von 0 bis 255 abhängig von der Schleiferstellung ausgegeben.


Genug getestet! Jetzt kommen wir zur neuen 10-Kanal Fernsteuerung.

Die Senderschaltung:

Ein Klick auf die Eagle-Grafik vergrößert sie in einem neuen Browserfenster. Die Kanäle 1-4 liegen auf den X/Y-Achsen der beiden Joysticks. Kanal 5-6 sind die zwei Potis, 7-8 liegen auf zwei Kippschaltern und 9-10 sind auf Drucktaster gelegt.

Die Schaltung bindet über I²C einen MPU6050 an den Arduino. Dieser Beschleunigungssensor/Gyroskop soll in einer späteren Version der Software wahlweise zur Steuerung benutzt werden. In der im Folgenden vorgestellten aktuellen SW-Version wird er noch nicht berücksichtigt.

Die Stromversorgung ist etwas ungewöhnlich. Ich wollte mit nur zwei AA-Zellen, also 3V auskommen. Das geht mit dem gewählten DC-DC Booster, der ab etwa 1,5V Eingang bereits 5V am Ausgang bereitstellt. Dadurch ist sogar Betrieb mit 2 NiMh Zellen (2,4 V) möglich. Über C1 und C2 wurde jeweils nachträglich noch ein 100 nF SMD-Kondensator geschaltet (fehlt in Schaltbild und Fotos).
Bei Betrieb mit exakt 3,0 V ist die Stromaufnahme 160 mA. Bei sinkender Eingangsspannung steigt der Strom. Er beträgt bei 2,4 V etwa 200 mA.

Auf zwei Stiftleisten werden für künftige Erweiterungen die ungenutzten Arduino-Pins D6-8 sowie Masse, +3,3V, +5V und die I²C Datenleitungen herausgeführt.

Das Bild oben zeigt die Hauptbauteile des Senders. Der dritte Kippschalter wird als EIN/AUS Hauptschalter genutzt.

Die 2-lagige Leiterplatte ist in Eagle entstanden und hat die Abmaße 150 mm x 90 mm. (Die Massefläche ist in dieser Ansicht ausgeblendet)

Nach Erstellung der Gerber-Dateien kann man sich die künftige Platte in einem Gerber-Viewer ansehen.


Die Empfängerschaltung:

Der Empfänger ist sehr simpel und eigentlich wäre es sogar noch einfacher gegangen. Die externe 3.3 V Quelle könnte bei Beschränkung auf das nRF24L01+ Modul entfallen. Es würde dann aus dem Nano versorgt. Auch die LED an A3 ist nicht unbedingt nötig aber nützlich, weil sie eine bestehende Verbindung zum Sender anzeigt. Über C1 und C2 wurde jeweils nachträglich noch ein 100 nF SMD-Kondensator geschaltet (fehlt in Schaltbild und Fotos).

Hier die Einzelteile des Empfängers. Erst vor Kurzem habe ich entdeckt, daß es Stiftleisten in verschiedenen Farben gibt. Das bietet sich hier natürlich an, weil man die Servoanschlüsse (Plus/Minus/Signal) damit klar identifizieren kann.

Auch diese Platte ist zweilagig. Die Maße sind 55 mm x 35 mm. (Die Masseflächen sind auch hier wieder ausgeblendet)

Auch hier gibt es wieder einen Blick auf das Design der Platte aus dem Gerber-Viewer.


Die Platinen sind von JLC-PCB in China und ich hatte gehofft, daß ich nicht ewig auf die Lieferung warten muß.

Sie kamen schließlich aus Hongkong. Am 27. Januar bestellt, wurden sie am 04. Februar per Kurier an meiner Haustür geliefert. Die Mindestbestellmenge war 5 Stk. Ich habe also 5 Sender und 10 Empfänger bestellt. Der Gesamtpreis einschließlich Lieferung betrug unglaubliche 25,60 €. Wobei mehr als die Hälfte davon für den Versand berechnet war.

Der Empfänger ist als erster fertig bestückt. In diesem Fall mit dem kleinen nRF24L01+ Modul, daß auf der Unterseite der Platine sitzt.

Hier nun auch die bestückte Senderplatine, diesmal mit nRF24L01 PA. Alles passte perfekt. Nur der Eagle-Footprint für die Mini-Joysticks ist minimal in der Y-Achse daneben. Das muß ich beim Gehäusedesign beachten, weil der Mittelpunkt der Bedienknöpfe jeweils um ca 2 mm nach unten verschoben ist.


Das Gehäuse des Senders entstand im 3D-Drucker und das Design dazu in Fusion 360. Die animierte GIF hier unten zeigt das Ganze im Schnelldurchlauf.

Das Gehäuseoberteil von innen zeigt die Anordnung der Bedienteilen. Keine davon sind direkt im Gehäuse befestigt. Nur die Platine sitzt mit den vier Befestigungsschrauben M3 fest im Gehäuse. Das macht Montage und Demontage sehr einfach.

Im Gehäuseunterteil befindet sich nur das Batteriefach für die beiden AA-Zellen. Ober- und Unterteil werden an der Vorderseite mit zwei M3 Schrauben zusammengehalten. An der Rückseite sind sie Formschlüssig durch Nut und Falz miteinander verbunden.

Der Schnitt zeigt rechts die Anordnung von Nut und Falz. Im Schnitt ist für den Batteriekasten das kleine Loch rechts unten zu sehen. Das ist ein durchgehender Kanal für einen Draht von der Plus- zur Minusseite, wo sich die Kontakte zur Leiterplatte befinden.
Man beachte im Hintergrund den nach links abgeschrägten Innen-Bund. Das Erleichtert das Zusammenfügen der beiden Teile nach dem Einrasten von Nut und Falz auf der rechen Seite des Bildes.

 

Im Batteriefach gibt es an beiden Enden eine 1,6 mm breite Nut für ein kleines Stück Lochraster-PCB. Darauf sind die Kontakte gelötet. Hier oben der Plus-Kontakt wird von zwei U-förmigen Drahtstücken hergestellt. Im rechten Bild sieht man den Plus-Leiter durch den vorher erwähnten Kanal zur Gegenseite verschwinden.

 

Die Minusseite bildet ein recykelter Kontakt aus einer alten TV-Fernbedienung. An der Außenseite der kleinen Platte kommt der Draht vom Pluspol an und dort sitzt auch ein 2-poliger 90° Pinheader als Kontaktanschluß zur Senderplatine.

Hier sieht man die Verbindung zwischen PCB und Batteriefach mit normalen Pinheader-Steckbrücken. Der helle Streifen auf dem PCB ist sehr dünner Schaumstoff, der verhindert, daß die Batterien an der Platte klappern.
Die Platine wird oben mit zwei normalen M3 Linsenkopf-Schrauben im Gehäuse befestigt. Unten sind es zwei Gewindeabstandshülsen, in die dann auch die Rückwand geschraubt werden kann.

Ein Bild vom fertigen Sender. In der Mitte zwischen den Potis und auch links vom linken Poti finden sich zwei kleine optische Anzeigen. Das sind einfach nur kurze Stückchen von transparentem 3D-Druck Filament. Im Gehäuse eingeklebt, enden sie unten auf der Platine unmittelbar über den SMD-LEDs, die auf dem Arduino (Anzeige in der Mitte) und auf dem DC-DC Wandler sowieso schon vorhanden sind. Deren Leuchten wird dadurch einfach nach Außen geleitet.

Abschließend noch einige Bilder vom Gehäuse des Empfängers. Das Design kommt wieder aus Fusion 360, gedruckt mit dem Ultimaker Original+. Das Material ist diesmal transparentes PLA.

Die Montage erfolgt ohne Schrauben. Es ist ein sogenanntes "snap-fit" Gehäuse. Der Deckel rastet in das Unterteil ein.
Die Leiterplatte sieht sehr nackt aus. Das liegt daran, dass viele Bauelemente in meiner Eagle-Bibliothek keinen 3D-Pack hinterlegt haben. Daher ist auch der Raum unter der Platine hier nur leer zu sehen. In Wirklichkeit hängt dort das nRF24L01 Modul.

Die beiden Säulen in den gegenüberliegenden Ecken fixieren die Leiterplatte von oben.

Durch den Ausschnitt sind die Steckverbinder für Betriebsspannung und Servos zugänglich und die Verbindungs-LED ist besser zu sehen.

Transparentes Filament ist nach dem Druck leider nicht wirklich glasklar, sondern nur etwas durchscheinend.

 

nach oben