nRF24L01 boru sorusu


9

Burada bulunan örnek kodu bakıyorum . NRF24L01 modülünün kullanabileceği 6 boru olduğunu biliyorum ama adres tanımlamaları için internette arama yaptım ve hiçbir şey bulamadım. Daha spesifik olarak 37. satırda, yazarın 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL aldığı yer için bir referans var mı?

Teşekkürler.


1
Radyo IC veri sayfasına baktınız mı? Bunun kesinlikle boru adresleri hakkında daha fazla bilgi var.

1
RF24 API belgesini openReadingPipe()buradan kontrol edin : maniacbug.github.io/RF24/… son adres baytı için herhangi bir değer kullanabileceğinizden bahseder.
jfpoilpret

Bu yüzden belgelere baktım, ancak boru adresinin nasıl seçildiğinden bahsetmiyor. Sadece ilk 32 biti paylaşmaları gerektiğini söylüyor. Örneğin 0xF0F0F0F0 (XX), 0x bayt olarak sayılır mı? Yoksa F0F0F0F0 önemli olan 32 bit mi? Ayrıca, borular bu 32 biti paylaştığı sürece F0F0F0F0 olmaması önemli midir? Son iki önemli bayta (XX) ne dersiniz? Bunlar da keyfi mi?
Alex H

0x...Önek sadece değer onaltılık olduğunu anlatmaktır. Bunun nedeni, ondalık sayıdaki 99'un aynı görünseler bile onaltılık sayıdaki 99'dan farklı olmasıdır. Bunun yerine 0x99 kullanıyoruz.
Gerben

2
Kullandığınız kod sadece 1 boruyu destekler. NRF24L01, 2 benzersiz boruya (0 ve 1) sahiptir. Ayrıca, yalnızca en az anlamlı baytı ayarlayabileceğiniz 4 ek boruya (2, 3, 4 ve 5) sahiptir. Diğer baytlar, ikinci boru (1) ile aynı olacaktır.
Gerben

Yanıtlar:


5

İnsanların çoğunun yayınladığı gibi, borunun değerleri isteğe bağlıdır, ancak API başına kurallara uymalıdır:

1-5 numaralı borular ilk 32 biti paylaşmalıdır. Yalnızca en az önemli bayt benzersiz olmalıdır, ör.

Sorunuza cevap vermeden önce, Onaltılık ve Ondalık değerler hakkında bir açıklama yapılması gerektiğini düşünüyorum.

40 bit onaltılık taban 16'nın bir sayı temsilidir. Ondalık taban 10'dur. Böylece Onaltılık Değeri Ondalık'a dönüştürebilirsiniz. Bu sorunun kapsamı dışında olduğundan, Google'dan birinden diğerine nasıl dönüştürebileceğiniz konusunda Google'a gidebilirsiniz. Bazı çevrimiçi dönüştürücüler var:

Hex - Ondalık Dönüştürücü

Onaltılık değeri ondalık sayıya dönüştürdüğünüzde, bunun yalnızca bir sayı temsilidir. Dönüştürdüğünüzde, 0xve işaretini bırakırsınız LL. Belirtildiği gibi, 0xdeğer bir altıgen değer ve olduğunu gösterir LLaraçlar uzun uzun tip .

Sorunuzu cevaplamak için, aşağıdaki gibi onaltılık bir sayı bulmak için dönüştürücü kullanın:

F0F0F0F0A1
F0F0F0F0A2
F0F0F0F0B4
F0F0F0F0E9

Sadece son 2 haneyi değiştirin (en az anlamlı bit):

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

ekle 0xveLL

0xF0F0F0F0A1LL
0xF0F0F0F0A2LL
0xF0F0F0F0B4LL
0xF0F0F0F0E9LL

Herkes işe yaramalı.

Onaltılık konusunda uzman değilim, öğrendiğim gibi, eğer yanlışsam, lütfen biri beni düzeltin.

Son olarak, nRF24L01 veri sayfası aşağıdaki adres seçiminin tamamen keyfi olmadığını gösterir:

Not: Seviyenin yalnızca bir kez değiştiği (yani 000FFFFFFF) gürültüde genellikle tespit edilebildiği ve yükseltilmiş bir Paket Hata Oranı verebilecek yanlış bir algılama verebileceği adresler. Önsözün devamı (yüksek-düşük geçiş) gibi adresler de Paket Hata Oranını yükseltir.


Ayrıca, bu boruların sadece "6 veri çoklu alıcı" özelliğine (s. Nordic veri sayfası p39-40) atıfta bulunduğunu da söyleyebilir misiniz? varsayılan olarak yalnızca veri kanalı 0 ve 1 etkindir.

@bersch - Alakalı mı? OP, boru değerlerinin nasıl seçildiğini, örneğin where the author is getting 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL?boruların nasıl kullanıldığını soruyordu .
PhillyNJ

Değerleri seçmek için, varsayılan olarak bir yazma borusu ve bir okuma borusu olduğunu bilmeniz gerekir. Çoklu alıcı modunda bir yazma ve 5 adede kadar okuma borusu vardır. Sadece okuma borularını tanımlarsınız. Şimdiye kadar bunu kontrol etmedim, ancak ilk 32 biti paylaşan okuma ve yazma borusunu seçerse, başarısız olacağına inanıyorum.

Testlerimden itibaren, 0 ve 1
borunuz

Anlıyorum. Kendim için çoklu alıcı özelliğini kontrol etmedim. Her bir çipi iletim ve alım için kullanıyorum.

2

Değerler 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LLkeyfi değerlerdir ve konuşacak gönderen ve alıcıların adreslerini tanımlar.

Mirf kütüphanesini kullanıyorsanız

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

onlar gibi dizeleri de olabilir serv1.

RF24 kullanımları

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

1

Herkesin size söylemeyi unuttuğu bir şey var:

Alıcıdaki borular ilkinden sonra kısaltılmalıdır

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

De borular verici olmalıdır

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

Hangi borunun mesajının geldiğini bilmek istiyorsanız,

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

Ayrıca onay numarası almak için 6 numaralı boru kullanılır .

Ayrıca, başlatma kodunun radio.enableDynamicPayloads(); Bu kodun benim için iyi çalışması gerekir :

    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

İyi şanslar...


neyin pipesizin örnekte olduğu gibi tanımlanır?
x29a

1
Kodu düzenledim. Göndermek için bu 'borulardan' herhangi birini kullanabilirsiniz, ancak o boruyu okuma dışında bırakmayı (benim gibi) unutmayın.
Faig
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.