2013-06-13
送信機受信機の区別は無い
ブレッドボードでは動作せず
10μFのチップコンデンサを付けてみたがブレッドボードで安定動作せず。電源はarduinoの3.3VではなくシリーズレギュレターLM317を使っている。データシート上は最低1.9Vで動作する。電源の電流は10mA程度取れれば良い。
配線が短くなるように実装して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コマンドを入力して受信に切り替える。そうしないとうまく動作しないことがある
サンプルプログラムの画面。左が送信側。右が受信側。受信側もレスポンスを返すので送信しているし、送信側もレスポンスを受け取っているので受信もしている。
金属容器に入れて
上からかぶせて
こちらも金属容器をかぶせても通信できてしまう。距離は約5m。通信モジュールはこんな妨害よりもむしろ遠距離に弱い。
アンテナを少し延長した方が安定する。空中配線をしているがこれだとやや不安定。アンテナを延長して安定した。
当方が書いたシンプルなプログラムも添付しておく。これ以上シンプルにするのは難しい リファレンスはここ
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 -----------------------------------------
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 -----------------------------------------
上記プログラムの実行画面
32byte単位でデータを送ったときの速度。往復で約4~6msec。プログラムの説明は省略。1回に送ることができるのは最大32バイト。
Mirfライブラリーでも動く。互いに影響を受けるようなので同じ場所ではどちらか一方だけを使う。異なるアドレスで隔離されている2組の無線モジュール間でも衝突は起こりうるのでソフトでの再送処理が必要。この問題は同一ライブラリーでも発生しうる。
Mirfライブラリー
RF24ライブラリー
Mirfはシンプル
RF24ライブラリーは多機能
売店でも売ってるよ 売り切れていたらaliexpressで購入できる
2013-10-02
Mircochip社も無線モジュールを製造している。価格は¥600~¥2000程度。仕様によって価格も異なる。無線モジュールは海外では非常に安価なのだが日本では高価。電波法上の問題なのかニーズが無いだけなのか不明。
2014-02-25
RFX2401Cブースターが付いているタイプを実験してみたが殆ど通信距離は変わらなかった。スペック上は1kmだが実際は10m程度。無線の通信速度を250kbpsに落として20m
実験に使ったシールドの回路図。出力が大きいのでFT232の3.3V電源は使用せずAZ1117-ADJで3.3Vを作っている。C3,C6に10μFのパスコンを入れないと通信モジュールがご機嫌斜めになるのは変わらず。
2014-02-26
外部アンテナ付きを実験してみた。ブースターは付いていない。ピン配列互換。通信速度1M,2Mでは最大通信可能距離20m、250KBPSでは35m程度。通信可能距離はプリント基板アンテナの2倍程度に伸びる。価格は1個$6程度。
2014-09-03
通信距離が伸びない場所。矢印が受信機の方向。地面の近くも通信距離が伸びない。通信距離を延ばしたいなら高い位置に無線モジュールを配置する
車の陰
コンクリート基礎の近く
土の山の陰