[[HobbyElectronicsWiki]]
*nRF24L01無線モジュール [#hb322322]
#contents
nRF24L01の動作試験を行うために簡単な治具を作成してみました。
**回路図 [#zf23f607]
&ref("LPC1114_NRF24L01.png",,360x240);

マスタ・スレーブの区別はありません。実験するには二台同じものを作成します。
**仕様 [#x9991e5c]
-GPIO 8ch(入力4ch 出力4ch)の状態を二組のnRF24L01を搭載した治具同士、互いに無線で通知します。(GPIOのチャンネル数は使用したマイコンによる制限です。拡張可能)
-治具の片方(仮に)Aをマスタとしてスレーブにした治具(仮に)Bに対して32バイトのパケットを定期的に送信します。
--パケットには4バイトのタイムスタンプ、1バイトのGPIO状態、27バイトのユーザデータが含まれます。
--スレーブ側の治具Bはマスタ側からパケットが到着すると、直ちにマスタ側に自身のGPIO状態を含んだパケットを返信します。
--マスタ側とスレーブ側は互いにパケットを交換しあう事により、GPIOの状態を同期します。
--パケット交換するタイミングはマスタ側が決定を行います。間隔はソフト設定で0.1~1秒間隔(これも単なる治具としての制限です)で任意に決められます。
**試験構成イメージ [#s527a80a]
&ref("イメージ図.png");

マスタ側が何らかの移動装置、スレーブ側が通信可能圏内に入るとマスタ側と通信を始める。そんなイメージ?^^;

**通信パイプについて [#r1b90dc9]
nRF24L01は24bitのアドレスを持つパイプを構成して、そのパイプを通じて通信を行います。パイプは一方向のみパケットを流す事が出来ます。つまり双方向通信を行うためには最低二本のパイプが必要です。パイプは6本(任意のアドレスを持つ2本+付随した4本)張れますが、同時に使えるパイプは一本だけ(送受信機が1しか無いため)です。双方向通信を行うには送信側受信側の役割を交代しながら行う事になります。

パケットは32バイト以下なので治具では32バイト固定としています。これより長いデータをやり取りするには上位層で分解組み立てを行う必要があるでしょう。

パケットには自動的にCRCが付与されるので治具では特にエラーチェックを行っていません。CRCが不正等で通信が失敗すると15回はリトライします。

通信を行う物理チャンネルは任意に設定出来ますが治具ではサンプルプログラム通りの固定(76)としています。両者が合わないと通信は出来ません。

***起動直後の通信パイプイメージ [#pca42d49]
起動直後には通信を行う為のパイプは次の様な構成になっているため、そのままでは通信が出来ません。これは同じソフト・ハード構成のためスレーブモードでブートするためです。

&ref("起動直後.png");
***通信可能なパイプイメージ [#z631081a]
マスタ側にする治具をマスタモードに切り替えると図の様な通信パイプ構成に変更され、互いにパイプを通じたパケット交換が出来るようになります。

&ref("通信出来るように設定.png");
**モードの切替え [#e7616773]
***マスタモードへの切替え [#r6340e2d]
起動直後のスレーブモードからマスタモードに切り替えるには次の方法があります。
-I2C(治具のスレーブアドレスは0xB4)を経由してコントロールレジスタ'''0x40'''に'''0x02'''を書き込む
--コントロールレジスタは書き込まれた命令の処理が終わると'''0x00'''に自動復帰します
-プッシュSWのUSER SWを長押しします。
--マスタモードに設定出来ると全てのGPIOのLEDが点灯します
-UART(115.2kbps)を経由してコマンド''M''を投入
***スレーブモードへの切替え [#sfbb8a76]
マスタモードからスレーブモードに切り替えるには次の方法があります
-I2C(治具のスレーブアドレスは0xB4)を経由してコントロールレジスタ'''0x40'''に'''0x04'''を書き込む
--コントロールレジスタは書き込まれた命令の処理が終わると'''0x00'''に自動復帰します
-プッシュSWのUSER SWを長押しします。
--スレーブモードに設定出来ると半分(0b1010)のGPIOのLEDが点灯します
-UART(115.2kbps)を経由してコマンド''S''を投入
**通信制御 [#a3a36d3f]
通信(パケット交換)が始まると治具AのSWで設定したGPIOの入力が治具BのLEDの点灯状態に反映されるようになります。逆に治具BのSWで設定したGPIOの入力が治具AのLEDの点灯状態に反映されるようになります。

タイムスタンプレジスタは起動後のミリ秒時間を保持しており、送信した時点のタイマの値を含みます。マスタ側からのタイムスタンプは送信間隔の切りのよい数値、スレーブ側からのタイムスタンプは受信完了して自身のパケットを組み立てた時間になります。

GPIO状態レジスタはGPIOの状態がスキャンされる度に自動的に更新されます。

ユーザデータレジスタは任意の値を設定すれば相手側の受信ユーザデータレジスタに値が反映されます。

***通信の開始 [#c442f468]
通信(パケット交換)を開始・停止出来るのはマスタ側に設定した治具からのみです。通信を開始するには次の方法があります
-I2C(治具のスレーブアドレスは0xB4)を経由してコントロールレジスタ'''0x40'''に'''0x08'''を書き込む
--コントロールレジスタは書き込まれた命令の処理が終わると'''0x00'''に自動復帰します
-プッシュSWのUSER SWを短く押します。
-UART(115.2kbps)を経由してコマンド''ae''を投入
***通信の停止 [#y89120dd]
通信(パケット交換)を開始・停止出来るのはマスタ側に設定した治具からのみです。通信を開始するには次の方法があります
-I2C(治具のスレーブアドレスは0xB4)を経由してコントロールレジスタ'''0x40'''に'''0x10'''を書き込む
--コントロールレジスタは書き込まれた命令の処理が終わると'''0x00'''に自動復帰します
-プッシュSWのUSER SWを短く押します。
-UART(115.2kbps)を経由してコマンド''ad''を投入
***UART経由のコマンド [#d94b1c3a]
デバッグ用にいくつかコマンドがあります。

 Version (V01R01) I2C Address (0xB4)
 ?       This Command
 d       Auto Transmission Interval (送信間隔=1/設定値秒)
 D       Dump Internal Memory (I2Cでアクセス出来る内部レジスタのダンプ)
 gr      Read GPIO Value (GPIOの値を読みます)
 gs      Set  GPIO Value (GPIOの値を変更します)
 M       Set Master Mode
 S       Set Slave Mode
 t       Manual Transmission (1個だけパケット送信します)
 s       Get Status (nRFの状態をダンプします)
 ae      Auto Transmission Enable (マスタの時、自動送信開始)
 ad      Auto Transmission Disable (自動送信停止)

**実際に動作させた様子 [#z381e221]

&ref("実際の様子.jpg");

右側のSW(0x7)が左側のLEDに反映されていて左側のSW(0xF)が右側のLEDに反映されてまいす。両者の間の通信はnRF24を経由した無線パケットで行われています。

&ref("I2Cでのアクセス.png");

自作のI2CアクセスソフトからI2C経由でレジスタをダンプした様子です。0x00~0x1Fが自身が送信するパケットの内容0x20~0x3Fが受信したパケットの内容となっています。
自作のI2CアクセスソフトからI2C経由でレジスタをダンプした様子です。0x00~0x1Fが自身が送信するパケットの内容0x20~0x3Fが受信したパケットの内容となっています。送信側のGPIOアドレス0x04(0x70=INPUT 0x0F=OUTPUT )と受信側GPIOアドレス0x24(0xF0=INPUT 0x07=OUTPUT)が交換されているのがわかります。

**参考文献 [#d0842c1a]
-[[RF21の詳細なドライバ:https://github.com/maniacbug/RF24]] これを元にLPC111Xに移植しました。
-[[Arduino向け簡易ドライバ:http://playground.arduino.cc/InterfacingWithHardware/Nrf24L01]] とにかく動かしてみるには
-[[aitendo:http://www.aitendo.com/product/7395]] 入手元
***バイナリ [#g3ff799a]
-&ref("LPC1114_NRF24L01.zip"); とにかく同じように実験したい人向け。ISPモードでブートすればUART経由で書き込めます。

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS