nRF24L01 पाइप प्रश्न


9

मैं यहां पाए गए उदाहरण कोड के माध्यम से देख रहा हूं । मुझे पता है कि 6 पाइप हैं जो nRF24L01 मॉड्यूल का उपयोग कर सकते हैं लेकिन मैं पता पदनामों के लिए इंटरनेट खोज रहा हूं और कुछ भी नहीं पा सका हूं। विशेष रूप से लाइन 37 पर, क्या लेखक के लिए 0xF0F0F0F0F0E1LL, 0xF0F0F0F0D2LL मिल रहा है?

धन्यवाद।


1
क्या आपने रेडियो आईसी के लिए डेटाशीट को देखा है? पाइप पते के बारे में निश्चित रूप से अधिक जानकारी है।

1
openReadingPipe()यहाँ के लिए RF24 API डॉक की जाँच करें: maniacbug.github.io/RF24/… यह उल्लेख करता है कि आप अंतिम पते बाइट के लिए किसी भी मान का उपयोग कर सकते हैं।
jfpoilpret

इसलिए मैंने प्रलेखन के माध्यम से देखा लेकिन यह उल्लेख नहीं करता है कि पाइप का पता कैसे चुना जाता है। यह सिर्फ यह कहता है कि उन्हें पहले 32 बिट्स साझा करने चाहिए। उदाहरण के लिए 0xF0F0F0F0 (XX), 0x बाइट के रूप में गिना जाता है? या F0F0F0F0 32 बिट्स क्या बात है? इसके अलावा, क्या इससे कोई फर्क नहीं पड़ता कि यह F0F0F0F0 नहीं है जब तक पाइप उन 32 बिट्स को साझा नहीं करता है? पिछले दो महत्वपूर्ण बाइट्स (XX) के बारे में कैसे? क्या वे मनमानी भी हैं?
एलेक्स एच

0x...उपसर्ग बस बताने के लिए मूल्य हेक्साडेसिमल में है। ऐसा इसलिए है क्योंकि दशमलव में 99, हेक्साडेसिमल में 99 से भिन्न है, भले ही वे समान दिखते हों। इसलिए इसके बजाय हम 0x99 का उपयोग करते हैं।
गेरबन

2
आपके द्वारा उपयोग किया गया कोड केवल 1 पाइप का समर्थन करता है। NRF24L01 में 2 अद्वितीय पाइप (0 और 1) हैं। इसमें 4 अतिरिक्त पाइप (2, 3, 4 और 5) भी हैं, जहां आप केवल सबसे कम-महत्वपूर्ण-बाइट सेट कर सकते हैं। अन्य बाइट्स दूसरे पाइप (1) के समान होंगे।
गेरबेन

जवाबों:


5

जैसा कि अधिकांश लोगों ने पोस्ट किया है, पाइप के लिए मान मनमाना है, लेकिन एपीआई के अनुसार नियमों का पालन करना चाहिए:

1-5 पाइप्स को पहले 32 बिट्स को साझा करना चाहिए। केवल कम से कम महत्वपूर्ण बाइट अद्वितीय होना चाहिए, जैसे

इससे पहले कि मैं आपके प्रश्न का उत्तर दूं, मुझे लगता है कि हेक्स और दशमलव मूल्यों पर स्पष्टीकरण की आवश्यकता है।

40 बिट हेक्साडेसिमल आधार 16 का एक संख्या प्रतिनिधित्व है। एक दशमलव आधार 10 का है। इसलिए आप हेक्स मान को दशमलव में बदल सकते हैं। जैसा कि यह सवाल के दायरे से बाहर है, आप एक से दूसरे में कैसे कन्वर्ट कर सकते हैं, इस पर गूगल कर सकते हैं। कुछ ऑनलाइन कन्वर्टर्स हैं:

हेक्स से दशमलव कनवर्टर

जब आप हेक्स मान को दशमलव में परिवर्तित करते हैं, तो आप देखेंगे कि इसकी सिर्फ एक संख्या है। जब आप कनवर्ट करते हैं, आप ड्रॉप 0xऔर LL। जैसा कि कहा गया 0xहै कि मान एक हेक्स मान है और LLइसका अर्थ है लॉन्ग लॉन्ग

तो अपने प्रश्न का उत्तर देने के लिए, हेक्स संख्या खोजने के लिए एक कनवर्टर का उपयोग करें:

F0F0F0F0A1
F0F0F0F0A2
F0F0F0F0B4
F0F0F0F0E9

बस अंतिम 2 अंक बदलें (कम से कम महत्वपूर्ण बिट):

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

जोड़ें 0xऔरLL

0xF0F0F0F0A1LL
0xF0F0F0F0A2LL
0xF0F0F0F0B4LL
0xF0F0F0F0E9LL

सभी को काम करना चाहिए।

मैं हेक्स का कोई विशेषज्ञ नहीं हूं, जैसा कि मैं सीख रहा हूं, इसलिए अगर मैं गलत हूं, तो कृपया मुझे सुधारें।

अंत में, nRF24L01 डेटशीट निम्नलिखित बिंदु बनाती है कि पते का चुनाव पूरी तरह से मनमाना नहीं है:

नोट: वे पते जहां स्तर केवल एक समय में बदलता है (यानी, 000FFFFFFF) अक्सर शोर में पता लगाया जा सकता है और एक झूठी पहचान दे सकता है, जो एक बढ़ा पैकेट त्रुटि दर दे सकता है। प्रस्तावना (हाई-लो टॉगलिंग) की निरंतरता के रूप में संबोधन पैकेट त्रुटि दर को भी बढ़ाता है।


क्या आप यह भी उल्लेख कर सकते हैं, कि वे पाइप केवल "6 डेटा मल्टी-रिसीवर" सुविधा (s। नॉर्डिक डेटाशीट p39-40) को संदर्भित करते हैं। डिफ़ॉल्ट रूप से केवल डेटा पाइप 0 और 1 सक्षम हैं।

@ रिश्त - क्या वह प्रासंगिक है? ओपी पूछ रहा था कि पाइप के मूल्यों को where the author is getting 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL?कैसे चुना जाता है , न कि पाइप का उपयोग कैसे किया जाता है।
फिलिएनजे

मूल्यों को चुनने के लिए, आपको यह जानना होगा कि डिफ़ॉल्ट रूप से एक लेखन पाइप और एक रीडिंग पाइप है। मल्टी-रिसीवर मोड में एक लेखन और अधिकतम 5 रीडिंग पाइप हैं। आप केवल पढ़ने वाले पाइप का वर्णन करते हैं। अब तक मैंने इसकी जाँच नहीं की है, लेकिन मेरा मानना ​​है कि अगर कोई पहले 32 बिट्स को पढ़ने और लिखने वाले पाइप को काटता है, तो यह विफल हो जाएगा।

मेरे परीक्षण से, मान आपके पाइप 0 & 1 के रूप में लंबे समय तक मनमानी कर रहे हैं, ट्रांसमीटर और रिसीवर पर समान हैं
PhillyNJ

समझा। अपने लिए मैंने मल्टी-रिसीवर सुविधा की जांच नहीं की। मैं प्रत्येक चिप का उपयोग संचारित और प्राप्त करने के लिए करता हूं।

2

मान 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LLमनमाना मूल्य हैं और प्रेषकों और रिसीवर के एडिटर्स को बात करने के लिए परिभाषित करते हैं।

यदि आप Mirf लाइब्रेरी का उपयोग करते हैं

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

वे भी जैसे तार हो सकते हैं serv1

RF24 का उपयोग करता है

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

1

कुछ ऐसा है जो हर कोई आपको बताना भूल जाता है:

रिसीवर में पाइप को पहले एक के बाद छोटा किया जाना चाहिए

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

ट्रांसमीटर पर पाइप होना चाहिए

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

यदि आप जानना चाहते हैं कि कौन सा पाइप का संदेश आया है, तो उपयोग करें

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

इसके अलावा पाइप नंबर 6 का उपयोग स्वीकार संदेश प्राप्त करने के लिए किया जाता है ।

इसके अलावा, इनिशियलाइज़ेशन कोड में radio.enableDynamicPayloads(); यह एक मेरे लिए अच्छा काम करता है:

    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

सौभाग्य...


pipeआपके उदाहरण में क्या परिभाषित किया गया है?
x29a

1
मैंने कोड संपादित किया है। भेजने के लिए आप इनमें से किसी भी 'पाइप' का उपयोग कर सकते हैं, लेकिन उस पाइप को पढ़ने से बाहर करने के लिए (मेरे जैसे) मत भूलना।
फिग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.