nRF24L01 Rohrfrage

9

Ich schaue mir den hier gefundenen Beispielcode an . Ich weiß, dass das nRF24L01-Modul 6 Pipes verwenden kann, aber ich habe im Internet nach den Adressbezeichnungen gesucht und konnte nichts finden. Gibt es in Zeile 37 eine Referenz dafür, wo der Autor 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL erhält?

Vielen Dank.

Alex H.
quelle
1
Haben Sie sich das Datenblatt für den Radio-IC angesehen? Das hat sicherlich mehr Informationen über Pipe-Adressen.
1
Überprüfen Sie das RF24-API-Dokument openReadingPipe()hier: maniacbug.github.io/RF24/… Es wird erwähnt, dass Sie beliebige Werte für das letzte Adressbyte verwenden können.
jfpoilpret
Also habe ich die Dokumentation durchgesehen, aber es wird nicht erwähnt, wie die Pipe-Adresse ausgewählt wird. Es heißt nur, sie sollten die ersten 32 Bits gemeinsam nutzen. Zählt 0x zum Beispiel 0xF0F0F0F0 (XX) als Byte? Oder sind F0F0F0F0 die 32 Bits, die wichtig sind? Ist es auch wichtig, wenn es nicht F0F0F0F0 ist, solange die Pipes diese 32 Bit gemeinsam nutzen? Wie wäre es mit den letzten zwei signifikanten Bytes (XX)? Sind diese auch willkürlich?
Alex H
Das 0x...Präfix soll nur angeben, dass der Wert hexadezimal ist. Dies liegt daran, dass 99 in Dezimalzahl sich von 99 in Hexadezimalzahl unterscheidet, obwohl sie gleich aussehen. Also verwenden wir stattdessen 0x99.
Gerben
2
Der Code, den Sie verwenden, unterstützt nur 1 Pipe. Der nRF24L01 verfügt über 2 eindeutige Rohre (0 und 1). Es hat auch 4 zusätzliche Pipes (2, 3, 4 und 5), in denen Sie nur das niedrigstwertige Byte einstellen können. Die anderen Bytes sind die gleichen wie bei der zweiten Pipe (1).
Gerben

Antworten:

5

Wie die meisten Leute gepostet haben, sind die Werte für die Pipe willkürlich, müssen jedoch den Regeln gemäß der API folgen:

Die Pipes 1-5 sollten die ersten 32 Bits gemeinsam nutzen. Nur das niedrigstwertige Byte sollte eindeutig sein, z

Bevor ich Ihre Frage beantworte, denke ich, dass eine Erklärung zu Hex- und Dezimalwerten erforderlich ist.

Die 40-Bit-Hexadezimalzahl ist eine Zahlendarstellung der Basis 16. Eine Dezimalstelle ist die Basis 10. Sie können also einen Hexadezimalwert in eine Dezimalzahl konvertieren. Da dies für die Frage nicht möglich ist, können Sie bei Google festlegen, wie von einem in einen anderen konvertiert werden soll. Es gibt einige Online-Konverter:

Hex-zu-Dezimal-Konverter

Sie werden sehen, wenn Sie den Hex-Wert in eine Dezimalzahl konvertieren, dass es sich nur um eine Zahlendarstellung handelt. Wenn Sie konvertieren, lassen Sie das 0xund fallen LL. Wie angegeben, 0xbedeutet dies, dass der Wert ein Hex-Wert ist und LLden Typ Long Long bedeutet .

Um Ihre Frage zu beantworten, verwenden Sie den a-Konverter, um eine Hex-Zahl wie folgt zu finden:

F0F0F0F0A1
F0F0F0F0A2
F0F0F0F0B4
F0F0F0F0E9

Ändern Sie einfach die letzten 2 Ziffern (niedrigstwertiges Bit):

Pipes 1-5 should share the first 32 bits. Only the least significant byte should be unique, e.g.
   openReadingPipe(1,0xF0F0F0F0AA);
   openReadingPipe(2,0xF0F0F0F066);

Fügen Sie das 0xund hinzuLL

0xF0F0F0F0A1LL
0xF0F0F0F0A2LL
0xF0F0F0F0B4LL
0xF0F0F0F0E9LL

Alles sollte funktionieren.

Ich bin kein Hex-Experte, da ich lerne. Wenn ich also falsch liege, korrigiert mich bitte jemand.

Schließlich weist das Datenblatt nRF24L01 darauf hin, dass die Wahl der Adresse nicht völlig willkürlich ist:

Hinweis: Adressen, bei denen sich der Pegel nur einmal verschiebt (dh 000FFFFFFF), können häufig im Rauschen erkannt werden und eine falsche Erkennung ergeben, was zu einer erhöhten Paketfehlerrate führen kann. Adressen als Fortsetzung der Präambel (Hi-Low-Umschaltung) erhöhen auch die Paketfehlerrate.

PhillyNJ
quelle
Könnten Sie bitte auch erwähnen, dass sich diese Pipes nur auf die Funktion "6-Daten-Multi-Empfänger" beziehen (s. Nordisches Datenblatt S. 39-40). Standardmäßig sind nur die Datenleitungen 0 und 1 aktiviert.
@bersch - Ist das relevant? Das OP fragte, wie die Rohrwerte gewählt werden, z. B. where the author is getting 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL?nicht, wie die Rohre verwendet werden.
PhillyNJ
Um die Werte auswählen zu können, müssen Sie wissen, dass standardmäßig eine Schreib- und eine Lesepfeife vorhanden sind. Im Multi-Receiver-Modus gibt es eine Schreib- und bis zu 5 Lesepfeifen. Sie beschreiben nur die Lesepfeifen. Bisher habe ich das nicht überprüft, aber ich glaube, wenn man die Lese- und Schreibpipe wählt, die die ersten 32 Bits teilt, wird es fehlschlagen.
Nach
Aha. Für mich selbst habe ich die Multi-Receiver-Funktion nicht überprüft. Ich benutze jeden Chip zum Senden und Empfangen.
2

Die Werte 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LLsind beliebige Werte und definieren die Adressen der Sender und Empfänger, mit denen gesprochen werden soll.

Wenn Sie die Mirf-Bibliothek verwenden

Mirf.setRADDR((byte *)"serv1");

Sie können auch wie Strings sein serv1.

RF24 Verwendet

write_register(RX_ADDR_P0, &value, 5);
write_register(TX_ADDR, &value, 5);

quelle
1

Es gibt etwas, das jeder vergisst, um Ihnen zu sagen:

Die Rohre am Empfänger sollten nach dem ersten gekürzt werden

const uint64_t pipe01 = 0xE8E8F0F0A1LL;
const uint64_t pipe02 = 0xA2LL;  
const uint64_t pipe03 = 0xA3LL;
const uint64_t pipe04 = 0xA4LL;
const uint64_t pipe05 = 0xA5LL;
const uint64_t pipe06 = 0xA6LL;

radio.openReadingPipe(1, pipe01);  
radio.openReadingPipe(2, pipe02);
radio.openReadingPipe(3, pipe03);
radio.openReadingPipe(4, pipe04);
radio.openReadingPipe(5, pipe05);

Rohre am Sender sollten sein

const uint64_t pipe01 = 0xE8E8F0F0A1LL;
const uint64_t pipe02 = 0xE8E8F0F0A2LL;  
const uint64_t pipe03 = 0xE8E8F0F0A3LL;
const uint64_t pipe04 = 0xE8E8F0F0A4LL;
const uint64_t pipe05 = 0xE8E8F0F0A5LL;
const uint64_t pipe06 = 0xE8E8F0F0A6LL;

uint64_t setPipeToSend = pipe01; // or pipe02 or pipe03 or pipe04 or pipe05
radio.openWritingPipe(setPipeToSend );

Wenn Sie wissen möchten, welche Pipe-Nachricht eingegangen ist, verwenden Sie

  uint8_t someVariable;
    if (radio.available(&someVariable))
    {
       Serial.print("pipe number ");
       Serial.printLn(someVariable);
    }

Auch die Pipe Nummer 6 wird zum Empfangen von Bestätigungsnachrichten verwendet .

Außerdem muss der Initialisierungscode Folgendes haben: radio.enableDynamicPayloads(); Dieser funktioniert gut für mich:

    radio.begin();
    //radio.setChannel(0x57); //if set should be the same at the both sides
    radio.setPALevel(RF24_PA_LOW);  // "LOW" is more stable mode
    radio.enableAckPayload(); //for autoanswers
    radio.openWritingPipe(pipe01); //for sending
    //link pipe numbers to the pipe addresses
    //radio.openReadingPipe(1, pipe01); // I use pipe01 for sending
    radio.openReadingPipe(2, pipe02);
    radio.openReadingPipe(3, pipe03);
    radio.openReadingPipe(4, pipe04);
    radio.openReadingPipe(5, pipe05);
    radio.enableDynamicPayloads(); //must have for multi pipe receiving
    radio.startListening();  //start listening

Viel Glück...

Faig
quelle
Was pipeist wie in Ihrem Beispiel definiert?
x29a
1
Ich habe den Code bearbeitet. Sie können jede dieser 'Pipes' zum Senden verwenden, aber vergessen Sie (wie ich) nicht, diese Pipe vom Lesen auszuschließen.
Faig