Pytanie do nRF24L01

9

Przeglądam przykładowy kod znaleziony tutaj . Wiem, że moduł nRF24L01 może używać 6 potoków, ale szukałem w Internecie oznaczeń adresów i nic nie znalazłem. A dokładniej w wierszu 37, czy istnieje odniesienie do tego, gdzie autor otrzymuje 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL?

Dzięki.

Alex H.
źródło
1
Czy spojrzałeś na arkusz danych dla radia IC? To z pewnością zawiera więcej informacji o adresach potoków.
1
Sprawdź dokument API RF24 openReadingPipe()tutaj: maniacbug.github.io/RF24/… wspomina, że ​​możesz użyć dowolnych wartości dla ostatniego bajtu adresu.
jfpoilpret
Przejrzałem więc dokumentację, ale nie wspomina ona o tym, jak wybierany jest adres potoku. Po prostu powiedz, że powinni dzielić pierwsze 32 bity. Na przykład 0xF0F0F0F0 (XX), czy 0x liczy się jako bajt? A może F0F0F0F0 to 32 bity, które mają znaczenie? Czy to ma znaczenie, jeśli nie jest to F0F0F0F0, o ile rury dzielą te 32 bity? Co powiesz na ostatnie dwa znaczące bajty (XX)? Czy to też są arbitralne?
Alex H,
0x...Prefiks jest po prostu powiedzieć wartość jest w systemie szesnastkowym. Wynika to z faktu, że 99 w systemie dziesiętnym różni się od 99 w systemie szesnastkowym, nawet jeśli wyglądają tak samo. Zamiast tego używamy 0x99.
Gerben
2
Kod, którego używasz, obsługuje tylko 1 potok. NRF24L01 ma 2 unikalne rury (0 i 1). Ma również 4 dodatkowe potoki (2, 3, 4 i 5), w których można ustawić tylko najmniej znaczący bajt. Pozostałe bajty będą takie same jak druga rura (1).
Gerben

Odpowiedzi:

5

Jak większość ludzi napisała, wartości potoku są dowolne, ale muszą być zgodne z regułami interfejsu API:

Rury 1-5 powinny dzielić pierwsze 32 bity. Tylko najmniej znaczący bajt powinien być unikalny, np

Zanim odpowiem na twoje pytanie, uważam, że potrzebne jest wyjaśnienie wartości szesnastkowej i dziesiętnej.

40-bitowy system szesnastkowy jest reprezentacją liczbową podstawy 16. Dziesiętny jest podstawą 10. Abyś mógł przekonwertować wartość szesnastkową na dziesiętną. Ponieważ jest to poza zakresem pytania, możesz google dowiedzieć się, jak konwertować z jednego na drugi. Istnieje kilka konwerterów online:

Konwerter szesnastkowy na dziesiętny

Zobaczysz, kiedy konwertujesz wartość szesnastkową na dziesiętną, że jest to tylko reprezentacja liczbowa. Podczas konwersji upuszczasz 0xi LL. Jak stwierdzono, 0xwskazuje, że wartość jest wartością szesnastkową i LLoznacza typ Długi Długi .

Aby odpowiedzieć na twoje pytanie, użyj konwertera, aby znaleźć liczbę szesnastkową, taką jak:

F0F0F0F0A1
F0F0F0F0A2
F0F0F0F0B4
F0F0F0F0E9

Wystarczy zmienić ostatnie 2 cyfry (najmniej znaczący 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);

Dodaj 0xiLL

0xF0F0F0F0A1LL
0xF0F0F0F0A2LL
0xF0F0F0F0B4LL
0xF0F0F0F0E9LL

Wszystko powinno działać.

Nie jestem ekspertem od hexów, ponieważ się uczę, więc jeśli się mylę, proszę, popraw mnie.

Wreszcie arkusz danych nRF24L01 stwierdza, że ​​wybór adresu nie jest całkowicie arbitralny:

Uwaga: Adresy, w których poziom przesuwa się tylko jeden raz (to znaczy 000FFFFFFF), często mogą być wykryte w hałasie i mogą dawać fałszywe wykrywanie, co może dawać podwyższony wskaźnik błędów pakietów. Adresy jako kontynuacja preambuły (przełączanie hi-low) również zwiększają współczynnik błędów pakietów.

PhillyNJ
źródło
czy mógłbyś również wspomnieć, że te rury odnoszą się tylko do funkcji „6-odbiorników z wieloma odbiornikami” (patrz nordycka karta danych p39-40). domyślnie tylko potok danych 0 i 1 są włączone.
@bersch - Czy to istotne? OP pytał, jak wybierane są wartości rur, np. where the author is getting 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL?Nie w jaki sposób rury są używane.
PhillyNJ,
Aby wybrać wartości, musisz wiedzieć, że domyślnie jest rura do pisania i rura do czytania. W trybie wielu odbiorników jest zapis i do 5 potoków czytania. Opisujesz tylko rury do czytania. Do tej pory tego nie sprawdzałem, ale wierzę, że jeśli wybierzesz potok odczytu i zapisu, który dzieli pierwsze 32 bity, to się nie powiedzie.
Z moich testów
wynika
Widzę. Dla siebie nie sprawdziłem funkcji wielu odbiorników. Używam każdego układu do transmisji i odbioru.
2

Wartości 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LLsą wartościami arbitralnymi i określają adresy nadawców i odbiorców, z którymi należy rozmawiać.

Jeśli korzystasz z biblioteki Mirf

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

mogą być również ciągami jak serv1.

RF24 wykorzystuje

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

źródło
1

Jest coś, o czym wszyscy zapomną powiedzieć:

Rury w odbiorniku należy skrócić po pierwszym

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);

Rury na nadajniku powinny być

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 );

Jeśli chcesz wiedzieć, która wiadomość potoku nadeszła, użyj

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

Również potok numer 6 jest używany do odbierania komunikatów potwierdzających .

Ponadto kod inicjujący musi mieć radio.enableDynamicPayloads(); Ten działa dla mnie dobrze:

    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

Powodzenia...

Faig
źródło
co pipezdefiniowano jak w twoim przykładzie?
x29a,
1
Zredagowałem kod. Możesz użyć dowolnego z tych „potoków” do wysyłania, ale nie zapomnij (jak ja), aby wykluczyć ten potok z czytania.
Faig