いくつかの場所に分散したArduino機から、各種の情報(センサー情報とか)を送信して、一台の受信機(ホスト)でそれらをまとめて受信し、PCと接続し、PCで処理したりサーバーに上げたり・・という事を実現したので、そのまとめ。
いろんなWEBからの情報を集めながら、複数台の通信が出来るようになったので、まとめておくことにした。
何台も同じような配線をするのは面倒だし、nRF24L01モジュールの性能が配線に敏感・・という書き込みがあちこちにあったので、基板を起こすことにした。→基板製作の詳細はこちらへ
搭載出来る部品は下記のとおり。
- Arduino Nano (5V) x 1
- 16×2 LCD module (4bit interface) (5V)
- nRF24L01 (3.3V)
- MAX6675 module (5V)
nRF24L01用の3.3Vレギュレーターやパスコンを基板上にマウントすることにより、安定した3.3Vを供給出来るようにしてある。他には、MAX6675モジュールの端子配列が商品によって異なる順番になっているのに対応しており、いくつかのユニバーサル部分を設けてある。実際のアプリケーションでは、このユニバーサル部分に、PhotoCouplerを載せて、外部からの24Vパルスを検出するようにした。
【RF通信の試行錯誤】
nRF24L01の仕様書によると、”Multiceiver”という使い方があるようなので、これを使うことにした。
この使い方ならば、最大6台の送信ユニットから一台の受信ユニットへデータを送ることが出来る。各パイプの設定がミソのようだが、仕様書を参考にしてマネてみた。
パイプ(アドレス)を設定するレジスタは全部で6個。送信側が6台で、受信側が一台だとアドレスが足りないんじゃ?と思ったが、よく見てみたら、このモードの時には、基本的にはRX側からはデータを送ることが出来ないようなので、これで良いのかも。
実際のコードでは設定は次のようにした。(
「RF24.ino」をダウンロード
)
[共通]
#define N_PIPES 6 // total number of pipe = 6;
const uint64_t pipes[N_PIPES] = { 0xF0F0F0F0D2LL, 0xF0F0F0F0E1LL, 0xF0F0F0F0E2LL,
0xF0F0F0F0E3LL, 0xF0F0F0F0E4LL, 0xF0F0F0F0E5LL
}; //pipes[0] — pipes[5]
[ホスト(受信側)]
1 2 3 |
radio.openReadingPipe(0, pipes[0]); //read pipe #0 from Remote-0, pipes[0] <br />radio.openReadingPipe(1, pipes[1]); //read pipe #1 from Remote-1, pipes[1] <br />radio.openReadingPipe(2, pipes[2]); //read pipe #2 from Remote-2, pipes[2] <br />radio.openReadingPipe(3, pipes[3]); //read pipe #3 from Remote-3, pipes[3] <br />radio.openReadingPipe(4, pipes[4]); //read pipe #4 from Remote-4, pipes[4] <br />radio.openReadingPipe(5, pipes[5]); //read pipe #5 from Remote-5, pipes[5] <p></p> <p> </p> |
[センサー(送信側)】
それぞれの送信機が 0 から 5までの、tx_pipe番号を取ることにより、ホスト側で設定したパイプと一致する。
radio.openWritingPipe(pipes[tx_pipe]); //pipe for writing data, only one for one remote