2 つ以上の Arduino ボードが相互にワイヤレス通信できるようになると、センサー データのリモート監視、ロボット制御、ホームオートメーションなど、多くの可能性が広がります。 また、安価で信頼性の高い 2 ウェイ RF ソリューションを実現するために、Nordic Semiconductor 社の nRF24L01+ トランシーバー モジュールに勝るものはありません。
nRF24L01+ (plus) トランシーバー モジュールはオンラインでしばしば 2 ドル未満で入手でき、最も安価なデータ通信オプションの 1 つとなっています。
- ハードウェア概要
- 無線周波数
- 2.4GHz帯ISMバンドとは?
- SPI Interface
- nRF24L01+ モジュール 対 nRF24L01+ PA/LNA モジュール
- RF チャネル周波数
- nRF24L01+ Multiceiver Network
- Enhanced ShockBurst Protocol
- nRF24L01+ Automatic Packet Handling
- nRF24L01+ トランシーバー モジュールのピンアウト
- 配線 – nRF24L01+ トランシーバー モジュールを Arduino UNO に接続
- RF24 Arduino Library for nRF24L01+ Module
- Arduino Code – For Transmitter
- Arduino Code – For Receiver
- nRF24L01+ トランシーバー モジュールの範囲の改善
- 電源ノイズの低減
- チャネル周波数を変更する
- 低データレート
- レシーバー (Rx) 感度の意味
- Higher Output Power
ハードウェア概要
無線周波数
nRF24L01+ トランシーバー モジュールは 2.4 GHz 世界 ISM 周波数帯で動作するよう設計されており、データ伝送に GFSK 変調を使用します。
2.4GHz帯ISMバンドとは?
2.4GHz帯は、産業、科学、医療(ISM)バンドの1つで、無許可の低電力デバイスの使用のために国際的に予約されたバンドです。
(*SNRは信号の量に対するノイズの量で単位はdB[デシベル]で表記)
(*SNRは信号の量に対するノイズの量で単位はdB[デシベル]で表記)
2.4GHz帯のノイズは、信号の量に対するノイズの量で単位はdB[デシベル]で表記。
(*SNRは信号の量に対するノイズの量で単位はdBm)、
(*SNRが0.1dB未満の端数は切り捨て、0.1dB未満の端数は切り捨て)。 そして何より、スタンバイモードでは26μA、パワーダウンモードでは900nAの消費電力を実現しています。 そのため、低消費電力アプリケーションに最適な無線デバイスとなっています。
SPI Interface
nRF24L01+トランシーバー・モジュールは、4ピンのシリアル・ペリフェラル・インターフェース(SPI)で通信し、最大データレートは10Mbpsとなります。 周波数チャネル (選択可能な125チャネル)、出力電力 (0 dBm、-6 dBm、-12 dBm、または -18 dBm)、データレート (250kbps、1Mbps、または 2 Mbps) などすべてのパラメータは、SPIインターフェイスを介して設定できます。 I2Cバスとは異なり、SPIバスのスレーブ数は制限されており、Arduino Unoでは、最大2つのSPIスレーブ、つまり2つのnRF24L01+トランシーバー・モジュールを使用することが可能です。4 GHz ISM Band
1.9 V~3.6 V
nRF24L01+ モジュール 対 nRF24L01+ PA/LNA モジュール
nRF24L01+ チップをベースにしたさまざまなモジュールが用意されています。
最初のバージョンでは、オンボード アンテナを使用します。 これにより、ブレークアウトをよりコンパクトにすることができます。 しかし、アンテナが小さくなった分、通信距離が短くなります。 このバージョンでは、100メートルの距離で通信することができるようになります。 もちろん、それは屋外の開けた場所での話です。
2 番目のバージョンにはSMAコネクタとダックアンテナが付いていますが、これは本当の違いではありません。 この機能は、頻繁に使用するアプリケーションをキャッシュすることにより、システムのパフォーマンスと応答性を向上させます。
(*SNRは信号の量に対するノイズの量で単位はdB[デシベル]で表されます。 nRF24L01+チップから送信される信号の電力を単に増加させるだけです。 一方、LNAはLow-Noise Amplifierの略で、低ノイズアンプです。 LNA の機能は、
アンテナからの非常に弱い、不確実な信号(通常マイクロボルトのオーダーまたは -100 dBm 以下)を、より役立つレベル(通常約 0.5%)に増幅することにあります。5 ~ 1V)
受信パスのローノイズアンプ(LNA)と送信パスのパワーアンプ(PA)は、デュプレクサを介してアンテナに接続し、2 つの信号を分離して、比較的強力な PA 出力が高感度の LNA 入力にオーバーロードするのを防止しています。 詳細については、digikey.com
この相違点を除き、どちらのモジュールもドロップイン互換です。
RF チャネル周波数
nRF24L01+ トランシーバー モジュールは、チャネルと呼ばれる特定の周波数でデータの送受信を行います。 また、2つ以上のトランシーバー・モジュールが互いに通信するためには、同じチャンネルであることが必要です。 このチャネルは、2.4 GHz ISM バンド内の任意の周波数、より正確には 2.400 ~ 2.525 GHz(2400 ~ 2525 MHz)である可能性があります。 このため、1MHz間隔で125のチャネルが可能です。
250kbpsと1Mbpsのデータレートでは、チャネルは1MHz以下の帯域幅を占めます。 しかし、2Mbpsのデータレートでは、2MHzの帯域幅を占有します(RFチャネル周波数設定の分解能より広い)。 そのため、2Mbpsモードでは、チャネルが重ならないようにし、クロストークを低減するために、2つのチャネル間に2MHzの間隔を確保する必要があります。
選択したチャンネルのRFチャンネル周波数は、以下の式によって設定されます。
Freq(Selected) = 2400 + CH(Selected)
例えば、データ通信のために108をチャンネルとして選択すると、チャンネルのRFチャンネル周波数は2508MHz (2400 + 108)
nRF24L01+ Multiceiver Network
nRF24L01+はMulticeiverという機能を備えています。 Multiple Transmitters Single Receiverの略です。 この機能では、各RFチャネルは論理的にデータ・パイプと呼ばれる6つの並列データ・チャネルに分割されます。 つまり、データパイプは物理的なRFチャネルの中の論理的なチャネルです。 各データパイプはそれぞれ物理アドレス(Data Pipe Address)を持ち、設定することができます。
上の図を簡単にするために、一次受信機がハブ受信機として、6 つの送信ノードから同時に情報を集めると想像してください。 ハブ受信機はいつでもリッスンを停止して、送信機として動作することができます。
Enhanced ShockBurst Protocol
nRF24L01+ トランシーバー モジュールは、Enhanced ShockBurst として知られるパケット構造を使用します。 このシンプルなパケット構造は、下図に示すように、5 つのフィールドに分かれています。 強化された ShockBurst は、新しく導入されたパケット制御フィールド (PCF) を使用して、より高度な通信のためのより大きな機能をもたらしました。 これは、ペイロードが 1 バイトから 32 バイトまで変化することを意味します。
次に、各送信パケットにパケット ID を提供し、受信デバイスがメッセージが新しいものか、再送信されたものか (従って無視できるもの) を判断できるようにします。
最後に、最も重要なことですが、各メッセージは、他のデバイスによって受信されたときに送信される確認応答を要求できます。
nRF24L01+ Automatic Packet Handling
では、2 つの nRF24L01+ モジュールが互いにどのように取引するかをよりよく理解するため、3 つのシナリオを説明しましょう。
Transaction with acknowledgement and interruptこれは、ポジティブシナリオの例です。 ここでは、送信機が受信機にデータパケットを送信することによって通信を開始します。 パケット全体が送信されると、アクノリッジメント・パケット(ACKパケット)の受信を(約130μs)待ちます。 受信機はパケットを受信すると、ACKパケットを送信機に送ります。 ACKパケットを受信すると、送信機は新しいデータが利用できることを示すために割り込み(IRQ)信号をアサートします。
Transaction with data packet lostこれは、送信パケットの損失により再送が必要となる負のシナリオであり、この場合は、再送信のために、パケットが失われたことを示します。 パケットを送信した後、送信機はACKパケットを受信するのを待ちます。 送信機は、自動再送信遅延(ARD)時間内にそれを取得しない場合、パケットを再送信する。 9625>
Transaction with acknowledgement lostこれは再びACKパケットの損失によって再送信が必要となるネガティブシナリオである。 ここでは、受信者が最初の試みでパケットを受信しても、ACKパケットの損失のために、送信者は受信者がまったくパケットを取得していないと考えています。 そこで、自動再送信遅延時間が経過した後、パケットを再送信します。 このパケット処理は、マイクロコントローラを介さずに、nRF24L01+が自動的に行います。
nRF24L01+ トランシーバー モジュールのピンアウト
nRF24L01+ トランシーバー モジュールの両方のバージョンについて、ピンアウトを確認しましょう。 他のピンを識別するための基準として使用できるように、通常、ピンを四角で囲むことによってマークされます。 1.9~3.9ボルトの範囲で使用できます。 Arduinoの3.3V出力に接続することができます。 5Vピンに接続すると、nRF24L01+モジュールが壊れる可能性があることを忘れないでください!
CE (Chip Enable) は、アクティブHIGHピンです。 選択された場合、nRF24L01 は、現在どのモードにあるかによって、送信または受信を行います。
CSN (Chip Select Not) は、アクティブ-ローピンで、通常はハイのままです。
SCK (Serial Clock) は、SPI バスマスターから供給されるクロックパルスを受け取ります。
MOSI (Master Out Slave In) は、nRF24L01 への SPI 入力、
MISO (Master In Slave Out) は nRF24L01 から SPI 出力です。
IRQ は、新しいデータが処理可能になったときにマスターに警告する割り込みピンです。
配線 – nRF24L01+ トランシーバー モジュールを Arduino UNO に接続
nRF24L01+トランシーバー モジュールの動作について完全に理解したので、Arduino に接続しましょう! nRF24L01+ トランシーバー モジュールを Arduino に接続する方法は、次のとおりです。
まず、モジュールのVCCピンをArduinoの3.3Vに、GNDピンをグランドに接続します。 CSNとCEピンは、Arduinoのどのデジタルピンにも接続することができます。 ここでは、デジタルピン#8と#9にそれぞれ接続されています。 nRF24L01+トランシーバは多くのデータ転送を必要とするため、マイコン上のハードウェアSPIピンに接続すると、最高のパフォーマンスを発揮することができます。 ハードウェア SPI ピンは、別のピンのセットを使用してインターフェイス コードを「ビッドバンギング」するよりもはるかに高速です。 UNO/Nano V3.0などのArduinoボードでは、これらのピンはデジタル13 (SCK)、12 (MISO)、11 (MOSI)です。 Megaの場合は、デジタル50(MISO)、51(MOSI)、52(SCK)、53(SS)を使用することになります。 下表を参考にしてください。
mosi | miso | sck | |
11 | 12 | 13 | |
Arduino Nano | 11 | 12 | 13 |
Arduino Mega | 51 | 50 | 52 |
上記以外のArduinoボードで使用した場合についてです。 Arduinoの公式ドキュメントを確認しながら進めるとよいでしょう。
Remember ! この回路は2つ作る必要があります。 1つは送信機として、もう1つは受信機として機能します。
すべて接続したら、準備は完了です!
RF24 Arduino Library for nRF24L01+ Module
nRF24L01+トランシーバーモジュールとのインターフェースは大変ですが、幸運にも、多くのライブラリが利用可能です。 人気のあるライブラリの1つが RF24 です。 このライブラリは数年前から存在しています。 初心者が使うには簡単ですが、上級者向けには多くの機能を備えています。 この実験では、同じライブラリを使用します。
GF24 GitHub リポジトリのフォークから最新バージョンのライブラリをダウンロードするか、このボタンをクリックして zip をダウンロードすることができます。
インストールするには、Arduino IDEを開き、Sketch > Include Library > Add .ZIP Libraryに進み、ダウンロードしたRF24-masterファイルを選択します。
Arduino Code – For Transmitter
この実験では、送信機から受信機に従来の ‘Hello World’ メッセージを送信します。
以下は、送信機に使用するスケッチです。 SPI.h ライブラリは SPI 通信を処理し、nRF24L01.h と RF24.h はモジュールを制御します。
//Include Libraries#include <SPI.h>#include <nRF24L01.h>#include <RF24.h>
次に、RF24 オブジェクトを作成する必要があります。
//create an RF24 objectRF24 radio(9, 8); // CE, CSN
次に、2つのnRF24L01+モジュールが通信するためのパイプアドレスを表すバイト配列を作成する必要があります。 このアドレスは、ネットワーク上に数台のモジュールがある場合に必要です。
次にセットアップ関数です。radio.begin()
を使って無線オブジェクトを初期化し、radio.openWritingPipe()
関数を使って送信機のアドレスを設定します。
//set the addressradio.openWritingPipe(address);
最後に、モジュールを送信機として設定するradio.stopListening()
関数を使用します。
//Set module as transmitterradio.stopListening();
ループセクションでは:文字の配列を作成し、そこにメッセージ「Hello World」を代入しています。 radio.write()
関数を使って、そのメッセージを受信機に送ります。 最初の引数は、送信したいメッセージです。 9625>
const char text = "Hello World";radio.write(&text, sizeof(text));
この方法では、一度に32バイトまで送信することができます。 これはnRF24L01+が扱える1つのパケットの最大サイズだからです。 受信者がデータを受け取ったことを確認する必要がある場合、radio.write()
メソッドはbool
値を返します。 TRUEを返した場合、データは受信機に届いたことになります。 FALSE を返した場合、データは失われました。
radio.write() 関数は、肯定応答を受信するか、再送信のすべての試行を使い果たすまでプログラムをブロックします。
Arduino Code – For Receiver
以下は受信機に使用するスケッチです
//Include Libraries#include <SPI.h>#include <nRF24L01.h>#include <RF24.h>//create an RF24 objectRF24 radio(9, 8); // CE, CSN//address through which two modules communicate.const byte address = "00001";void setup(){ while (!Serial); Serial.begin(9600); radio.begin(); //set the address radio.openReadingPipe(0, address); //Set module as receiver radio.startListening();}void loop(){ //Read the data if available in buffer if (radio.available()) { char text = {0}; radio.read(&text, sizeof(text)); Serial.println(text); }}
このプログラムはいくつかの変更を除いて送信機のプログラムに非常に似ています
設定機能の始めに、シリアル通信を開始しています。 次にradio.setReadingPipe()
関数で送信機と同じアドレスを設定し、送信機と受信機の通信を可能にします。
//set the address radio.openReadingPipe(0, address);
最初の引数はストリームの番号です。 異なるアドレスに応答するストリームを最大6個まで作成することができます。 第2引数はストリームが反応してデータを収集するアドレスです。
次に、モジュールをレシーバーとして設定し、データの受信を開始する必要があります。 そのためにradio.startListening()
関数を使用します。
//Set module as receiver radio.startListening();
ループ関数で、指定したアドレスに送られるデータを待ちます。 スケッチでは、radio.available()
メソッドを使って、アドレスにデータが到着したかどうかをチェックします。
if (radio.available()) { char text = {0}; radio.read(&text, sizeof(text)); Serial.println(text); }
データを受信した場合、ゼロで埋められた32文字の配列を作成します(後で受信したデータで埋めます)。 データを読み込むには、radio.read (& text, sizeof (text)) というメソッドを使用します。
最後に、受信したメッセージをシリアルモニタに表示します。
nRF24L01+ トランシーバー モジュールの範囲の改善
無線通信システムにとって重要なパラメーターは通信範囲です。 多くの場合、RFソリューションを選択する際の決め手となります。
電源ノイズの低減
無線周波数(RF)信号を生成するRF回路は、電源ノイズに非常に敏感です。 制御しない場合、電源ノイズは取得できる範囲を大幅に縮小します。
電源が独立したバッテリーでない限り、電源の生成に関連するノイズが存在する可能性が高いです。 このノイズがシステムに侵入するのを防ぐため、nRF24L01+モジュールの物理的にできるだけ近くに、電源ラインを横切る10 µfのフィルターコンデンサを配置することをお勧めします。
最も簡単な方法は、非常に安価な nRF24L01 用のアダプター モジュールを使用することです。
アダプター モジュールには 8 ピン メス コネクタがあり、nRF24L01 モジュールに差し込むことが可能です。 先ほど説明した、アンテナ内蔵モジュールと外部アンテナ(PA/LNA)付きモジュールの両方に対応可能です。 また、SPIおよび割り込み接続用の6ピン・オスコネクタと電源入力用の2ピン・コネクタがあります。
アダプター・モジュールは、独自の3.3ボルト電圧レギュレータとフィルター・コンデンサのセットを備えているので、5ボルトの電源で動作させることが可能です。
チャネル周波数を変更する
RF回路にとってもう1つの潜在的なノイズ源は、外部環境、特に同じチャネルに設定された近隣のネットワークや他の電子機器からの干渉です。
低データレート
nRF24L01+は、250Kbpsの速度で最高の受信感度(-94dBm)を提供します。 しかし、データレートが2MBpsになると、受信感度は-82dBmに低下します。 250Kbpsの受信感度は、2Mbpsの受信感度の10倍近くあることがおわかりいただけると思います。 つまり、レシーバーは 10 倍弱い信号をデコードできます。
レシーバー (Rx) 感度の意味
レシーバー感度とは、レシーバーが RF 信号を検出できる最低パワー レベルを指します。 負の数の絶対値が大きいほど、レシーバ感度が良好であることを意味します。 たとえば、-94 dBm の受信感度は、-82 dBm の受信感度より 12 dB も優れています。
そのため、データ レートを下げると、達成できる範囲が大幅に改善されることがあります。 また、ほとんどのプロジェクトでは、250Kbps の速度で十分です。
Higher Output Power
最大出力電力の設定も通信距離を向上させることができます。 nRF24L01+では、0dBm、-6dBm、-12dBm、-18dBmから1つ出力電力を選択することができます。 0dBmを選択すると、より強い信号が送信されます
。