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台のArduinoを準備し、それぞれnRF24L01と接続します。
nRF24L01とArduinoの接続は以下の通りです。
| nRF24L01 |
Arduino |
| VCC |
3.3V(注意) |
| GND |
GND |
MISO
|
D12 |
MOSI
|
D11 |
SCK
|
D13 |
CE
|
D7 |
CSN
|
D8
|
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については、こちらで紹介しています。
(注意)
Arduinoの互換機では3.3V出力の電流容量が正規品よりも小さいみたいで、
3.3Vを直接ボードから供給すると正しく動かないことがあります。
Arduinoの3.3V出力の電流容量についてはこ
ちらに詳しく紹介されていますが
メーカやバージョンによってボードに実装されているレギュレータが違うみたいです。
ボードに実装されているレギュレータはとても小さな部品で、マーキングを読み取ることが困難なので、
外部レギュレータを使って5V→3.3Vに変換し、nRF24L01に供給したほうがいいです。
レギュレータはAMS1117(最
大1000mA)の様に、できるだけ電流容量の大きなもののほうが安心ですが、
RF24L01はそれほど電気を食わないので、LP-2950(最大
100mA) でも動いています。
このような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側はデータを返信したことを表示します。

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

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

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

右のモジュールも最近入手したモジュールで、セラミックアンテナとRFX2401Cが付いています。
ピンアウトは左のモジュールと全く同じです。

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

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

近所の河原の土手で試しましたが、見通しで300Mぐらいまで離れても通信することができました。
送信機と受信機の間に遮蔽物が有ると、極端に感度が落ちます。
また、送信機を自転車の荷台に置くよりも、直接地面に置いた方が感度が上がりました。
この様な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ぐらいで購入することができます。
とにかく安いです。
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ライブラリが有れば、普及する可能性が有りますが、残念ながらありません。
続く...