Fråga:
nRF24L01 rörfråga
Alex H
2014-06-15 23:25:51 UTC
view on stackexchange narkive permalink

Jag tittar igenom exempelkoden som finns här. Jag vet att det finns 6 rör som nRF24L01-modulen kan använda men jag har sökt på internet efter adressbeteckningarna och har inte kunnat hitta någonting. Mer specifikt på rad 37, finns det en referens för var författaren hämtar 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL?

Tack.

Har du tittat på databladet för radio-IC? Det har verkligen mer information om röradresser.
Kontrollera RF24 API-dokumentet för `openReadingPipe ()` här: http://maniacbug.github.io/RF24/classRF24.html#aa7e8523f86f9f8f20c274e0c89a5fd45 det nämner att du kan använda valfria värden för den sista adressbyten.
Så jag tittade igenom dokumentationen men det nämns inte hur röradressen väljs. Det säger bara att de ska dela de första 32 bitarna. Till exempel 0xF0F0F0F0 (XX), räknas 0x som en byte? Eller är F0F0F0F0 de 32 bitarna som spelar roll? Spelar det också någon roll om det inte är F0F0F0F0 så länge rören delar de 32 bitarna? Vad sägs om de två sista betydande byten (XX)? Är de också godtyckliga?
Prefixet `0x ...` är bara att berätta att värdet är i hexadecimal. Detta beror på att 99 i decimal skiljer sig från 99 i hexadecimal, även om de ser likadana ut. Så istället använder vi 0x99.
Koden du använder stöder bara 1 rör. NRF24L01 har 2 unika rör (0 och 1). Det har också fyra ytterligare rör (2, 3, 4 och 5), där du bara kan ställa in minst betydande byte. De andra byten kommer att vara desamma som det andra röret (1).
Tack för svaret, jag antar att jag bara inte förstår om det finns en process för att ställa in den minst betydande byten. Till exempel E1 eller D2 i rören som anges ovan ...
Tre svar:
PhillyNJ
2014-07-15 16:38:22 UTC
view on stackexchange narkive permalink

Som de flesta har publicerat är värdena för röret godtyckliga, men måste följa reglerna enligt API: et:

Rör 1-5 bör dela de första 32 bitarna. Endast den minst betydande byten ska vara unik, t.ex.

Innan jag svarar på din fråga tror jag att det behövs en förklaring om Hex- och Decimalvärden.

40-bitars hexadecimala är en talrepresentation av bas 16. En decimal är av bas 10. Så du kan konvertera ett hexvärde till decimal. Eftersom detta inte omfattas av frågan kan du google om hur man konverterar från en till en annan. Det finns några omvandlare online:

Hex till decimalomvandlare

Du ser när du konverterar Hex-värdet till decimal, att det bara är en talrepresentation. När du konverterar släpper du 0x och LL . Som anges anger 0x att värdet är ett hexadecimalt värde och LL betyder typ Long Long.

Så för att svara på din fråga, använd a-omvandlaren för att hitta ett hexadecimalt tal som:

  F0F0F0F0A1F0F0F0F0A2F0F0F0F0B4F0F0F0F0E9  

Bara ändra de två sista siffrorna (minst signifikant bit):

  Rör 1-5 ska dela de första 32 bitarna. Endast den minst betydande byten bör vara unik, t.ex. openReadingPipe (1,0xF0F0F0F0AA); openReadingPipe (2,0xF0F0F0F066);  

Lägg till 0x och LL

  0xF0F0F0F0A1LL0xF0F0F0F0A2LL0xF0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 kod> 

Allt ska fungera.

Jag är ingen expert på hex, eftersom jag lär mig, så om jag är felaktig, vänligen korrigera mig.

Slutligen gör databladet nRF24L01 följande att valet av adress inte är helt godtycklig:

Obs: Adresser där nivån bara skiftar en gång (det vill säga 000FFFFFFF) kan ofta detekteras i brus och kan ge en falsk detektering, vilket kan ge en höjd paketfelfrekvens. Adresser som en fortsättning på ingressen (hög-låg växling) ökar också Packet Error Rate.

kan du också nämna att dessa rör endast hänvisar till funktionen "6 data multi-receiver" (s. Nordiskt datablad p39-40). som standard är endast datarör 0 och 1 aktiverade.
@bersch - Är det relevant? OP frågade hur rörvärdena valdes t.ex. `där författaren får 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL?`, inte hur rören används.
För att välja värdena måste du veta att det som standard finns ett skrivrör och ett läserör. I läget för flera mottagare finns skriv- och upp till 5 avläsningsrör. Du beskriver bara läsrören. Hittills har jag inte kontrollerat det, men jag tror att om man väljer läs- och skrivröret som delar de första 32 bitarna kommer det att misslyckas.
Från min testning är värdena godtyckliga så länge ditt rör 0 & 1 är detsamma på sändaren och mottagaren
Jag förstår. För mig själv kollade jag inte multimottagarfunktionen. Jag använder varje chip för att sända och ta emot.
Jag jobbar med mina. Jag kommer att ha en sändare och fyra mottagare
låter intressant
user3028
2014-07-09 20:55:31 UTC
view on stackexchange narkive permalink

Värdena 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL är godtyckliga värden och definierar adresserna till avsändare och mottagare att prata med.

Om du använder Mirf-biblioteket

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

de kan också vara strängar som serv1.

RF24 använder

  write_register (RX_ADDR_P0, &value, 5); write_register (TX_ADDR, &value, 5);  
Faig
2017-12-18 21:49:10 UTC
view on stackexchange narkive permalink

Det finns något som alla glömmer att berätta:

Rör vid mottagare bör förkortas efter det första

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

Rör vid sändare ska vara

  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 = 0xE8E8L0; // eller pipe02 eller pipe03 eller pipe04 eller pipe05radio.openWritingPipe (setPipeToSend);  

Om du vill veta vilket rörs meddelande har kommit, använd

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

Även rörnummer 6 används för att ta emot bekräfta meddelanden.

Dessutom måste initialiseringskoden ha radio.enableDynamicPayloads (); Den här fungerar bra för mig:

  radio.begin () ; //radio.setChannel(0x57); // om uppsättningen ska vara densamma på båda sidorna radio.setPALevel (RF24_PA_LOW); // "LOW" är mer stabilt läge radio.enableAckPayload (); // för autoanswers radio.openWritingPipe (pipe01); // för att skicka // länka rörnummer till röradresserna //radio.openReadingPipe(1, pipe01); // Jag använder pipe01 för att skicka radio.openReadingPipe (2, pipe02); radio.openReadingPipe (3, pipe03); radio.openReadingPipe (4, pipe04); radio.openReadingPipe (5, pipe05);
radio.enableDynamicPayloads (); // måste ha för multi-pipe mottagande radio.startListening (); // börja lyssna  

Lycka till ...

vad är "rör" definierat som i ditt exempel?
Jag har redigerat koden. Du kan använda någon av dessa "rör" för att skicka, men glöm inte (som jag) att utesluta det röret från läsning.


Denna fråga och svar översattes automatiskt från det engelska språket.Det ursprungliga innehållet finns tillgängligt på stackexchange, vilket vi tackar för cc by-sa 3.0-licensen som det distribueras under.
Loading...