câu hỏi ống nRF24L01


9

Tôi đang xem qua mã ví dụ được tìm thấy ở đây . Tôi biết có 6 đường ống mà mô-đun nRF24L01 có thể sử dụng nhưng tôi đã tìm kiếm trên internet các ký hiệu địa chỉ và không thể tìm thấy gì. Cụ thể hơn trên dòng 37, có một tài liệu tham khảo cho nơi mà tác giả đang nhận 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL không?

Cảm ơn.


1
Bạn đã xem bảng dữ liệu cho IC radio chưa? Điều đó chắc chắn có nhiều thông tin về địa chỉ đường ống.

1
Kiểm tra tài liệu API RF24 openReadingPipe()tại đây: maniacorms.github.io/RF24/ khuyên nó có thể sử dụng bất kỳ giá trị nào cho byte địa chỉ cuối cùng.
jfpoilpret

Vì vậy, tôi đã xem qua các tài liệu nhưng nó không đề cập đến cách chọn địa chỉ đường ống. Nó chỉ nói rằng họ nên chia sẻ 32 bit đầu tiên. Ví dụ 0xF0F0F0F0 (XX), 0x có được tính là một byte không? Hay F0F0F0F0 là 32 bit quan trọng? Ngoài ra, có vấn đề gì không nếu F0F0F0F0 không phải là miễn là các ống chia sẻ 32 bit đó? Làm thế nào về hai byte đáng kể cuối cùng (XX)? Là những người tùy tiện là tốt?
Alex H

Các 0x...tiền tố là chỉ để nói lên giá trị trong hệ thập lục phân. Điều này là do 99 trong số thập phân khác với 99 trong thập lục phân, mặc dù chúng trông giống nhau. Vì vậy, thay vì chúng tôi sử dụng 0x99.
Gerben

2
Mã bạn sử dụng chỉ hỗ trợ 1 ống. NRF24L01 có 2 ống duy nhất (0 và 1). Nó cũng có 4 ống bổ sung (2, 3, 4 và 5), trong đó bạn chỉ có thể đặt byte ít quan trọng nhất. Các byte khác sẽ giống như ống thứ hai (1).
Gerben

Câu trả lời:


5

Như hầu hết mọi người đã đăng, các giá trị cho đường ống là tùy ý, nhưng phải tuân theo các quy tắc cho mỗi API:

Ống 1-5 nên chia sẻ 32 bit đầu tiên. Chỉ có byte quan trọng nhất phải là duy nhất, vd

Trước khi tôi trả lời câu hỏi của bạn, tôi nghĩ cần có lời giải thích về các giá trị Hex và Decimal.

Hệ thập lục phân 40 bit là biểu diễn số của cơ sở 16. Một số thập phân là cơ sở 10. Vì vậy, bạn có thể chuyển đổi Giá trị Hex thành Số thập phân. Vì đây là ngoài phạm vi cho câu hỏi, bạn có thể google về cách chuyển đổi từ cái này sang cái khác. Có một số bộ chuyển đổi trực tuyến:

Chuyển đổi từ thập phân sang thập phân

Bạn sẽ thấy khi bạn chuyển đổi giá trị Hex thành số thập phân, đó chỉ là biểu diễn số. Khi bạn chuyển đổi, bạn thả 0xLL. Như đã nêu, 0xgiá trị này là giá trị hex và LLcó nghĩa là loại Long Long .

Vì vậy, để trả lời câu hỏi của bạn, hãy sử dụng trình chuyển đổi để tìm số hex như:

F0F0F0F0A1
F0F0F0F0A2
F0F0F0F0B4
F0F0F0F0E9

Chỉ cần thay đổi 2 chữ số cuối (bit đáng kể nhất):

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

Thêm 0xLL

0xF0F0F0F0A1LL
0xF0F0F0F0A2LL
0xF0F0F0F0B4LL
0xF0F0F0F0E9LL

Tất cả nên làm việc.

Tôi không phải là chuyên gia về hex, vì tôi đang học, vì vậy nếu tôi không chính xác, xin vui lòng ai đó sửa tôi.

Cuối cùng, biểu dữ liệu nRF24L01 đưa ra điểm sau đây rằng việc lựa chọn địa chỉ không hoàn toàn tùy ý:

Lưu ý: Địa chỉ mà mức dịch chuyển chỉ một lần (nghĩa là 000FFFFFFF) thường có thể được phát hiện trong tiếng ồn và có thể phát hiện sai, có thể đưa ra Tỷ lệ lỗi gói tăng. Các địa chỉ như là sự tiếp nối của phần mở đầu (bật thấp thấp) cũng làm tăng Tỷ lệ Lỗi Gói.


bạn có thể đề cập thêm không, rằng những đường ống đó chỉ đề cập đến tính năng "6 máy thu đa dữ liệu" (s. Bảng dữ liệu Bắc Âu p39-40). theo mặc định, chỉ có ống dữ liệu 0 và 1 được bật.

@bersch - Có liên quan không? OP đã hỏi làm thế nào các giá trị đường ống được chọn where the author is getting 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL?, ví dụ , không phải cách sử dụng các đường ống.
PhillyNJ

Để chọn các giá trị, bạn cần biết rằng theo mặc định, có một ống viết và một ống đọc. Trong chế độ đa máy thu có một chữ viết và tối đa 5 ống đọc. Bạn chỉ mô tả các ống đọc. Cho đến nay tôi đã không kiểm tra điều đó, nhưng tôi tin rằng nếu ai đó chọn ống đọc và viết chia sẻ 32 bit đầu tiên, nó sẽ thất bại.

Từ thử nghiệm của tôi, các giá trị là tùy ý miễn là ống 0 & 1 của bạn giống nhau trên Máy phát và máy thu
PhillyNJ

Tôi hiểu rồi. Đối với bản thân tôi, tôi đã không kiểm tra tính năng đa máy thu. Tôi sử dụng mỗi chip để truyền và nhận.

2

Các giá trị 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LLlà các giá trị tùy ý và xác định địa chỉ của người gửi và người nhận để nói chuyện.

Nếu bạn sử dụng thư viện Mirf

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

chúng cũng có thể là chuỗi như thế serv1.

RF24 sử dụng

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

1

Có một cái gì đó mà mọi người quên nói với bạn:

Các ống tại máy thu nên được rút ngắn sau cái đầu tiên

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

Ống tại máy phát nên

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

Nếu bạn muốn biết tin nhắn của đường ống nào đã đến, hãy sử dụng

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

Ngoài ra ống số 6 được sử dụng để nhận tin nhắn xác nhận .

Ngoài ra, mã khởi tạo phải có radio.enableDynamicPayloads(); Cái này hoạt động tốt với tôi:

    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

Chúc may mắn...


những gì pipeđược định nghĩa như trong ví dụ của bạn?
x29a

1
Tôi đã chỉnh sửa mã. Bạn có thể sử dụng bất kỳ 'đường ống' nào để gửi, nhưng đừng quên (như tôi) để loại trừ đường ống đó khỏi việc đọc.
Faig
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.