電子工作
nRF24L01無線モジュールを使ってみる - 電子工作 †
これとデータシートを読んでわからない人は,おとなしくArduinoライブラリを使ったほうが楽だと思います.
あくまで載せているのはデータシートに基づいた情報の一部なので,逆に情報が足りないという方はデータシートを参照してください.
紹介しているモジュールの使用にあたっても自己責任で.
概要 †
下調べ †
モジュールのピン配置 †
- 微弱無線送受信モジュールnRF24L01(2.4GHz、SMT)
ユーザマニュアルやら回路図やらがとてもツッコミどころだらけで使いものにならないので,アートワークとデータシートを照合して正しい(?)ピン配置を割り出した.
ピン番号 | ピン名 | 機能 | 入出力 | 備考 |
1 | VCC | 電源(+1.9〜3.6V) | - | |
2 | CE | チップイネーブル | I | アクティブハイ |
3 | CSN | チップセレクト | I | アクティブロー |
4 | SCK | SPIクロック | I | |
5 | MOSI | SPIスレーブイン | I | |
6 | MISO | SPIスレーブアウト | O | |
7 | IRQ | 割り込みピン | O | アクティブロー |
8 | GND | 電源(グラウンド) | - | |
- nRF24L01+版
ピン配置が微妙に違ったので補足
ピン番号 | ピン名 | 機能 | 入出力 | 備考 |
1 | VCC | 電源(+1.9〜3.6V) | - | |
2 | GND | 電源(グラウンド) | - | |
3 | CE | チップイネーブル | I | アクティブハイ |
4 | CSN | チップセレクト | I | アクティブロー |
5 | SCK | SPIクロック | I | |
6 | MOSI | SPIスレーブイン | I | |
7 | MISO | SPIスレーブアウト | O | |
8 | IRQ | 割り込みピン | O | アクティブロー |
使用方法とプロトコル(nRF24L01+の場合) †
SPPモジュールではUARTで通信していたが,今回はSPIを使う必要がある.
nRF24L01無印の場合の設定方法も記述しようと思ったが,どうやら新規設計非推奨なパーツらしいので,nRF24L01+のみの場合について記述することにする.
大雑把な処理はこのコードで把握できる.
maniacbug / RF24 / RF24.cpp
処理の流れ †
基本的には設定をレジスタに書き込んでバッファを詰めてCEをHIGHにすると通信がスタートするというシンプルな構成である.
- 基本設定を行う
- RFチャンネルの設定(RF_CHレジスタ0x05)
チャンネル番号を7bitの値(0〜127)でレジスタに書き込む.
- RF強度・無線通信速度等の設定(RF_SETUPレジスタ0x06)
基本的にはRF_PWR(2:1)で電波強度の設定を行うだけでよい.
RF_DR_LOW(5),RF_DR_HIGH(3)で無線通信速度の設定を行うことも可能である.
- 自動ACKの設定(EN_AAレジスタ0x01)
自動ACKを使用するデータパイプに対応するビットを立てる.
便利なので通信に使用しているデータパイプすべてに設定したほうがよいと思われる.
- アドレスに割り当てるバイト数の設定(SETUP_AWレジスタ0x03)
AW(1:0)にアドレスに使用するバイト数を設定する.
5バイトアドレスの場合は0x03(規定値),4バイトの場合は0x02,3バイトの場合は0x01を書き込む.
- 送受信アドレスの設定(RX_ADDR_PXレジスタ0x0a〜0x0f,TX_ADDRレジスタ0x10)
RX_ADDR_P0〜PX_ADDR_P5とTX_ADDRにそれぞれデータパイプに割り当てるアドレスを設定する.
RX_ADDR_P2〜RX_ADDR_P5は下位1バイト以外はRX_ADDR_P1と共通となるため,1バイトのみの書き込みとなる.
自動ACKを使用して送信する場合は,必ずTX_ADDRをRX_ADDR_P0と同一にすること.
- ペイロードのFIFOバッファのクリア
- FLUSH_TX命令0xe1を実行
0xe1に続いててきとーに0xffとか0x00とかを書き込んどけばいい.
- FLUSH_RX命令0xe2を実行
上と同様.
- 電波送受信開始
- 送信の場合
- 設定のためCEピンをLOWに
- バッファにデータを詰める(W_TX_PAYLOAD命令0xa0)
0xa0に続いてデータを順番に書き込む.
- 自動再送信の設定(SETUP_RETRレジスタ0x04)
前もって設定しておいてもよい.
リトライ間隔ARD(7:4)とリトライ回数ARC(3:0)を設定する.
- 受信データパイプの設定(EN_RXADDRレジスタ0x02)
有効にする受信データパイプを設定する.
自動ACKを使用して送信する場合は,必ず受信データパイプを有効にすること.
- パワーUP,PTXモード有効化(CONFIGレジスタ0x00)
0x0e(CRC2バイト,パワーUP,PTXモード)を書き込めばよい.
IRQピンを使わない場合は0x7e.
- CEピンをHIGHに設定,無線有効化
- 受信の場合
- 設定のためCEピンをLOWに
- 受信データパイプの設定(EN_RXADDRレジスタ0x02)
有効にする受信データパイプを設定する.
- 受信するペイロードのバイト数を設定(RX_PW_PXレジスタ0x11〜0x16)
RX_PW_P0〜PX_PW_P5レジスタに受信するバイト数を指定する.
- パワーUP,PRXモード有効化(CONFIGレジスタ0x00)
0x0f(CRC2バイト,パワーUP,PRXモード)を書き込めば問題ない.
IRQピンを使わない場合は0x7f.
- CEピンをHIGHに設定,無線有効化
注意事項 †
- 電波の送受信を終了するにはCEピンをLOWに設定し,念の為CONFIGレジスタのパワーにあたるビットをダウンにセットする.
- レジスタの書き込みには,レジスタ番号に0x20をORしてアクセス.読み出しの場合レジスタ番号はそのまま.
- CSNとCEを混同しやすいので注意.CEは電波のON/OFF,CSNはSPIの通信制御のためのピン.
サンプルコード(stm32plus) †
STM32でSPIといえば,チップセレクトをハードに任せると色々ややこしいことが起きる(ソース:STM32のSPI - Wikimura)ようなので,チップセレクトはソフトウェア的にHIGH/LOWを切り替える.(めんどっちぃ)
INTピンからの割り込みでデータを処理しても良いのだが,どうもうまくいかなかった(データの送受信が突然できなくなる)ので,以下のサンプルでは周期的にポーリングしている.