RaspberryとArduinoの無線通信

nRF24L01モジュール


nRF24L01の無線モジュールを入手しました。
nRF24L01はNORDIC Semiconductorが開発した2.4GHzの無線モジュールですが、無線の使い方が違うのでWifiとの互換性はありません。
NORDIC SemiconductorのHPがこちらに 有りますが、非常に沢山の無線モジュールを開発しています。
nRF24L01は古い製品なので、上記のページからはたどれません。
こ ちらに製品紹介が有ります。


Arduino環境で使うためのライブラリがいくつか公開されていますが、今回こちらのライブラリを使いました。
https://github.com/TMrh20/RF24

なお、RF24ライブラリには以下のバージョンもありますが、こちらは少し古くバグが残っているようです。
最初にこちらをダウンロードしたので、めちゃくちゃはまりました。
https://github.com/maniacbug/RF24

動作確認のために2台のUNOを準備し、それぞれnRF24L01と接続します。
nRF24L01とUNOの接続は以下の通りです。
nRF24L01 UNO
VCC 3.3V(注1)
GND GND
MISO
D12
MOSI
D11(注2)
SCK
D13(注2)
CE
D7(注2)
CSN
D8(注2)
IRQ
N/C

nRF24L01のCEピンをD7に、CSNピンをD8に接続していますが、ここはスケッチ内で好きなピンに変更できます。

/* Hardware configuration: Set up nRF24L01 radio on SPI bus plus pins 7 & 8 */
RF24 radio(7,8);

nRF24L01とはSPIで通信します。
ハードウェアSPIを使う場合、MISO MOSI SCKはD12,D11,D13に固定ですが、
ソフトウェアSPIにすると任意のピンに変更することができます。
ソフトウェアSPIについては、こちらで紹介しています。

(注1)
UNOの互換機では3.3V出力の電流容量が正規品よりも小さいみたいで、
3.3Vを直接ボードから供給すると正しく動かないことがあります。
UNOの3.3V出力の電流容量についてはこ ちらに詳しく紹介されていますが
メーカやバージョンによってボードに実装されているレギュレータが違うみたいです。
ボードに実装されているレギュレータはとても小さな部品で、マーキングを読み取ることが困難なので、
外部レギュレータを使って5V→3.3Vに変換し、nRF24L01に供給したほうがいいです。
レギュレータはAMS1117(最 大1000mA)の様に、できるだけ電流容量の大きなもののほうが安心ですが、
RF24L01はそれほど電気を食わないので、LP-2950(最大 100mA) でも動いています。

(注2)
これらのピンは5V Tolerantで、最大5.25Vまで受け付けることができます。
製品マニュアルの8章に明記されています。
5V仕様のUNOにとっては、使いやすいです。



このようなnRF24L01専用のソケットがあります。
基板上にAMS1117のレギュレータが実装されていて、5V給電で動かすことができます。


nRF24L01を取り付けるとこの様になります。




ライブラリに付属しているGettingStartedをNode1に書き込みます。
スケッチサイズは非常に小さいです。

最大32256バイトのフラッシュメモリのうち、スケッチが3264バイト(10%)を使っています。
最大2048バイトのRAMのうち、グローバル変数が255バイト(12%)を使っていて、ローカル変数で1793バイト使うことができます。

送受信両方をモニターしたいので、Node1はTeraTermでモニターします。
デフォルトは受信モードで起動します。


次にスケッチの以下の部分を書き換えて、Node2に書き込みます。ここがミソです。
bool radioNumber = 0;

bool radioNumber = 1;


Node2でTの文字を入力すると送信モードに切り替わります。
Sentが送信したデータ、responseが応答として受信したデータ、
Round-tripが送信してから応答が有るまでの所要時間です。


Node1側はデータを返信したことを表示します。


このライブラリでは初期値として
Payloadサイズ=0x20(32)
使用するチャネル=0x4c(=46)
通信速度=1MBPS
CRC=8Bit
を設定します。
これらの設定はAPIを使って変更することができます。
RX_PW_P0-6    = 0x20 0x20 0x00 0x00 0x00 0x00
RF_CH         = 0x4c
Data Rate     = 1MBPS
Model         = nRF24L01+
CRC Length    = 8 bits
PA Power      = PA_MAX

nRF24L01は元々送信のみ、あるいは受信のみの片方向通信を前提に設計されています。
ライブラリのソースを見てみましたが、nRF24L01のレジスターを操作して上手に送受信を切り替えています。
一度に32バイトまでのデータを送受信することができます。



この様なSMDタイプも有ります。
ピンピッチは1.27mm(ハーフピッチ)なので、ブレッドボードで使うときは、ピッチ変換基盤が必要になります。


ピンアウトが色々なところで公開されていますが、ほとんど間違っています。
このピンアウトが正解です。


SMDモジュールをブレッドボードで使う場合、下の写真の様に一番左側を使って、アンテナの下に空間が有る方が安定するようです。




右のモジュールは最近入手したSMDモジュールで、IPXアンテナコネクターが付いています。
ピンアウトは左のモジュールと全く同じです。




外部アンテナを付けられるモジュールを入手しました。
ピン配置は通常のPCBアンテナ版とコンパチです。
基板には2つのチップが実装されています。
写真では反射して見えませんが、左のチップがnRF24L01、右のチップがRFX2401Cです。
Aliの製品ページには「NRF24L01P + PA + LNA」と書いてありました。
そこで、「PA+LNA」で調べたら、こ ちらのページに説明が有りました。
PA:電力増幅器(Power Amplifiers)
LNA:低雑音増幅器(Low Noise Amplifiers)

RFX2401Cチップのデータシートがこ ちらに公開されています。
「2.4 GHz Zigbee / ISM Front-End Module」と書かれています。

Description
The RFX2401C is a fully integrated front-end module that incorporates all the RF functionality needed for IEEE 802.15.4 / Zigbee, wireless sensor network, and any other wireless systems in the 2.4 GHz ISM band.
The RFX2401C architecture integrates the PA, LNA, transmit and receive switching circuitry, and the associated matching network, all in a single package.

Google君にお願いします。
RFX2401Cは、IEEE 802.15.4 / Zigbee、ワイヤレスセンサーネットワーク、および2.4 GHzISM帯域の他のワイヤレスシステムに必要なすべてのRF機能を組み込んだ完全に統合されたフロントエンドモジュールです。
RFX2401Cアーキテクチャは、PA、LNA、送信および受信スイッチング回路、および関連するマッチングネットワークをすべて1つのパッ ケージに統合します。

これで、信号を増幅しているようです。


巨大なアンテナが付属しています。


近所の河原の土手で試しましたが、見通しで300Mぐらいまで離れても通信することができました。
送信機と受信機の間に遮蔽物が有ると、極端に感度が落ちます。
また、送信機を自転車の荷台に置くよりも、直接地面に置いた方が感度が上がりました。
ノーマルのnRF24L01も結構電流が必要ですが、nRF24L01+RFX2401Cの場合、115mAが必要と言う記事が有りました。

右のモジュールは最近入手したSMDモジュールで、nRF24L01+RFX2401C+セラミックアンテナと言う組み合わせです。
ピンアウトは左のモジュールと全く同じです。




この様なArduino NANO互換モジュールを入手しました。
RF-Nanoというemakefunの製品で、ボード上にnRF24L01+が実装されています。
Schematicやサンプルコードがこ ちらに公開されています。
ATmegaとnRF24L01+はCSN=D9 CE=D10で接続されています。
サンプルコードでは、CSNとCEを任意のピンに指定できるように改造したMirfライブラリが使われています。
基盤のエッジもグラインダーできれいに加工されています。
$4.99なので、NANOとnRF24L01を別々に買うよりも安いかもしれません。




この様なArduino NANO互換モジュールを入手しました。
emakefun製品のクローンで、(すぐに壊れる)安物の2点固定のSMDタイプのマイクロUSBポートです。
ボード上にnRF24L01(Plusのないバージョン)が実装されています。
BootloaderはOld Bootloaderが書き込まれています。
emakefun製品の場合、ATmegaとnRF24L01はCSN=D9 CE=D10接続されていますが、この製品は違いました。
テスターで調べてみましたが、ATmegaとNRF24L01はCSN=D8 CE=D7で接続されています。
基盤のエッジは無加工で、写真でも分かる様にケバ立っていてかなり雑な作りです。
emakefun製品よりも$1ほど安く入手できます。




とても面白い製品を入手しました。
写真の様にSMD/ピンヘッダーのどちらでも使えて、さらにPCBアンテナ、IPXアンテナ兼用です。
基板上にRFX2401Cチップが実装されていて、信号を増幅しています。


ここのジャンパーを外して、下のランドに付け替えるとIPXコネクターが有効になります。
8ピンヘッダーを付けて普通に使えています。


nRF24L01にはこのように多数のバリエーションが有りますが、単体モジュールなら10個で$9ぐらいで購入することができます。
とにかく安いです。



Nano用のIOシールドボード入手しました。
Xbeeモジュールを装着する目的で購入しました。
手元に届いてから気が付きましたが、右下にnRF24L01用のコネクターが出ています。


取り付けるとこの様になります。
NnaoとNRF24L01はCSN=D10 CE=D9で接続されています。




nRF24L01を利用した製品にnRF24LE1という製品が有ります。
データシートがこ ちらに公開されていますが、nRF24L01と8bit 8051 MCUを1つのチップに実装したSoCです。
nRF24LE1D(24Pin)/nRF24LE1E(32Pin)/nRF24LE1F(48Pin)の3つのバリエーションが有り、
AliやeBayでnRF24LE1(32Pin)の開発モジュールを$5程度で入手することができます。

データシートによると、nRF24L01の機能に加え、GPIO、SPI、UART、2-Wire(i2c)、ADC、PWMも使えるようです が、
無償で使える開発環境が有りません。
ArduinoのCoreライブラリが有れば、普及する可能性が有りますが、残念ながらありません。

続く...