【5ステップでマスター】無線通信モジュールnRF24L01の使い方【Arduino】

記事内に広告を含みます

電子工作を始めて色々作ってステップアップしていくと、『無線で操作できないかな・・・(#^.^#)』と妄想する場面がありませんか?

とはいえ・・・

  • 無線ってちょっと難しそう・・・
  • Bluetoothとかと何が違うかわからん

というように難易度高めという印象があるのではないでしょうか

確かに回路設計からやっていくとなると非常に高度な知識が必要とされるのですが、無線通信モジュールと専用のライブラリを使用すれば比較的簡単に無線通信を行うことができます

この記事では、5つのステップで無線通信モジュールの『nRF24L01』を使用した無線通信のやり方をご説明します。

[STEP 1] nRF24L01の概要

nRF24L01モジュールは、Nordic Semiconductor社製2.4GHz帯域用RFチップ(nRF24L01)を搭載した微弱無線送受信モジュールです。

モジュール化された製品はほとんどが中国製のものですが、製造元が違っても大体同じように使えます。

注意点

nRF24L01は、2.4GHz帯の帯域を使用してデータの授受を行う無線通信モジュールです。Amazonをはじめ色々な通販サイトで販売されているのですが、技適マークはついていません

日本の法律(電波法)では、無線基地局から3mの位置における電界強度が規定値(図参照)を超えるようであれば、特定小電力無線局という扱いになり免許が必要になります

この辺りはグレーですが、使用されるにあたっては自己責任でお願いします。また、nRF24L01の出力設定の方を”最小”にするなど、むやみに高出力化しないことをおすすめします。

総務省 電波利用ポータル
微弱無線局の規定 より抜粋

モジュールのピン配置は以下の通りです。

ピン番号ピン名内容
1GNDグラウンド(0V)
2VCC電源(+1.9〜+3.6V)
3CEチップイネーブル
(High: 5V、Low: 0V)
4CSNSPIチップセレクト
(High: 5V、Low: 0V)
5SCKSPIクロック信号
(High: 5V、Low: 0V)
6MOSIマイコン→nRF24l01 データ通信
(High: 5V、Low: 0V)
7MISOnRF24l01→マイコン データ通信
(High: 5V、Low: 0V)
8IRQ外部割り込み入力
(High: 5V、Low: 0V)
VCCへの入力電流について

nRF24l01が必要とする電流量(IVCC)は、出力する電波強度や通信速度によって変わりますが、20mA以上の入力が可能であれば問題なさそうです。

[STEP 2] 接続方法

Arduino Uno R4 WiFiと接続する場合を例にして説明します。

Arduino Uno R4 WiFinRF24l01
GNDGND
3V3VCC
D9 (ピン番号:9)CE
SSLA0 (ピン番号:10)CSN
COPIA (ピン番号:11)MOSI
CIPOA (ピン番号:12)MISO
RSPCKA (ピン番号:13)SCK
未接続IRQ

nRF24l01のVCCGNDを電源供給先に繋ぎます。このとき、マイコンから20mA以上の電流供給ができるなら、マイコンの3.3V出力に繋いでもOKです。(もし足りない場合は、別途電源モジュールを用意して繋ぐようにしてください。

そして、SCKはクロック信号なのでRSPCKAに、MISOはマイコン→nRF24l01へのデータ転送なのでCIPOAに、MOSIはnRF24l01→マイコンへのデータ転送なのでCOPIAに、CSNはチップセレクト信号なのでSSLA0に、CEはイネーブル信号でありポート出力ができるピンならどこでもよいのでD9に接続します。

なお、割り込み入力のIRQは特に使用しないので、未接続状態にしておきます。

[STEP 3] 通信仕様

無線通信仕様

動作周波数帯2.4GHz ISMバンド
伝送速度最大2Mbps
通信距離100m(屋外平地)
変調方式GFSK

SPI通信仕様

インターフェース4線式SPIインターフェース
伝送速度最大8Mbps
バッファデータ送信用:32Byte FIFO(3本)
データ受信用:32Byte FIFO(3本)
通信プロトコルについて

SPI通信はnRF24l01の定めるプロトコルに従う必要がありますが、本記事ではArduinoのnRF24l01ライブラリを使用するのでプロトコルに関する説明は割愛します。

知りたい方はデータシートをご参照ください。

nRF24l01のデータシート

[STEP 4] プログラミング

ライブラリインストール

Arduinoで使えるnRF24l01用のライブラリとして『RF24』をインストールします。

コマンドパレットを開く
Arduino:Library Managerを開く
検索ボックスに『rf24』を入力してライブラリを検索する
『RF24』の最新版を選択してインストールする
メッセージに[Done]とあればインストール完了

※文字化けは環境設定によるもので、インストールの不備ではありません。

ライブラリの使い方

RF24クラスのインスタンス生成
SPI通信開始

SPI通信が開始できないようであれば「radio hardware is not responding!!」というメッセージを表示して無限ループに入るようにします。

電波強度設定

電波強度を低に設定しています。

送信失敗時のリトライ回数設定

250us×15=4000us(4ms)間隔で、最大15回送信リトライを行うよう設定しています。

書き込み用パイプの開放

5Byte以下の任意のアドレスでパイプを開きます。

読み取り用パイプの開放

1番パイプを任意のアドレスで開きます。

片方向だけの通信であれば0番パイプを使用してもよいですが、双方向通信をする場合はパイプを分けておくことをおすすめします。ここでは読み取り用パイプを1番にしています。

0番パイプは書き込み(送信)に使用するようなので、読み取り(受信)にも0番パイプを使っちゃうとwrite()を実行する前にいちいちopenWritingPipe()を呼び出す必要があったりと煩雑なようです。

データの送信

write()でmessageの文字列を送信します。

また、片方向だけの通信であれば本来stopListening()は不要ですが、双方向通信では必要なので一応クセ付けのため呼び出しています。

データの受信

startListening()でリッスンを開始して、available()で読み取り可能なバイトがあるかを確認し、もしあればread()でバイトを読み取ります。

[STEP 5] 動作確認

2台のArduinoを用意し、それぞれを送信機・受信機としてテキストを無線転送するプログラムを作ってみます。

STEP2の接続方法にしたがって2台のArduinoをそれぞれnRF24l01に接続します。

送信側にはボタンを付け、ボタンを押したら送信側から受信側に「Button pushed!」という文字列を送るように設計します。

送信側プログラム

受信側プログラム

送信するデータをJSON形式にすればオブジェクトデータの形で送信することもできるので、活用方法はもっと広がりそうです。

実際の動き

みなさんも是非nRF24l01で通信を無線化して楽しんでみてください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です