nRF24L01パイプの質問


9

ここにあるサンプルコードを調べています。nRF24L01モジュールが使用できるパイプが6つあることは知っていますが、インターネットでアドレス指定を検索してみましたが、何も見つかりませんでした。より具体的には、37行目に、作成者が0xF0F0F0F0E1LL、0xF0F0F0F0D2LLを取得している場所への参照はありますか?

ありがとう。


1
無線ICのデータシートを見ましたか?それは確かにパイプアドレスに関するより多くの情報を持っています。

1
openReadingPipe()ここのRF24 APIドキュメントを確認してください:maniacbug.github.io/RF24/…最後のアドレスバイトには任意の値を使用できると記載されています。
jfpoilpret 2014年

だから私はドキュメントを調べましたが、それはパイプアドレスがどのように選択されるかについては言及していません。最初の32ビットを共有する必要があるというだけです。たとえば、0xF0F0F0F0(XX)の場合、0xはバイトとしてカウントされますか?または、F0F0F0F0は重要な32ビットですか?また、パイプがそれらの32ビットを共有している限り、F0F0F0F0でなくても問題ありませんか?最後の2つの有効バイト(XX)はどうですか?それらも恣意的ですか?
Alex H

0x...プレフィックスはちょうど進数である値を伝えることです。これは、10進数の99が同じに見えても、16進数の99とは異なるためです。したがって、代わりに0x99を使用します。
Gerben

2
使用しているコードは1つのパイプのみをサポートします。nRF24L01には2つの固有のパイプ(0と1)があります。また、4つの追加パイプ(2、3、4、5)があり、最下位バイトのみを設定できます。他のバイトは2番目のパイプ(1)と同じになります。
Gerben 2014年

回答:


5

ほとんどの人が投稿したように、パイプの値は任意ですが、APIごとのルールに従う必要があります。

パイプ1〜5は最初の32ビットを共有する必要があります。最下位バイトのみが一意である必要があります。

質問に答える前に、16進数と10進数の値の説明が必要だと思います。

40ビットの16進数は16進数の数値表現です。10進数は10進数です。したがって、16進数値を10進数に変換できます。これは質問の対象外であるため、ある方法から別の方法に変換する方法についてグーグルできます。いくつかのオンラインコンバータがあります:

16進数から10進数へのコンバータ

16進数値を10進数に変換すると、それは単なる数値表現であることがわかります。変換するときは、0xおよびをドロップしますLL。前述のとおり、0xは値が16進値であることを示し、LLタイプLong Long意味します。

したがって、質問に答えるには、コンバーターを使用して次のような16進数を見つけます。

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

追加0xLL

0xF0F0F0F0A1LL
0xF0F0F0F0A2LL
0xF0F0F0F0B4LL
0xF0F0F0F0E9LL

すべて動作するはずです。

私は学んでいるので、ヘックスの専門家ではありません。したがって、もし私が正しくない場合は、誰かが私を訂正してください。

最後に、nRF24L01データシートは、アドレスの選択が完全に恣意的ではないことを次のように述べています。

注:レベルが1回だけシフトするアドレス(つまり、000FFFFFFF)は、ノイズで検出されることが多く、誤検出が発生する可能性があり、パケットエラー率が高くなる可能性があります。プリアンブルの継続(高低トグル)としてのアドレス指定も、パケットエラー率を上げます。


また、これらのパイプは「6データマルチレシーバー」機能(s。Nordicデータシートp39-40)のみを参照していることにも触れてください。デフォルトでは、データパイプ0と1のみが有効になっています。

@bersch-関連していますか?OPはwhere the author is getting 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL?、パイプの使用方法ではなく、パイプ値の選択方法などを尋ねていました。
PhillyNJ 2014

値を選択するには、デフォルトで書き込みパイプと読み取りパイプがあることを知る必要があります。マルチレシーバーモードでは、書き込みパイプと最大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 2018

1
コードを編集しました。これらの「パイプ」はどれでも送信に使用できますが、(私のように)そのパイプを読み取りから除外することを忘れないでください。
Faig
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.