nRF24L01+ 無線実験

Atmega328P-PUと無線ユニット

前回は失敗していまいましたが、こりずに挑戦です。今回もまたebayから仕入れた品物のお話です。

マイコン+無線といいますとxbeeが有名どころのようですが、今回、怪しいもの好きの私が見つけた品物はNordic Semiconductor社のnRF24L01+というチップを使った無線ユニットです。

「NRF24L01+ 2.4GHz Wireless Transceiver Module FOR Arduino」というタイトルで売っていました。最大の特徴はその安さです。私が購入した時は2個セットで約$6(送料込)でした。とても小型で、アンテナもユニットの基盤にプリントされています。

この製品の特徴は

  • 無線LAN等に使われている2.4GHzのISMバンドで通信を行う
  • 通信速度を250Kbs,1Mbps,2Mbpsから選ぶ事ができる
  • 1.9V-3.6Vで動作する。(※5Vをかけると壊れてしまう。注意が必要です)入力ピンは5Vトレントラント
  • 出力1mW (0dBm)
  • 低消費電力 送信1mw時11.3mA、受信2MBps時13.5mA

他にも超低電力消費モードがある事や、最大1台対5台の通信が出来ること(MultiCiever機能)がデータシートに記載されていました。周波数は2.400GHz~2.525GHz間で1MHz単位で変えることができます。

一定出力以下のISMバンドの通信機器は免許不要ということですが、日本国内で使用するためには認可が必要みたいですね。この製品はそのような認可はとってないでしょう。まぁ、個人的にちょっと実験するだけならば問題にはならないでしょう。残念ですが日本国の法律に抵触する可能性がありますね。善良な市民の皆さんは許可された国に行き実験しましょう。

ということで、まず初めにYour Duinoさんのwebを参考にさせていただきました。ぱっと見て気付きましたが、このページには私が購入したタイプとピン配置が違う製品が記載されています。よくわかりませんが、こちらの図のジグザグアンテナの方が良く電波が飛びそうに見えます。これは早くも失敗だったでしょうか?

気を取り直して、本文を良く読むと、Arduinoでこの無線ユニットを使うために2つのライブラリが作られている事がわかりました。1つはRF24ライブラリ、もう1つはMirfライブラリだそうです。

こちらのページにRF24ライブラリのダウンロード先が書いてありました。もうひとつのMirfライブラリはこちらのページに情報があります。残念なことにMirfライブラリはArduino 1.0環境では現時点で動作しませんでした。(0023環境では動きました)

ここから後の作業は、このブログタイトル通り試行錯誤でした。いかんせん初心者ですので誤りがあるかもしれません。もし記述に誤りがあった時には御指摘いただければ有難いです。NRF24L01+をより活用することができると書いてあったRF24ライブラリを使って通信を試みます。

  • こちらからRF24ライブラリをダウンロードします。 Download RF24 Library here (ZIP or GZ)
  • ダウンロードしたファイルを展開してできるフォルダ名(現時点ではmaiacbug-RF24-94635e8)をRF24にリネームする。
  • そのRF24フォルダごと Arduino-x.x\libraries\ 以下にコピーする

上記の手順でライブラリの登録ができました。

さてnRF24L01+ユニットとArduinoとの結線です。RF24ライブラリ作者であるmaniacbugさんのwebに載っていました。

【nFR24L01+とArduinoの結線】
nFR2401+ Arduino
GND GND
VCC 3.3V
CE 9
CSN 10
SCK 13
MOSI(MO) 11
MISO(MI) 12
IRQ 通常は未使用、チャレンジャーは2

Your Duinoさんのwebに書かれている結線とはCE,CSNの配線が異なっています。デフォルトでRF24ライブラリを使用するならば、上記が正解みたいです。)
--->1/19追記 CE,CSNのピンアサインは変えることができます。


最初ブレッドボードで実験しようとしたのですが、ピンの間隔は一般的な2.54mmなのですが列の間隔が足りなくてブレッドボードではうまくいきませんでした。(ちょっと考えれば分かりそうなものです。まだまだですね。)

というわけで今回は片側がオス反対側がメスのブレッドボード用のジャンパワイヤーで配線しました。また、実験には同じセットが2台必要になります。

さて準備ができました。Arduino 1.0の環境で実験開始です。Arduino IDEのメニューからサンプルスケッチを試します。 [File]-[Examples]-[RF24]-[GettingStarted]を、無線ユニットをつないだ2台のArduino双方にアップロードします。

シリアルモニタを表示させてボーレートを 57,600baud に合わせます。するとシリアルモニタには

RF24/examples/GettingStarted/

ROLE: Pong back

*** PRESS 'T' to begin transmitting to the other node

STATUS        = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0

RX_ADDR_P0-1  = 0xf0f0f0f0d2  0xf0f0f0f0e1

・・・ 以下略

このようなステータスが表示されます。現在双方のArduinoはPong backモードですので、’T’をタイプしてSendボタンを押します。

*** CHANGING TO TRANSMIT ROLE -- PRESS 'R' TO SWITCH BACK

Now sending 428654...ok...Got response 428654, round-trip delay: 23

Now sending 429678...ok...Got response 429678, round-trip delay: 24

Now sending 430703...ok...Got response 430703, round-trip delay: 24

・・・ 以下略

このように表示されれば成功です。ミリセコンド単位でpingのディレイが表示されました。

出力が1mWということで、どのくらいの飛距離がでるか実験してみました。デフォルトの1MBpsで室内障害物無しの条件で約10mは全く問題無しでした。さらに、外に出て木造建物の壁1枚を隔て約15m程度はなれた所で限界が来ました。いろいろな環境条件によって変わると思いますので、これはごくおおざっぱな参考値です。データシートには256Kbpsにすると消費電力は増えるが受信感度が増すという内容の記述がありました。距離的にちょっと心もとない気もしますが、使う用途によっては十分実用になると思います。

以下の事柄は私の環境に限ったことかもしれません。ジャンパー線を外しプロトシールドにピンソケットを付けて実験してみました。φ0.26mmのジュンフロン線で配線をしたのですが、最初全てのパケットがタイムアウトになってしまいました。一瞬言葉を失いましたが、冷静に戻った後、モジュールにつながる電源の3.3VとGNDの配線を太いものにしてようやく動作しました。電源周りに気を付けた方がよさそうです。現在はさらにバイパスコンデンサを取り付け、他の信号線も太い配線にしました。