Mehrere nrf24l01 in einem Netzwerk

Hallo zusammen.

Ich habe heute mal eine Frage zu den nrf24l01 Modulen. Ich möchte mir damit ein kleines Netzwerk aufbauen. An zentraler Stelle steht ein Rasperry Pi. Dieser soll nun von Arduinos Daten empfangen und auch zu diesen Daten senden können.

Nun habe ich gerade den ersten Arduino getestet und auch endlich das Senden und Empfangen hinbekommen. Die Frage ist nun wie unterscheide ich die einzelnen nrf24l01? Über die Pipes oder den Channel? Oder beides?

Wenn es über die Pipes ist… wie werden die definiert? Und wieso sind sie beim Pi und beim Arduino unterschiedlich aufgebaut?
Als Beispiel meine aktuelle Config:
Raspberry Pi:
pipes = [[0xf0, 0xf0, 0xf0, 0xf0, 0xe1], [0xf0, 0xf0, 0xf0, 0xf0, 0xd2]]
Arduino:
const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };

Danke schon mal.

Am einfachten schreibst du in alle Datenpakete eine Kennung des sendenen Knoten, die einen Rückschluss auf seine Knoten Adresse erlaubt.

Das unterste Byte der Knotenaddresse ist da direkt gut gegeignet, wenn man die obersten 4 Bytes für alle Beteilgten gleich wählt.

So können alle Knoten mit Acknowledge miteinander kommunizieren.

Hi Whandall. Danke für deine Antwort.

Verstehe ich Dich richtig das ich immer die gleiche Pipe nehmen soll und in die Nachricht eine Kennung einfügen soll? So erhalten immer alle Arduinos alle Nachrichten und nur der für den sie bestimmt ist, verarbeitet sie. Aber was ist die Knotenadresse? Und welche sind die obersten und welche die unteren Bytes?

Jeder Knoten bekommt eine eigene Addresse und lauscht auf dieser mit aktiviertem Acknowledge.

Jedes Paket enthält eine Kennung des Absenders. (Ich verwende einen 4 Byte Header von Typ, To, From, Count/Typ-spezifische Daten.)

Wenn man für alle Knoten Adressen mit den gleichen 4 obersten bytes benutzt, kann man das unterste Byte als Kennung benutzen, aus der Kennung jederzeit die Knotenadresse ermitteln und alle 6 Pipes gleichzeitig benutzen, wenn man denn möchte (es gibt sinnvolle Anwendungen dafür finde ich).

Ich verwende gerne eine Byte/ASCII Darstellung der Adressen, das verbraucht weniger Speicher als long longs und ich empfinde es als einfacher zu lesen, die druckbaren Zeichen lassen sich auch leichter in Dumps erkennen.

Ein Beispiel:

const byte Adrs[] = "1Node" "2Node" "3Node" "4Node" "5Node" "6Node" ;

  radio.openReadingPipe(1, &Adrs[3*5]); // 4te Addresse

Statt "Node" geht natürlich auch jede andere 4-buchstabige Kombination, ebenso sind die '1' - '6' natürlich völlig willkürlich, aber druckfreundlich.

In der ASCII Darstellung ist das erste Byte das LSB, bitte beachten.

Die unterschiedliche Darstellung zwischen Raspi und Arduino liegt wohl daran, wie Python aus dem Array einen zusammenhängenden Speicher bastelt, der dann in das Adressregister des Chips übertragen wird.

Ich habe den NRF noch nie auf dem Raspi betrieben, kann da also nur mutmaßen.

Die http://tmrh20.github.io/RF24/index.html Library würde aber doch auch auf einem Raspi laufen, oder habe ich da die Dokumentation falsch verstanden?