nRF24L01無線モジュール

¥100 2.4GHz無線モジュールの実験

まとめ:

・Aliexpressで安売りしている 高いところで$4、安いところで$1
 最安店なら¥1000で10個買える
 当方の購入店はZC Electronic components store (Store No.318950)
 送料無料だが届くまでに2~3週間かかる
 最近は品物がだぶついているのか多くの店がこの価格帯で販売している
・使用されている無線ICはノルディックセミコンダクターのnRF24L01+
・価格が怪しいので10個購入して全部テストしてみたが問題なく動作した
・電源電圧3.3V arduinoの3.3V電源で動作するが10uFのパスコンを入れないときわめて不安定
 パスコンの有無にかかわらずブレッドボードでは動作不安定
・電源電圧は3.3Vだが入出力は5Vトレラントなので5VのMPU(arduinoなど)との相性も良い
・arduino用に2つのライブラリーが公開されている
 Mirf シンプルなライブラリ
 RF24 高機能なライブラリ(通信速度を変更すると通信可能距離が変わるのでこちらを使用した方が良い Mirfライブラリーは設定できない)
・無線通信距離はせいぜい10m
 無線通信速度を250kbpsに落とすと30m程度になる。製品の仕様を見ると250m程度らしいのだが実際はうんと短い
 速度は250kbps,1M,2M Mirfライブラリーはこの設定機能が無い。RF24ライブラリーは多機能なので設定可能
・プリント基板アンテナは電線を半田付けして50mm程度延長した方が良い
・Low-Eガラス(遮熱性能が高いガラス)越しだと通信速度250kbpsで距離15m程度が限界。アンテナのタイプにあまり依存しない
 1M,2Mbpsではガラス越しの通信はほぼ無理。通常のガラスなら問題なし
・RFX2401ブースター付きの物は今のところ効果無し
 価格は1個$6程度
 カタログスペックでは250bpsで1km届くらしい。消費電力から推測して無線出力オーバーの違反だと思う
・ブースター有り無しのモジュールを混在させて使うことも可能
 但し双方向に通信しているのであまり意味が無い
・外部アンテナ付きは通信速度1M,2Mで最大通信可能距離20m、250KBPSでは40m程度
・MPUとはSPI通信


2013-06-13

送信機受信機の区別は無い

R0017364.jpg

ブレッドボードでは動作せず

R0017357.jpg

10μFのチップコンデンサを付けてみたがブレッドボードで安定動作せず。電源はarduinoの3.3VではなくシリーズレギュレターLM317を使っている。データシート上は最低1.9Vで動作する。電源の電流は10mA程度取れれば良い。

R0017379.jpg

配線が短くなるように実装して10μFのパスコンを入れてやっと動いた。電源は3.3VだがI/Oピンは5VトレラントなのでarduinoのI/Oに直接接続可能。ソフト(ライブラリー)はここにある物を使った「ZIP」ボタンを押してダウンロード開始。リンクが切れるかもしれない
上のリンクはここからたどった。リンクが切れていたらここからたどってみるべし<-配線はこれを参照。2種類配線パターンがあるがRF24の方を使用してテストした。Mirfでも動く。IRQ8番ピンは何も繋がないで良い。

動作確認手順
・arduinoを2個用意する必要がある。パソコンは1台で良い
・ライブラリーをダウンロード&解凍してarduinoのlibraliesフォルダーにCOPYする。解凍した後リネーム必要(名称に - が入っているとダメ)
・サンプルプログラムにGettingStartedというのがあるのでコンパイルしてarduinoに書き込む
 このプログラムはpingサーバー&クライアント兼用になっている
・シリアルモニターを起動して通信速度を56700bpsにする
・送信側はTコマンド(Tを入力して送信)受信側はRコマンド(Rを入力して送信)
 受信する場合は一旦Tコマンドを入力して送信モードにしてからRコマンドを入力して受信に切り替える。そうしないとうまく動作しないことがある

R0017367.jpg

サンプルプログラムの画面。左が送信側。右が受信側。受信側もレスポンスを返すので送信しているし、送信側もレスポンスを受け取っているので受信もしている。

R0017374.jpg

金属容器に入れて

R0017360.jpg

上からかぶせて

R0017358.jpg

こちらも金属容器をかぶせても通信できてしまう。距離は約5m。通信モジュールはこんな妨害よりもむしろ遠距離に弱い。

R0017361.jpg

アンテナを少し延長した方が安定する。空中配線をしているがこれだとやや不安定。アンテナを延長して安定した。

R0017683.jpg

当方が書いたシンプルなプログラムも添付しておく。これ以上シンプルにするのは難しい リファレンスはここ

通信ソフトの基本 エコーサーバーのサンプル これが理解できれば通信プログラムの90%はマスターしたと思って良い
0001  //-------------------------------------------------------------------
0002 // nRF24 echo server
0003 //------------------------------ written by iizuka Japan ----------
0004 #include <SPI.h>
0005 #include "nRF24L01.h"
0006 #include "RF24.h"
0007
0008 // コンストラクタ呼び出し CEピンとCSピン番号の設定
0009 RF24 radio(9,10);
0010
0011 void setup(void)
0012 {
0013 // 通信開始
0014 radio.begin();
0015
0016 // リトライ回数の設定
0017 radio.setRetries(15,15);
0018
0019 // 書き込み用のパイプを開く
0020 radio.openWritingPipe(0xF0F0F0F0D2LL);
0021 // 読み込み用のパイプを開く
0022 radio.openReadingPipe(1, 0xF0F0F0F0E1LL);
0023
0024 radio.startListening();
0025 }
0026
0027 void loop(void)
0028 {
0029 char c;
0030
0031 if ( radio.available() ) {
0032 bool done = false;
0033 while (!done) {
0034 done = radio.read( &c, sizeof(char) );
0035 delay(20);
0036 }
0037
0038 radio.stopListening();
0039
0040 radio.write( &c, sizeof(char) );
0041
0042 radio.startListening();
0043 }
0044 }
0045 //-------- end of program -----------------------------------------
行番号
解説
全体
エコーサーバー1文字送られてきたら同じ文字を1文字返信する
20、22行目
アドレスをクライアントと合わせる
エコーサーバー(クライアント側)のサンプル。これを書き込んだ後にシリアルモニターを起動して文字を打ち込む
0001  //-------------------------------------------------------------------
0002 // nRF24 echo client
0003 //------------------------------ written by iizuka Japan ----------
0004 #include <SPI.h>
0005 #include "nRF24L01.h"
0006 #include "RF24.h"
0007
0008 // コンストラクタ呼び出し CEピンとCSピン番号の設定
0009 RF24 radio(9,10);
0010
0011 void setup(void)
0012 {
0013 Serial.begin(9600);
0014 Serial.write("start client");
0015
0016 // 通信開始
0017 radio.begin();
0018
0019 // リトライ回数の設定
0020 radio.setRetries(15,15);
0021
0022 // 書き込み用のパイプを開く
0023 radio.openWritingPipe(0xF0F0F0F0E1LL);
0024 // 読み込み用のパイプを開く
0025 radio.openReadingPipe(1, 0xF0F0F0F0D2LL);
0026 }
0027
0028 void loop(void)
0029 {
0030 char c;
0031 bool ok;
0032
0033 // シリアルモニターから一文字入力
0034 while(true) {
0035 if( Serial.available() > 0) {
0036 c = Serial.read();
0037 break;
0038 }
0039 }
0040
0041 // サーバーに1文字送信する
0042 ok = radio.write( &c, sizeof(char) );
0043 if (ok) {
0044 Serial.write(c);
0045 } else {
0046 Serial.write("Send error");
0047 }
0048
0049 // サーバーからの返信を待つ
0050 radio.startListening();
0051 // 200ms待っても返信が無ければタイムアウト
0052 unsigned long started_waiting_at = millis();
0053 bool timeout = false;
0054 while ( ! radio.available() && ! timeout ) {
0055 if (millis() - started_waiting_at > 200 ) {
0056 timeout = true;
0057 }
0058 }
0059 radio.stopListening();
0060
0061 if ( timeout ) {
0062 Serial.write("response timed out");
0063 } else {
0064 radio.read( &c, sizeof(char) );
0065 Serial.write(c);
0066 }
0067 }
0068 //-------- end of program -----------------------------------------
行番号
解説
全体
シリアルモニターから1文字入力すると、同じ文字がサーバーから送られてくるのでそれを表示する。

上記プログラムの実行画面

R0017685.jpg
プログラム現物
ファイル ファイルタイプ 添付ファイルの解説
nrf24echo.zip arduino 上記エコーサーバーの現物

32byte単位でデータを送ったときの速度。往復で約4~6msec。プログラムの説明は省略。1回に送ることができるのは最大32バイト。

R0017700.JPG
プログラム現物
ファイル ファイルタイプ 添付ファイルの解説
nrf24echoBench.zip arduino 32バイト送受信エコーサーバー&クライアント

Mirfライブラリーでも動く。互いに影響を受けるようなので同じ場所ではどちらか一方だけを使う。異なるアドレスで隔離されている2組の無線モジュール間でも衝突は起こりうるのでソフトでの再送処理が必要。この問題は同一ライブラリーでも発生しうる。
Mirfライブラリー
RF24ライブラリー

R0018583.jpg

Mirfはシンプル

R0018581.jpg

RF24ライブラリーは多機能


売店でも売ってるよ 売り切れていたらaliexpressで購入できる

2013-10-02

Mircochip社も無線モジュールを製造している。価格は¥600~¥2000程度。仕様によって価格も異なる。無線モジュールは海外では非常に安価なのだが日本では高価。電波法上の問題なのかニーズが無いだけなのか不明。

R0018617.jpg

2014-02-25

RFX2401Cブースターが付いているタイプを実験してみたが殆ど通信距離は変わらなかった。スペック上は1kmだが実際は10m程度。無線の通信速度を250kbpsに落として20m

R0020045.jpg
R0020057.jpg

実験に使ったシールドの回路図。出力が大きいのでFT232の3.3V電源は使用せずAZ1117-ADJで3.3Vを作っている。C3,C6に10μFのパスコンを入れないと通信モジュールがご機嫌斜めになるのは変わらず。

nrfsch.PNG
テスト用シールドの 回路図&基板レイアウト
ファイル ファイルタイプ 添付ファイルの解説
nrf24L01_shield.zip EAGLE EAGLE4.15用 Press-n-Peelで作りやすいように太い配線にしてある

2014-02-26

外部アンテナ付きを実験してみた。ブースターは付いていない。ピン配列互換。通信速度1M,2Mでは最大通信可能距離20m、250KBPSでは35m程度。通信可能距離はプリント基板アンテナの2倍程度に伸びる。価格は1個$6程度。

R0020062.jpg
R0020068.jpg

2014-09-03

通信距離が伸びない場所。矢印が受信機の方向。地面の近くも通信距離が伸びない。通信距離を延ばしたいなら高い位置に無線モジュールを配置する

R0021854.jpg

車の陰

R0021853.jpg

コンクリート基礎の近く

R0021855.jpg

土の山の陰