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

Aufgabenstellung

cropped-20140822-162141.jpgIm letzten Artikel habe ich gezeigt, wie man die Kommunikation zwischen zwei Arduinos über eine Funkstrecke in den Griff bekommt. Es kamen Funkmodule des Typs nRF24L01+ und die RF24-Library von Maniacbug zum Einsatz. Ein Arduino war für das Versenden und der andere für das Empfangen von Daten zuständig.

Nun tauschen wir einen der Arduinos gegen einen Raspberry Pi. Dieser wird die Daten zunächst nur entgegennehmen und nichts weiter damit tun. In späteren Artikeln beschreibe ich dann das Speichern der Daten in einer Datenbank und deren Darstellung und Auswertung. Zudem werden wir dann keine Testdaten mehr versenden, sondern aktuelle Wettermessdaten wie Temperatur, Luftdruck und relative Luftfeuchte.

Zur Senderseite schreibe ich hier nichts mehr, da dieselbe Konfiguration zum Einsatz kommt, wie sie in den beiden vorhergehenden Artikeln schon beschrieben wurde.

Konfiguration des Raspberry Pi

In diesem Beispiel setze ich einen Raspberry Pi Modell B ein, auf dem eine aktuelle Version von Raspbian „wheezy“ läuft.  Zunächst das Übliche:

Das SPI-Modul des Kernels aktivieren wir nun mit

Damit das SPI-Modul bei jedem Neustart des Raspberry automatisch geladen wird, können wir noch einen Eintrag in der Datei  /etc/modules vornehmen:

Nun schauen wir mit

in das Verzeichnis dev und sollten folgendes sehen:

spidev

Wichtig sind die beiden Einträge spidev0.0 und spidev0.1. Diese zeigen an, dass die SPI-Schnittstelle nun aktiviert ist und funktionieren sollte.

Installation der RF24-Library auf dem Raspberry

Wie beim Arduino muss auch beim Raspberry ein Treiber für die Kommunikation mit dem Funkmodul installiert werden. Dieses laden wir uns ebenfalls von Maniacbugs Github herunter und installieren diese. Dazu geben wir folgendes ins Terminal ein:


Bei der Durchsicht des neuen Verzeichnisbaums RF24/… darf man sich nicht verwirren lassen. Es wird das gesamte Paket installiert, das (unter RF24/examples) auch die Arduino-Testprogramme enthält, die auf dem Raspberry eigentlich überflüssig sind. Die für uns entscheidenden Dateien finden sich unter RF24/librf24-rpi/librf24/examples. Dahin wechseln wir nun

und finden die Sourcen der Testprogramme

  • pingtest.cpp
  • pongtest.cpp
  • rpi-hub.cpp
  • scanner.cpp

Diese kompilieren wir nun durch Eingabe von

 und erhalten die ausführbaren Programme

  • pingtest
  • pongtest
  • rpi-hub
  • scanner

Unser Raspberry ist nun vorbereitet für die Kommunikation mit dem Funkmodul.

Das Funkmodul nRF24L01+ an der GPIO-Schnittstelle

Verbinden wir nun das Funkmodul mit der GPIO-Schnittstelle des Raspberry.

Funkmodul Pin-Nr. Funkmodul Pin-Name Raspberry Pin-Nr. Raspberry Pin-Name Farbe (vgl. Bild)
1 GND 6 GND Schwarz
2 VCC (3.3V) 1 3V3 Rot
3 CE 22 GPIO25 Violett
4 CSN 24 GPIO8 (CE0) Gelb
5 SCK 23 GPIO11 (SCKL) Grau
6 MOSI 19 GPIO10 (MOSI) Orange
7 MISO 21 GPIO9 (MISO) Weiß
8 IRQ - - -

 

rpi-nRF24L01+

Funktionstest des Raspberry

Nun wird’s Ernst! Wir testen, ob das Funkmodul mit dem Raspberry zusammenarbeitet.  Dazu verwenden wir pongtest, eines der eben kompilierten Programme.

Falls alles richtig funktioniert, meldet sich das Programm nun mit der Ausgabe der Konfigurationsparameter des nRF24L01+

Thomas-Zilch-Fotografie-publicbrain-20140822-133643

Werden  in den Zeilen STATUS, RX_ADDR_P0-1, RX_ADDR_P2-5 etc. nur Nullen angezeigt, sollte sollte die Verkabelung des Funkmoduls nochmal genau geprüft werden.

Das Programm versucht nun, Daten zu empfangen und diese an den Sender zurückzuschicken. Da unser Sender (d.h. der Arduino) noch nicht in Betrieb ist, erzeugt das Programm keine weiteren Ausgaben. Es wartet einfach, bis es etwas empfängt. Und dafür wollen wir nun sorgen.

Konfiguration des Arduino als Sender

Wir verwenden hier exakt denselben Aufbau wie im letzten Artikel, wo beschrieben wurde, wie Daten zwischen zwei Arduinos hin- und hergesandt werden. Eine erneute Beschreibung erübrigt sich also an dieser Stelle.

Sprich mit mir!

Auf dem Raspberry läuft unser pongtest-Programm und wartet auf Empfang. Laden wir nun das Programm GettingStarted auf den Arduino und starten wir die serielle Konsole der Arduino-IDE. Wir sehen zunächst dieselbe Ausgabe der Konfiguarionsparameter wie zuvor in der Raspberry-Konsole.

Thomas-Zilch-Fotografie-publicbrain-20140822-134935

Durch Eingabe von „T“ in der Arduino-Konsole starten wir das Programm GettingStarted als Sender. Es beginnt, Daten, nämlich den aktuellen Wert der Funktion millis() zu senden.

Thomas-Zilch-Fotografie-publicbrain-20140822-135438

Und da der Raspberry aufmerksam lauscht, empfängt er auch, was der Arduino sendet:

Thomas-Zilch-Fotografie-publicbrain-20140822-135419

Ausblick

Im nächsten Schritt werden wir „richtige“ Daten senden: Temperatur, Luftfeuchte und Luftdruck. Dabei werde ich auch den Umgang mit I2C-Sensoren des Typs BMP180 und HTU21D beschreiben.

Weiterführende Links

Veröffentlicht in Arduino, Raspberry Pi Getagged mit: , , , ,
6 Kommentare zu “Kommunikation von Arduino zu Raspberry Pi via nRF24L01+ und RF24-Library
  1. Rasppi sagt:

    Sehr gutes Tutorial! Sehr hilfreich! Gibt es die Möglichkeit, dass dieses fortgesetzt wird?

    • Thomas sagt:

      Danke für den netten Kommentar!
      Ich habe wieder ein paar Artikel in Vorbereitung, kann aber leider nicht sagen, wann ich sie fertigstellen und veröffentlichen werde, da ich im Moment beruflich sehr eingespannt bin.
      Viele Grüße,
      Thomas

  2. Martin sagt:

    Hi! Erstmal danke für das Tutorial! Ich steh jedoch etwas auf dem Schlauch. Ich habe das Modul mit den RasPi verbunden, auch richtig, habe extra die gleichen Farben genommen.

    Hab das Github-Projekt geclont, und musste erstmal feststellen, dass sich die Struktur geändert hat, der Pongtest ist z.B. nicht in der Form da.

    Habe dann das Programm ./geetingstarted aufgerufen, was zu einer ähnlichen Ausgabe führt wie dein ./pongtest.

    Wenn ich nun aber den ./scanner aufrufe stehen die Werte alle wieder auf 00×0.

    Hast du dafür eine Erklärung?

    Liebe Grüße

    • Joerg sagt:

      @Martin

      ändere in scanner.cpp die Zeile
      RF24 radio(RPI_V2_GPIO_P1_15, RPI_V2_GPIO_P1_26, BCM2835_SPI_SPEED_8MHZ);
      auf
      RF24 radio(RPI_V2_GPIO_P1_15, RPI_V2_GPIO_P1_24, BCM2835_SPI_SPEED_8MHZ);

      @Thomas
      Ich bin auch schon ganz gespannt, wenn es weitergeht.
      „Möge die Last abfallen“

      gruß

      gruß

  3. 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.

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

  4. Alexander74 sagt:

    Zum Clonen des git Repro’s bitte folgendes benutzen:
    # git clone git://github.com/stanleyseow/RF24.git

Schreibe einen Kommentar

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

*