Kommunikation von Arduino zu Arduino via nRF24L01+ und RF24-Library

Aufgabenstellung

Thomas-Zilch-Fotografie-publicbrain-20140822-164405In diesem Artikel schreibe ich meine Erfahrungen über den Einsatz von Funkmodule des Typs nRF24L01+ nieder. Die Module kann man für wenig Geld in diversen Ausführungen bei Amazon oder Ebay erstehen. Mit ihnen ist es möglich, eine 2,4 GHz-Funkverbindung aufzubauen. Die Module sind Transceiver, d.h. mit ihnen ist Senden und Empfangen möglich.

Mein Ziel ist es, zwischen einem Arduino und einem Raspberry Pi eine Funkstrecke aufzubauen, auf der Daten vom Arduino an den Raspberry gesandt werden.

Im Netz geistern viele Beschreibungen herum, wie diese Aufgaben zu lösen ist. Leider verweisen sie zum Teil auf inzwischen veraltete Library-Versionen oder die Programmbeispiele funktionieren nicht oder die Beschreibungen sind widersprüchlich oder, oder, oder…

Nach vielen Irrungen und Wirkungen mit den diversen Beschreibungen habe ich mich entschlossen, meine eigene Lösung aufzuschreiben und zu veröffentlichen. Dabei beginne ich erstmal etwas kleiner: Zunächst versuche ich, mich auf bekanntem Terrain zu bewegen und zwei Arduinos miteinander sprechen zu lassen. Dazu verwende ich einen Aduino Uno Rev. 3 und einen (in China geklonten) Arduino Nano 328. Sobald ich die Kommunikation zwischen diesen beiden Geräten im Griff habe, werde ich eines davon, wahrscheinlich den Arduino Uno, gegen einen Raspberry Pi Mod. B tauschen. Dazu aber später mehr.

Ich freue mich über Kommentare, Fragen, Korrekturen und eigene Erfahrungsberichte der Leser/innen!

Das Funkmodul nRF24L01+

Sehen wir uns aber zunächst eines der Funkmodule an: Die Größe der Ausführung, die ich habe, beträgt ca. 2 x 4 cm. Auf der Oberseite der Platine fallen die ausgedruckte Antenne und der 16 MHz-Quarz auf. Auf der Unterseite ist ein 4×2-Pinheader eingelötet. Die Grafik zeigt eine schematische Darstellung der Oberseite des Moduls.

nRF24L01+

Die einzelnen Pins haben folgende Bedeutung:

Pin-Nr. Bedeutung
1 GND
2 VCC (3.3V)
3 CE
4 CSN
5 SCK
6 MOSI
7 MISO
8 IRQ

An den Pins CSN, SCK, MISO und MOSI erkennt man, dass das Modul per SPI-Schnittstelle mit dem Arduino kommuniziert.

Das Modul ist mit einem Nordic-Chip bestückt, zu dem es natürlich auch ein Datenblatt gibt. Es lohnt sich wirklich, mal reinzuschauen, um die Arbeitsweise und Ansteuerung des Chips zu verstehen.

Verbindung des Funkmoduls mit dem Arduino Uno

Zuerst bringen wir nun den Arduino Uno ans Laufen. Das Funkmodul wird wie folgt mit dem Board verbunden:

Funkmodul Pin-Nr. Funkmodul Pin-Name Arduino Uno Pin Farbe (vgl. Bild)
1 GND GND Schwarz
2 VCC (3.3V) 3.3V Rot
3 CE 9 Grün
4 CSN 10 Grau
5 SCK 13 Gelb
6 MOSI 11 Blau
7 MISO 12 Violett
8 IRQ nicht benutzt

Arduino-nRF24L01+

Der Anschluß des Funkmoduls an den Arduino Nano wird weiter unten beschrieben.

Die Arduino-Library RF24

Um dem Arduino die Kommunikation mit den Modulen beizubringen, gibt es diverse Librarys. Die bekanntesten sind wohl MIRF24 und RF24. Ich möchte mich in diesem Artikel auf die RF24-Library von maniacbug beschränken, die hier heruntergeladen werden kann: https://github.com/maniacbug/RF24.

Nach dem Herunterladen und Entpacken der ZIP-Datei erhält man einen Ordner namens RF24-master. Diesen benennt man um in RF24 und löscht darin alles bis auf den Unterordner examples und die Dateien RF24.cpp, RF24.h, RF24_config.h und nRF24L01.h. Nun kann man die Library auf dem bekannten Weg in die Arduino-IDE importieren (Sketch->Library importieren…-> Add Library…).

Erster Test auf dem Arduino Uno

Zum Test verwenden wir das mit der Library mitgelieferte Beispiel GettingStarted. Im Gegensatz zu anderen in Netz verfügbaren Programmen funktioniert es und ist zudem gut dokumentiert. Mit dem Programm arbeitet ein Arduino entweder als Empfänger oder als Sender. Die Funktion kann über den seriellen Monitor durch Eingabe von „T“ (Transmitter) oder „R“ (Receiver) gewählt werden. Logisch, dass ein Arduino als Sender, der andere als Empfänger arbeiten muss. Der Sender überträgt nun einen Zahlenwert an den Empfänger. Dieser sendet den Wert einfach an den Sender zurück. Der Sender misst die Laufzeit (round-trip delay) und gibt diese auf der seriellen Konsole aus.

Das Programm wird via Arduino-IDE auf den Arduino Uno geladen und läuft dann sofort los. Über die serielle Konsole der Arduino-IDE kann man sich nun den Programm-Output ansehen. Durch Eingabe von „R“ machen wir den Arduino Uno zum Empfänger. Da er läuft, aber noch nichts empfängt (der sendete Arduino ist ja noch nicht in Betrieb), werden auf der seriellen Konsole entsprechende Fehlermeldungen ausgegeben.

Verbindung des Funkmoduls mit dem Arduino Nano

Nun bauen wir uns unseren Sender. Wie bereits erwähnt wird dieser auf einem Arduino Nano Clone laufen. Hier wieder die Tabelle und die Grafik, wie das Funkmodule mit dem Nano zu verbinden ist:

Funkmodul Pin-Nr. Funkmodul Pin-Name Arduino Nano Pin Farbe (vgl. Bild)
1 GND GND Schwarz
2 VCC (3.3V) 3.3V Rot
3 CE D9 Grün
4 CSN D10 Grau
5 SCK D13 Gelb
6 MOSI D11 Blau
7 MISO D12 Violett
8 IRQ nicht benutzt

Nano-nRF24L01+

Laden den Programms auf den Arduino Nano

Der Arduino Nano bekommt dasselbe Programm wie der Uno. Wir lassen den Uno mit dem Rechner verbunden und stecken den Nano an eine andere USB-Schnittstelle unseres Rechners. Nun müssen wir auf zwei Dinge achten:

  • Auswahl der richtigen USB-Schnittstelle in der Arduino-IDE. Unter Tools->Serieller Port müsste sich der Nano mit einem neuen Port angemeldet haben. Auf meinem MacBook Pro heißt der Port für den Uno „dev/tty.usbmodem1421“ und der für den Nano heißt „/dev/tty.usbserial“. Hier ist also der Port des Arduino Nano auszuwählen!
  • Auswahl des richtigen Boards unter Tools->Board. Für den Nano ist hier „Arduino Nano w/ ATmega328“ auszuwählen.

Nun kann das Programm auf den Nano geladen werden.

Zwei serielle Monitore?

Nun haben wir ein Problem: Wie kann man mit der Arduino-IDE gleichzeitig zwei serielle Monitore starten? Die einfache Antwort: Gar nicht!

Um den Output beider Arduinos zu überwachen, benötigen wir einen seriellen Monitor, der die Überwachung mehrerer Schnittstellen gleichzeitig gestatt. So einen gibts es auch, er nennt sich CoolTerm und wird in einem kleinen Artikel vorgestellt.

Wir starten also CoolTerm, öffnen zwei Fenster und geben über den Options-Dialog im ersten Fenster die Verbindungsdaten zum Arduino Uno ein (Port: usbmodem1421, Speed: 57600) und klicken auf „Connect“. Dann geben wir im zweiten Fester die Daten des Arduino Nano ein (Port: usbserial, Speed: 57600) und klicken ebenfalls auf „Connect“. Wir starten nun bei Controller durch Druck auf die Reset-Buttons neu und sehen nach einigen Sekunden in beiden Fenstern des Startbildschirm, also die Meldung, die durch das Programm beim Start über die Programmzeile 110 ausgegeben wird.

 

output

Im Fenster des Arduino Uno drücken wir nun „R“, um ihn zum Empfänger zu machen und im Fenster des Arduino Nano geben wir „T“ ein, da der Nano die Rolle des Senders übernehmen soll. Wenn alles richtig läuft, können wir nun in den beiden CoolTerm-Fenstern die Kommunikation der beiden Arduinos beobachten (zum Vergrößern ins Bild klicken):

CoolTerm

 Wie geht es nun weiter?

Die gezeigte Konfiguration lief knapp 24 Stunden vor sich hin, ohne dass sich die beiden Arduinos verschluckten oder aufhängten. Für mich ist dadurch eine belastbare Basis für den weiteren Ausbau geschaffen.

Im nächsten Schritt werde ich anstelle von Dummy-Daten konkrete Sensormesswerte (Temperatur, Luftdruck und relative Luftfeuchtigkeit) senden, die von Sensoren des Typs HTU21D und BMP180 gewonnen werden.

Bis bald!

Weiterführende Links

Veröffentlicht in Arduino Getagged mit: , , , ,
4 Kommentare zu “Kommunikation von Arduino zu Arduino via nRF24L01+ und RF24-Library
  1. Ibrahim Hakikat sagt:

    Hallo,
    ich bin ein neu Anfänger mit der Plattform Arduino und im Internet bin ich auf diesen Beitrag gestoßen. Ich muss ehrlich sein, dass es hat mir sehr geholfen einen Schritt weiter zukommen. Nun habe ich eine Frage, kann man mit zwei Arduinos
    (Arduino Due als Sender und Arduino Uno als Empfänger) und dazu zwei Funkmodulen (nRF24L01+) Messdaten im 2,4 GHz Bereich einer Übertragungsstrecke mit einer Bitrate von 2 MBit/s übertragen werden? Wenn ja, wie sollte ich an die Sache ran gehen und was sollte ich dabei beachten ?

    Um eine Antwort würde ich mich freuen 🙂

    Mit freundlichen Grüßen

  2. Wolfgang sagt:

    Obacht!
    Bei Anschluß eines Pfostensteckers ist die Pin-Numerierung des Moduls falsch! Das liegt daran, daß die Chinesen den Stecker auf die falsche Seite löten.

    Pin 1 eines Flachbandkabels ist VCC, Pin 2 GND usw.

    Das Dreieck für Pin 1 eines Pfostensteckers zeigt auf VCC.

    Also wer es sich wie ich bequem machen möchte und statt einem Wust an Drähten ein Flachbandkabel am Modul anschließt, unbedingt beachten und zur Sicherheit nochmal vorher durchmessen.

    Beim Arduino Uno kann man mit dieser Methode 6 Adern des Flachbandkabels auf einen 6poligen Pfostenstecker legen (GND neben Ausgang 13 nehmen) und braucht nur einen Einzelpin nach 3,3V. Vorteil ist, man kann das Modul damit von der Platine absetzen, z.B. aus einem Gehäuse herausführen, und hat eine mechanisch sichere Verbindung anstatt einem halben Dutzend Einzeldrähte im fliegenden Verbau.

  3. Moritz Müller sagt:

    Hallo,
    ich habe erst vor kurzem mit dem programmieren von Arduinos angefangen, benötige aber für ein Projekt diese Funkübertragung. Dadurch bin ich auf diesen Beitrag gestoßen und habe dann auch den Code zum Testen kopiert und die nötige Library installiert.
    Allerdings bekomme ich in dem Abschnitt:
    _____________________________________________________________________
    if ( role == role_pong_back )
    {
    // if there is data ready
    if ( radio.available() )
    {
    // Dump the payloads until we’ve gotten everything
    unsigned long got_time;
    bool done = false;
    while (!done)
    {
    // Fetch the payload, and see if this was the last one.
    done = radio.read( &got_time, sizeof(unsigned long) );

    // Spew it
    printf(„Got payload %lu…“,got_time);

    // Delay just a little bit to let the other unit
    // make the transition to receiver
    delay(20);
    }
    __________________________________________________________________

    immer diesen Fehler angezeigt.
    __________________________________________________________________
    C:\Users\Moritz\Downloads\Arduino\Ftest\Ftest.ino: In function ‚void loop()‘:

    Ftest:182: error: void value not ignored as it ought to be

    done = radio.read( &got_time, sizeof(unsigned long) );

    ^

    exit status 1
    void value not ignored as it ought to be
    __________________________________________________________________

    Ich benutze die Arduino IDE 1.6.8
    Ich hoffe das Problem lässt sich lösen.

    Danke und mit freundlichen Grüßen
    Moritz

  4. Tomte sagt:

    In der aktuellen Version (1.6.9) der Arduino IDE ist es übrigens möglich, zwei Instanzen geöffnet zu haben und parallel damit zu arbeiten. Das ermöglicht nicht nur zwei serielle Monitore, sondern erspart auch das umschalten zwischen den Ports und ggf. Board-Typen beim Hochladen. Ganz komfortabel.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*