คำถามไปป์ nRF24L01


9

ฉันกำลังมองหารหัสผ่านตัวอย่างที่พบที่นี่ ฉันรู้ว่ามี 6 ท่อที่โมดูล nRF24L01 สามารถใช้ได้ แต่ฉันค้นหาอินเทอร์เน็ตเพื่อหาที่อยู่และไม่สามารถหาอะไรได้ โดยเฉพาะอย่างยิ่งในบรรทัดที่ 37 มีการอ้างอิงว่าผู้เขียนได้รับ 0xF0F0F0F0E1LL, 0xF0F0F0F0F0F0D2LL หรือไม่?

ขอบคุณ


1
คุณดูแผ่นข้อมูลสำหรับวิทยุ IC หรือไม่? แน่นอนว่ามีข้อมูลเพิ่มเติมเกี่ยวกับที่อยู่ไพพ์

1
ตรวจสอบเอกสาร RF24 API ได้openReadingPipe()ที่นี่: maniacbug.github.io/RF24/ …ระบุว่าคุณสามารถใช้ค่าใด ๆ สำหรับไบต์ที่อยู่สุดท้าย
jfpoilpret

ดังนั้นฉันจึงดูเอกสาร แต่ไม่ได้พูดถึงวิธีเลือกที่อยู่ไพพ์ มันแค่บอกว่าพวกเขาควรแบ่งปัน 32 บิตแรก ตัวอย่างเช่น 0xF0F0F0F0 (XX) 0x นับเป็นไบต์หรือไม่? หรือ F0F0F0F0 คือ 32 บิตที่สำคัญ? นอกจากนี้มันจะสำคัญไหมถ้าไม่ใช่ F0F0F0F0 ตราบใดที่ท่อแบ่งปัน 32 บิต สองไบต์สุดท้ายที่สำคัญ (XX) เป็นอย่างไร? คนเหล่านั้นเป็นใครหรือ?
Alex H

0x...คำนำหน้าเป็นเพียงการที่จะบอกค่าเป็นเลขฐานสิบหก นี่เป็นเพราะ 99 ในทศนิยมแตกต่างจาก 99 ในเลขฐานสิบหกถึงแม้ว่าพวกเขาจะดูเหมือนกัน ดังนั้นเราจึงใช้ 0x99 แทน
Gerben

2
รหัสที่คุณใช้รองรับรองรับได้เพียง 1 ท่อเท่านั้น nRF24L01 มี 2 ท่อที่ไม่ซ้ำกัน (0 และ 1) นอกจากนี้ยังมี 4 ท่อเพิ่มเติม (2, 3, 4 และ 5) ซึ่งคุณสามารถตั้งค่าไบต์ที่สำคัญน้อยที่สุดเท่านั้น ไบต์อื่น ๆ จะเหมือนกับท่อที่สอง (1)
Gerben

คำตอบ:


5

เนื่องจากคนส่วนใหญ่โพสต์แล้วค่าสำหรับไพพ์จะเป็นกฎเกณฑ์ แต่ต้องปฏิบัติตามกฎต่อ API:

ไพพ์ 1-5 ควรแชร์ 32 บิตแรก ไบต์ที่มีนัยสำคัญน้อยที่สุดเท่านั้นที่จะไม่ซ้ำกันเช่น

ก่อนที่ฉันจะตอบคำถามของคุณฉันคิดว่าจำเป็นต้องมีคำอธิบายเกี่ยวกับค่าเลขฐานสิบหกและทศนิยม

เลขฐานสิบหก 40 บิตเป็นการแทนจำนวนฐาน 16 ฐานสิบเป็นฐาน 10 ดังนั้นคุณสามารถแปลงค่าฐานสิบเป็นทศนิยม เนื่องจากขอบเขตของคำถามคุณสามารถ google ในการแปลงจากที่หนึ่งไปยังอีกที่หนึ่ง มีตัวแปลงออนไลน์บางตัว:

แปลง Hex เป็นทศนิยม

คุณจะเห็นเมื่อคุณแปลงค่า Hex เป็นทศนิยมนั่นเป็นเพียงการแสดงตัวเลข เมื่อคุณแปลงคุณวางและ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

ทุกคนควรทำงาน

ฉันไม่มีความเชี่ยวชาญใน hex เพราะฉันกำลังเรียนรู้ดังนั้นถ้าฉันไม่ถูกต้องแล้วโปรดใครบางคนที่ถูกต้องฉัน

ในที่สุดแผ่นข้อมูล nRF24L01 ทำให้ประเด็นต่อไปนี้ว่าการเลือกที่อยู่ไม่ได้เป็นไปตามอำเภอใจโดยสมบูรณ์:

หมายเหตุ: ที่อยู่ที่ระดับเลื่อนเพียงครั้งเดียว (นั่นคือ 000FFFFFFF) สามารถตรวจพบได้ด้วยเสียงรบกวนและสามารถให้การตรวจจับที่ผิดพลาดซึ่งอาจทำให้อัตราความผิดพลาดของแพ็กเก็ตเพิ่มขึ้น ที่อยู่เป็นความต่อเนื่องของคำนำ (การสลับแบบ hi-low) จะเพิ่มอัตราข้อผิดพลาดของแพ็คเก็ต


คุณช่วยกรุณาพูดถึงด้วยว่าท่อเหล่านั้นอ้างถึงคุณสมบัติ "6 data multi-receiver" เท่านั้น (s. Nordic แผ่นข้อมูล p39-40) โดยค่าเริ่มต้นเฉพาะ data pipe 0 และ 1 เท่านั้นที่เปิดใช้งาน

@bersch - มีความเกี่ยวข้องหรือไม่ OP ได้ถามว่าจะเลือกค่าไพพ์where the author is getting 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL?ได้อย่างไรไม่ใช่วิธีการใช้ไพพ์
PhillyNJ

ในการเลือกค่าคุณต้องทราบว่าโดยค่าเริ่มต้นจะมีไพพ์การเขียนและไพพ์การอ่าน ในโหมดมัลติผู้รับมีการเขียนและท่ออ่านสูงสุด 5 ท่อ คุณอธิบายเฉพาะการอ่านไปป์ จนถึงตอนนี้ฉันไม่ได้ตรวจสอบ แต่ฉันเชื่อว่าถ้าใครเลือกการอ่านและการเขียนไปป์ที่แชร์ 32 บิตแรกมันจะล้มเหลว

จากการทดสอบของฉันค่าต่าง ๆ ตามอำเภอใจตราบใดที่
ไพพ์

ฉันเห็น. สำหรับตัวฉันเองฉันไม่ได้ตรวจสอบคุณสมบัติตัวรับสัญญาณหลายตัว ฉันใช้ชิปแต่ละตัวสำหรับส่งและรับ

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
ฉันแก้ไขรหัสแล้ว คุณสามารถใช้ 'ไปป์' เหล่านี้เพื่อส่งได้ แต่อย่าลืม (เช่นฉัน) เพื่อแยกไพพ์นั้นออกจากการอ่าน
Faig
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.