pertanyaan pipa nRF24L01

9

Saya mencari-cari contoh kode yang ditemukan di sini . Saya tahu ada 6 pipa yang dapat digunakan modul nRF24L01 tapi saya sudah mencari di internet untuk penunjukan alamat dan tidak dapat menemukan apa pun. Lebih khusus pada baris 37, apakah ada referensi untuk tempat penulis mendapatkan 0xF0F0F0F0F0E1LL, 0xF0F0F0F0F0D2LL?

Terima kasih.

Alex H
sumber
1
Sudahkah Anda melihat lembar data untuk IC radio? Itu tentu memiliki informasi lebih lanjut tentang alamat pipa.
1
Periksa RF24 API doc untuk di openReadingPipe()sini: maniacbug.github.io/RF24/… itu menyebutkan Anda dapat menggunakan nilai apa pun untuk byte alamat terakhir.
jfpoilpret
Jadi saya mencari di dokumentasi tetapi tidak menyebutkan bagaimana alamat pipa dipilih. Itu hanya mengatakan mereka harus berbagi 32 bit pertama. Misalnya 0xF0F0F0F0 (XX), apakah 0x dihitung sebagai byte? Atau apakah F0F0F0F0 32 bit itu penting? Juga, apakah penting jika bukan F0F0F0F0 selama pipa berbagi 32 bit? Bagaimana dengan dua byte signifikan terakhir (XX)? Apakah itu sewenang-wenang juga?
Alex H
The 0x...prefix adalah hanya untuk memberitahu nilai dalam heksadesimal. Ini karena 99 dalam desimal berbeda dari 99 dalam heksadesimal, walaupun mereka terlihat sama. Jadi alih-alih kami menggunakan 0x99.
Gerben
2
Kode yang Anda gunakan hanya mendukung 1 pipa. NRF24L01 memiliki 2 pipa unik (0 dan 1). Ini juga memiliki 4 pipa tambahan (2, 3, 4 dan 5), di mana Anda hanya dapat mengatur byte paling signifikan. Byte lainnya akan sama dengan pipa kedua (1).
Gerben

Jawaban:

5

Karena sebagian besar orang telah memposting, nilai untuk pipa tersebut sewenang-wenang, tetapi harus mengikuti aturan per API:

Pipa 1-5 harus berbagi 32 bit pertama. Hanya byte terkecil yang harus unik, mis

Sebelum saya menjawab pertanyaan Anda, saya pikir diperlukan penjelasan tentang nilai Hex dan Desimal.

Heksadesimal 40 bit adalah representasi angka dari basis 16. Sebuah desimal adalah dari basis 10. Jadi Anda dapat mengonversi Nilai Hex menjadi Desimal. Karena ini di luar ruang lingkup untuk pertanyaan, Anda dapat google tentang cara mengkonversi dari satu ke yang lain. Ada beberapa konverter online:

Konverter Hex ke Desimal

Anda akan melihat ketika Anda mengonversi nilai Hex menjadi desimal, yang hanya berupa representasi angka. Saat Anda mengonversi, Anda menjatuhkan tanda 0xdan LL. Seperti yang dinyatakan 0xmenunjukkan nilai adalah nilai hex dan LLberarti tipe Long Long .

Jadi untuk menjawab pertanyaan Anda, gunakan konverter untuk menemukan nomor hex seperti:

F0F0F0F0A1
F0F0F0F0A2
F0F0F0F0B4
F0F0F0F0E9

Cukup ganti 2 digit terakhir (paling tidak sedikit):

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

Tambahkan 0xdanLL

0xF0F0F0F0A1LL
0xF0F0F0F0A2LL
0xF0F0F0F0B4LL
0xF0F0F0F0E9LL

Semua harus bekerja.

Saya bukan ahli hex, seperti yang saya pelajari, jadi jika saya salah, maka tolong seseorang memperbaikinya.

Akhirnya, lembar data nRF24L01 membuat poin berikut bahwa pilihan alamat tidak sepenuhnya arbitrer:

Catatan: Alamat di mana level hanya bergeser satu kali (yaitu, 000FFFFFFF) sering dapat dideteksi dalam derau dan dapat memberikan deteksi palsu, yang dapat memberikan Tingkat Kesalahan Paket yang meningkat. Alamat sebagai kelanjutan dari pembukaan (beralih rendah) juga meningkatkan Tingkat Kesalahan Paket.

PhillyNJ
sumber
dapatkah Anda sebutkan juga, bahwa pipa-pipa itu hanya merujuk ke fitur "6 data multi-receiver" (s. Nordic datasheet hal 39-40). secara default hanya pipa data 0 dan 1 yang diaktifkan.
@bersch - Apakah itu relevan? OP bertanya bagaimana nilai pipa dipilih misalnya where the author is getting 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL?, bukan bagaimana pipa digunakan.
PhillyNJ
Untuk memilih nilai, Anda perlu tahu bahwa secara default ada pipa tulis dan pipa baca. Dalam mode multi-penerima ada tulisan dan hingga 5 pipa membaca. Anda hanya menggambarkan pipa bacaan. Sejauh ini saya tidak memeriksa itu, tetapi saya percaya jika seseorang memilih pipa membaca dan menulis yang berbagi 32 bit pertama, itu akan gagal.
Dari pengujian saya, nilainya berubah-ubah selama pipa 0 & 1 Anda sama pada Transmitter dan receiver
PhillyNJ
Saya melihat. Untuk saya sendiri saya tidak memeriksa fitur multi-receiver. Saya menggunakan setiap chip untuk mengirim dan menerima.
2

Nilai 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL- nilai ini adalah nilai yang berubah-ubah dan menentukan alamat pengirim dan penerima untuk diajak bicara.

Jika Anda menggunakan perpustakaan Mirf

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

mereka juga bisa seperti string serv1.

RF24 menggunakan

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

sumber
1

Ada sesuatu yang semua orang lupa untuk memberi tahu Anda:

Pipa pada penerima harus dipersingkat setelah yang pertama

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

Pipa pada pemancar seharusnya

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

Jika Anda ingin tahu pesan pipa mana yang telah datang, gunakan

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

Juga pipa nomor 6 digunakan untuk menerima pesan yang diakui .

Selain itu, kode inisialisasi harus memiliki Yang radio.enableDynamicPayloads(); ini berfungsi dengan baik untuk saya:

    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

Semoga berhasil...

Faig
sumber
apa yang pipedidefinisikan seperti dalam contoh Anda?
x29a
1
Saya telah mengedit kode. Anda dapat menggunakan 'pipa' ini untuk mengirim, tetapi jangan lupa (seperti saya) untuk mengecualikan pipa itu dari membaca.
Faig