11月25日発売 書籍『Arduinoと3Dプリンタでロボットを作ろう』を出させて頂きました!

【電子工作】無線モジュールnRF24L01を使いArduino間で無線通信をやってみる!

ArduinoやRaspberry Piなど電子工作で使うマイコンボードで無線通信が出来ると非常に便利となります。

電子工作という趣味をはじめてからその用途で3Dプリンタも導入しました。
電子工作に3Dプリンタってホント最強のコンビですね!

3Dプリントパーツを使いこれまでいろいろと作ってきました。
例えばこのような4足歩行ロボットを作りました。
非常に可愛い動きをしてくれセンサーで障害物を検知しながら部屋中を歩き回ってくれます。

Arduinoで動かす4足歩行ロボット製作ノート!Arduino学習に便利なロボくんなので使って下さい!【STLデータ公開】

まだブログでご紹介出来ていませんが、こちらはDCモーターを使ったミニラジコンです。
こちらも障害物を避けクルクル回りながら動きまわってくれます。

そして最近ではロボットアームの製作なんかもしています。

【電子工作/Arduino】3Dプリントパーツで作るロボットアームに挑戦!その①

このようにArduinoなどマイコンボードを使って動くものを製作する際に無線通信が使えると、製作物を自在に動かせるラジコンのように操作することも可能となり便利となるかと思います。

ドローンという趣味もやっていることから手元に送信機や受信機がたくさんあります。
これまで無線で操作する場合、ドローン用の物を使い無線化していましたが電子工作用途ではあまり使い勝手がいいものではありませんでした。

通信プロトコルはFrskyというものを使っていますが、近距離だと頻繁にバインドが切れてしまいます。
これではデスクの上でプログラムやテスト動作させる場合は非常に面倒となります。

そんなことをたまにSNSで書いていると海外のいろんな方がArduinoで使える無線モジュールについて教えてくれました。
その中でも安価で国内サイトでも比較的入手しやすく便利なnRF24L01というモジュールを今回ご紹介したいと思います。

電子工作用途で無線通信するためのモジュールは、技適が通っているXBeeやWi-FiならESP-WROOM-02などを使うことが多いようですが、製作物に組み込んで使う場合結構お高いモジュールとなります。

そこで今回は非常に安価に入手出来るnRF24L01無線モジュールを使ってみたいと思います。
中華サイトやAmazonでも入手する事が可能で、単価にして1個100~200円ほどと非常に安価なモジュールとなるので電子工作という趣味用途では非常に役立ちます。(技適の問題もあるので詳しくは後述します!)

Arduinoに接続しテスト動作させてみましたが、比較的簡単に使うことができ便利だったので自分への備忘録もかねこのnRF24L01モジュールについて書いておこうと思います。

Arduinoなどマイコンボードと接続して無線通信が出来るモジュールとして非常に便利なものとなります。

目次

nRF24L01モジュールを使ってArduinoで無線通信をしてみる

今回、nRF24L01という無線モジュールをArduinoと接続し無線通信をしてみたいと思います。
モジュール用のライブラリを使えば比較的簡単にArduinoで無線通信を行うことが出来ました。

このモジュールの概要とともにArduino間の無線通信によりLEDを点灯させたり、サーボモーターを動かす簡単な方法もご紹介したいと思います。

nRF24L01無線通信モジュール

こちらがnRF24L01モジュールとなります。
ノルディック社の2.4GHz帯トランシーバーチップnRF24L01を搭載した小型無線モジュールとなり、マイコンと組み合わせることによりダイレクトに無線による制御を行うことが出来ます。

ボーレートは250kbps~2Mbpsとなっており、アンテナはパターンアンテナとなっています。
ボーレートが低い場合、100mほど電波が届くようですね。

端子は8ピンのピンヘッダーが付いています。
モジュール(基盤)サイズは約30mm×14mmと非常に小型なので製作物に組み込むには便利なサイズ感だと思います。

Aliexpressなど海外サイトでは非常に安く売られています。(1個100円ほど)
また国内サイトやAmazonなどでも売られているので入手はしやすいかと思います。(今回ご紹介しているものはAmazonで購入したものとなります)

通信には2.4GHz帯を使って通信しています。
このあたり私はあまり詳しくないのですが、以前ドローンで使うVTXで技適申請をしたことがあります。
アマチュア無線の免許を取る際に覚えた記憶では、2.4GHz帯の場合3mで35μV/m以下だと日本の電波法では微弱無線として扱われ技適申請の必要がなかったような・・・

送信出力がそれ以上となると特定小電力無線局の扱いとなり技適と呼ばれる技術基準適合証明の取得が必要となってきます。
つまり自分で無線局として開局するということですね。

このnRF24L01モジュールは技適が取得されていないようです。
個人使用やテスト環境レベルであれば最大送信出力は0dBm(11mA)とあるので大丈夫そうではあるのですが・・・少しグレーな感じがしますが、あまり詳しくないのでご了承下さい。

ピンの配列

基本的にこのnRF24L01モジュールは2つペアで使う形となります。
送信側と受信側ということですね。(サーバー側/クライアント側)
Arduinoのライブラリを使いスケッチで記述する事により1つのモジュールを送信側/受信側に割り当てることが出来ます。

また双方向でのやり取りも可能となっています。
送信側で操作し、ラジコンなどに組み込んだ受信側で取得したセンサー情報などを送り返すなどの使い方も出来そうですね。

そして複数モジュールでのやり取りも可能となっています。
各モジュールは最大6つの他のモジュールと通信出来るようです。

nRF24L01モジュールのピン配列はこのようになっています。

ここで注意したいのが、nRF24L01モジュールの動作電圧は1.9~3.6Vとなっています。
Arduinoに直接接続する場合、電源は3.3Vラインに接続する必要があります。(5Vラインではないので注意して下さい!)

MEMO
電源以外の他のピンは5Vロジックとなっています。
そのためロジックレベルコンバーターなど使用せずにArduinoのデジタルピンと直接接続できます。

そしてこのnRF24L01モジュールは、上記ピン配列を見て分かるようにSPI通信でやり取りを行います。

ArduinoのSPI用ライブラリを利用する場合、Arduino側で使われるSPIピンはボードごとに決まっています
ArduinoにはUnoやNano、MegaなどいろいろとありますがSPI通信で使える端子には違いがあります。
こちらではArduino Unoを使って説明していきます。

Arduino Unoの場合SPIピンは、デジタルピン10番がSSデジタルピン11番がMOSIデジタルピン12番がMISOデジタルピン13番がSCLKとなっています。

またnRF24L01モジュールにはCSNピンCEピンがありますが、これは送信モードを切り替えるものでArduinoの任意のデジタルピンに割り振る(接続)する事が出来ます。(スケッチにより変更が可能)

以上によりArduinoとnRF24L01モジュールの接続はこのようになります。(MegaなどではSPIピンが異なるので注意して下さい)
※CE/CSN/ピンはデジタルピン7番と8番に割り振っています。(スケッチで変更可能です)

送信側/受信側のどちらのArduinoへも同様の接続となります。

 

nRF24L01モジュールArduino Uno
1.GNDGND
2.Vcc3.3V
3.CEデジタルピン7
4.CSNデジタルピン8
5.SCKデジタルピン13
6.MOSIデジタルピン11
7.MISOデジタルピン12
8.IRQ未接続

一応、Arduino NanoとMegaのSPIピンも書いておきます。

ArduinoSCKMISOMOSISS
Uno13121110
Nano13121110
Mega52505153

また今回行ったテスト動作では特に大きな問題はなかったのですが、無線モジュールはノイズの影響を大きく受けます。

Arduinoの3.3Vラインやブレッドボードでの配線等によりノイズが発生して動作が不安定になるといった話も聞きました。
動作が不安定になるようならモジュールのVcc/GND間にパスコン(バイパスコンデンサ)を付けるのがいいようです。

後述する双方向でのやり取りの際、ジャンパーワイヤーの本数が増えたためかサーボモーターが不安定な動きを見せる時がありました。
10μFほどのパスコンを入れることにより問題なく動作するようになりました。(テストレベルでは入れる必要はないとは思いますが!)

またnRF24L01モジュール用のソケットアダプターというものもあるようですね。
レギュレーターが内蔵されArduinoの5Vラインが使え、ノイズ対策などもされているようです。
基盤にビス穴もあり製作物に組み込みたい場合はソケットを装着すれば便利そうですね。(試してみます)


【追記】アダプアターを試してみました!
Arduinoからの5Vラインが使え、SPIピンもシルク印字されているので分かりやすいですね!

モジュール単体で使うより接続も簡単に行えます。

nRF24L01モジュールで使えるArduinoライブラリ

Arduinoへの接続が出来ればスケッチを書いていきますが、まずその前にArduinoでnRF24L01モジュールを使うためのライブラリをインストールしておきます。

ライブラリのダウンロードはこちらから。

参考 nRF24/RF24GitHub

スケッチ内に上記ライブラリをインクルードして準備は完了です。

Arduino間の無線通信でLEDを点灯させてみる

それでは簡単なスケッチを使いArduino間の無線通信のテストを数パターンやってみたいと思います。
送信側(サーバー側)と受信側(クライアント側)の2つのArduino Unoを使います。
共に上記を参考にnRF24L01モジュールを接続しておきます。

まずはLEDを点灯させる簡単なスケッチを作ってみました。
送信側に接続したタクトスイッチを押すと受信側に接続したLEDが点灯するという簡単なものです。

接続(送信側)

送信側の接続はこのようになります。

送信側のタクトスイッチはArduinoにより内部プルアップさせています。
プルアップ・プルダウンに関してはこちらを参考にして下さい。

【Arduino入門編⑤】プルアップ・プルダウンって何?デジタル入力の解説です!

接続(受信側)

次に受信側は制限抵抗(150Ωほど)を1本使いデジタルピン3にLEDを接続しています。

スケッチ(送信側)

スケッチはこのような簡単なものを作ってみました。
送信側のスイッチを押すと受信側のLEDが点灯するという単純なものです。

スケッチ(受信側)

実際の動作を確認

上記スケッチを各Arduinoで動かすとこのように動作します。
スイッチの状態を送信しもう1台のArduinoで受信してLEDを点灯させています。
遅延等もなく上手く動作しているようです!

スケッチ解説

簡単にスケッチを解説しておきます。

まずnRF24L01モジュールを使うためのライブラリのインクルードです。

CEピンとCSNピンを指定します。
任意のデジタルピンが使えます。
Arduino UnoでSPI通信をするための接続ピンは先述のように決まっているので、その他空いている7ピン・8ピンを使いました。

データを送信するアドレスを指定。
任意の5文字の文字列で指定します。
複数のモジュール間でのやり取りが可能なので、どの受信機と通信するかを選択しています。
受信機側でも同じアドレスを指定する必要があります。

無線オブジェクトの初期化。

データを送受信するアドレスを指定。
(送信側)

(受信側)

パワーアンプレベルを最小に設定。
高いレベルで動作させる場合は電圧が安定するようにモジュールのVcc/GND間にバイパスコンデンサを接続するのがいいようです。

送信と受信の設定。
(送信側)

(受信側)

あとはradio.writeでデータを送信し、radio.readで読み取っています。
簡単ですね!

Arduino間の無線通信でサーボモーターを動かしてみる

次に同様の手順でサーボモーターを動かしてみたいと思います。
送信側にジョイスティックを接続し、受信側に接続したサーボモーターを動かします。
ラジコンのコントローラーみたいな感じですね。


接続(送信側)

ジョイスティックからのアナログ値をアナログピンA0に入力し、A/D変換により0~1023までの数値を送信します。

接続(受信側)

受信した数値をサーボモーターの動作角度(0~180°)にマッピングし動かします。

スケッチ(送信側)

スケッチ(受信側)

実際の動作を確認

ジョイスティックのアナログ値を送信し上手くサーボモーターを動かせていますね。

また、シリアルモニタを立ち上げると現在のサーボ角度が表示されます。
ここまで出来ると、Arduinoを使った簡単なラジコンやロボットカーなどに応用できいろいろと楽しめそうですね!

スケッチ解説

無線モジュールに関する部分は、先ほどのLED点灯の時と全く同じですね。

送信側のジョイスティックで取得した値をArduinoのアナログピンに入力し0~1023の数値に変換し(A/D変換)、その数値を送信しています。
ジョイスティックによるアナログ値の取得方法に関してはこちらの記事を参考にして下さい!

【Arduino入門編⑦】ジョイスティックの制御方法!デジタル・アナログ入力の解説です!

また、受信側は取得した数値をマッピングしサーボモーターの可動範囲(0~180°)に変換して動かしています。
ジョイスティックを使ったサーボモーターの制御方法に関してはこちらの記事を参考にして下さい!

【Arduino入門編⑯】サーボモーターをジョイスティックやシリアルモニタから動かしてみる!

双方向通信でサーボモーターを動かしてみる

最後に双方向でのやり取りをやってみたいと思います。
今回使っているnRF24L01モジュールは、先ほどの例のように送信側・受信側を決めて無線通信する以外にモジュールの送信・受信を入れ替え双方向でのやり取りを行うことも出来ます。

その例として送信側・受信側双方にジョイスティックとサーボモーターを繋げ、一方のジョイスティックで他のサーボモーターを動かしてみたいと思います。

接続(送信側・受信側)

接続は送信側・受信側ともにこちらを使用します。

スケッチ(送信側)

スケッチ(受信側)

実際の動作を確認

これまでと違うのは双方向でやり取りしているという点です。
nRF24L01モジュールは送信にも受信にも両方使えるのが便利ですね!

スケッチ解説

2つのアドレスを使い双方向でやり取りをしています。

送信側・受信側でアドレスを一致させておく必要があります。

(送信側)

(受信側)

(送信)radio.openWritingPipe(address[1]) → (受信)radio.openReadingPipe(1, address[1])
という感じですね。

あとはvoid loop()内で送信[radio.stopListening();]・受信[radio.startListening();]を切り替えてデータの送信&受信を繰り返しています。

【追記】複数データの送信で使ってみる!

「複数のサーボモーターを遠隔で操作したい時、どうすればいいですか?」
というご質問を下記コメント欄に頂きました。

片方向でのデータのやり取りや双方向でのやり取りは簡単な作例をご紹介していました。
コメント頂いたものがどのような用途を想定しているのか分かりませんが、複数データを送信する簡単な作例を追記しておきます。

上記ジョイスティックを使ってサーボモーターを動かす作例では、Y方向(またはX方向)のみのデータを送信し1つのサーボモーターを動かしました。
送信するデータを増やしX方向・Y方向の2つのデータを送信し、受信側はそれに対応したサーボ①とサーボ②を動かすといった作例となります。

接続の追加として送信側Arduinoではアナログ入力端子A1にジョイスティックのX方向(またはY方向)を追加接続し、受信側Arduinoのデジタル端子D4にサーボモーターをもう1本追加で接続しています。

送信側・受信側スケッチは一部スケッチを追加&修正しています。
ジョイスティックで取得したX方向・Y方向の値を配列(変数)に格納してそれぞれ送信、そして受信側も同様にデータを受け取り対応したサーボモーターを動かすといった内容です。
非常に簡単です!

スケッチ(送信側)

スケッチ(受信側)

遅延もなくジョイスティックの操作によりそれぞれ対応したサーボモーターを動かすことが出来ていますね!

【追記】nRF24L01を安定動作させるための方法!

本記事やSNSで、nRF24L01についてこれまで多くのコメントやご質問等を頂きました。

「無線接続が安定しない時がある」「ESPとのデータのやり取りは出来るのか?」など頂きました。
追記という形で別記事でこれらを簡単にまとめてみました。
本記事と合わせて読んで頂けると理解もしやすいかと思います。

【電子工作】nRF24L01無線モジュールを安定動作させるための方法!

【追記】無線モジュールnRF24L01を使ったロボットカーの製作!

今回ご紹介している無線モジュールnRF24L01を使ったロボットカーを製作しました!

Arduino Uno・L298Nモータードライバ・DCモーター・超音波センサーHC-SR04というシンプルな構成で作れる最小サイズでモデリングし、片手に乗るサイズのミニロボットカーとなっています。

【電子工作】3Dプリントパーツ・Arduinoで動かすスマートカー(ロボットカー)製作ノート!

無線モジュールnRF24L01を組み込み自在に動くミニラジコンとして動かすことも出来ます。

【追記】nRF24L01無線モジュール用ブラケットを作ってみました!

今回ご紹介したnRF24L01無線モジュールは、電子工作用途で非常に便利に使え個人的にこれから使う機会が増えてくると思います。

しかしこのモジュールボードには固定するためのネジ穴などが用意されていません。
何か製作物に組み込む場合、固定できるブラケットがあると便利となります。

またテスト動作させる場合もピンヘッダーにジャンパワイヤを使って接続している場合、その接触(ノイズなども)により動作が不安定になる場面もありました。

前者の製作物に組み込む用途でnRF24L01無線モジュール用のブラケットを作ってみましたが、テスト動作などさせる場合もブラケットを取り付けネジ固定や底面に両面テープなどで固定すれば使いやすくなるかと思います。

データはThingiverseの方にアップしているので、興味ある方は使ってみて下さい!

【Arduino】無線モジュールnRF24L01固定用ブラケットを作ってみました!【STLデータ公開】

【追記】無線モジュールnRF24L01とジョイスティックシールドのコンビが便利!

ブレッドボードを使いアナログジョイスティックやタクトスイッチなどを接続するには結構な数のワイヤーが必要となってきます。
ジョイスティックシールドに無線モジュールnRF24L01を組み込むと簡単に簡易無線コントローラーとして使え便利となります。

また本記事では作例としてご紹介していませんでしたが、複数データの送信方法は?といった問い合わせを頂いたので簡単なスケッチも紹介しています。

【Arduino】ジョイスティックシールドを使ってみる!無線モジュール(nRF24L01)とのコンビで便利に使えます!

簡単な構成のシールドですが、無線モジュールと組み合わせることによりいろいろと便利に使えそうですね!

【追記】Arduino NanoにnRF24L01モジュールが一体化したRF-Nanoを試してみました

Arduino Nano互換ボードにnRF24L01無線モジュールが一体化したRF-Nanoを試してみました。

nRF24L01は便利な無線モジュールですが組み込みの際にその配線の煩わしさがあります。
RF-NanoはArduinoボードに無線モジュールが一体化しているので便利に使えます!

【RF-Nano】Arduino Nano互換ボードとnRF24L01無線モジュールが一体化した便利なArduinoボードです!

【追記】Bluetoothモジュールも試してみました!

Arduinoを手軽に無線通信化するためにBluetoothモジュールも試してみました。

nRF24L01はSPIでのやり取りとなりますが、、HC-05HC-06などのBluetoothモジュールはUARTによるやり取りとなります。
UARTによるやり取りなので信号線が2本(送信:TX/受信:RX)のみの接続で出来るので比較的簡単に使うことが出来ました。

こちらは以前製作した4足歩行ロボットくんにBluetoothモジュールを組み込んでPCから操作しています。
専用ライブラリなど必要とせずArduinoとは通常のシリアルでのやり取りで使える便利なモジュールとなります。

Arduinoで動かす4足歩行ロボット製作ノート!Arduino学習に便利なロボくんなので使って下さい!【STLデータ公開】

複数デバイスとの無線でのやり取りが出来るnRF24L01は便利な無線モジュールです。
そしてBluetoothモジュールでの接続はさらに手軽に製作物に組み込んだり出来そうです。
ともに便利な無線モジュールですが、技適が取得されていないのが残念ですね。

Arduinoを使いBluetooth通信をやってみる!HC-05/HC-06 Bluetoothモジュールの使い方!
【Arduino入門編㉖】UARTシリアル通信の基礎知識!Arduino間でのデータのやり取りなどをやってみる!

【追記】Wi-Fiモジュールも試してみました!

Arduinoに接続して使える無線通信用モジュールとしてWi-Fiモジュールも試してみました。

ESP8266(ESP-01)はArduinoで使える便利な小型Wi-Fiモジュールです。
外観はnRF24L01によく似ていますが、このモジュールが面白いのはArduinoと接続してWi-Fiモジュールとして使う以外にESP-01にスケッチを書き込み単体で動かすことも出来ます。
こうなるとWi-Fi機能を持ったミニArduinoって感じですね!

スマホアプリからArduinoを操作する方法などもご紹介しています。

詳しくはこちらの記事をご覧下さい!

【Arduino】Wi-FiモジュールESP-01を使いArduinoをスマホ「RemoteXYアプリ」で操作してみる![ESP8266(ESP-01)/HC-05/HC-06など]

【追記】ミニシールドを作ってみました!

nRF24L01は便利な無線モジュールなので製作物に取り付けたりとよく使っています。

しかしテストなどで使いたい場合でSPIでの接続が結構面倒で手間となることから、Arduino Unoに取り付けできるミニシールドを作ってみました。

こちらの記事も参考になればと思います。

【Arduino】初めてのArduinoシールドの製作!無線モジュールnRF24L01用ミニシールドを作ってみました

【追記】nRF24L01を使ったArduino無線コントローラーの製作!

以前製作した有線タイプのジョイスティックコントローラーをベースにArduinoとnRF24L01モジュールを使ったArduino Controllerを製作しました。

電子工作で作った製作物や、また複数スイッチやジョイスティックを使ったテスト動作などで便利に使える無線コントローラーとなります。

nRF24L01無線モジュールはWi-FiやBluetoothと比べ接続が非常に早いので、このような無線コントローラーには最適なモジュールですね!

【電子工作】Arduinoを使った無線コントローラー(送信機)製作ノート①!KiCadの基板設計から基板発注(JLCPCB)までの話(nRF24L01)

最後に!

電子工作用途で非常に便利に使える無線モジュールです。
ライブラリを使えば比較的簡単に扱えるのもいいですね。

今回ご紹介しきれませんでしたが、このように1つのArduinoから複数のモジュールとのやり取りも出来ます。

先述のように技適に関しては取得されていないのが残念ではありますが・・・個人レベルでのテスト環境での使用にとどめておきます。

そして、これまで作ったものを無線化出来たらまた楽しい遊び方もできそうです。
という事でこのへんで・・・

8 COMMENTS

東京バード

ありがとうございますm(__)m
そうですよね、Wi-FiやBluetoothモジュールなどと比べこのモジュールは結構電波飛んじゃうんですよね!

電子工作用途ではないのですが、ドローンのVTX(5.8GHz帯)で何度か技適、開局申請はやってその手順自体は分かるので・・・便利なモジュールなので技適取れるなら取っちゃってもいいかなとは思っていますが・・・

ご丁寧に、ありがとうございます。

返信する
rikuto yamamoto

知識がないため,検討違いな質問をしていたら申し訳ありません。
このモジュールを用いて,データ収集装置として使用することは可能でしょうか。
具体的には,一方でデータ収集(複数のアナログ入力)を行い,もう一方で,PCでデータ表示を行いたいと考えております。

返信する
Suzkui Yasuaki

やってみたらうまく行きました!
記事更新までわざわざありがとうございます!
今後もこのブログを参考にしていくと思いますのでよろしくお願いしますm(._.)m

返信する
Suzkui Yasuaki

返信ありがとうございます!
用途としては4つのサーボを2つのジョイスティックでそれぞれx、y方向に操作してみたいんですがスケッチに追加してみてもなかなか動いてくれなくて…
ラジコン用の送受信機を自作してみたくていろいろやっております

返信する
東京バード

ラジコン用の自作送信機、いいですねー!

ジョイスティックを1つ使いX方向・Y方向2つのサーボを動かす例を追記しました。
簡単なテストスケッチとなりますが、これだけでも上手く機能するようです。
もう1台ジョイスティックを追加しても理屈は同じなので対応出来るかと思います。

簡単なスケッチなので想定している用途で使えるか分かりませんが、参考になればと思いますm(__)m

返信する
東京バード

コメントありがとうございます。

「複数のサーボを遠隔で動かしたい場合?」
どのような事を想定しているか分かりませんが・・・基本的には本記事でご紹介したものをベースにスケッチを追加して頂ければ出来ます。
自作した2足歩行ロボットではジョイスティックから取得した複数の値を送信してそれぞれ対応した動作をさせたりしました。

本記事での例ではジョイスティックを使って1つのサーボモーターを制御していますが、例えばX軸・Y軸2つの状態を送信して2つのサーボを制御するということもスケッチを一部修正すれば出来ます。

簡単な方法として送信したい複数の値(データ)を配列(変数)に格納して順次送信して、受信側も同様に受け取りそれぞれのサーボを動かすといった感じです。

想定されている用途が分からないので具体例やうまく説明が出来ませんが・・・、スイマセン!

返信する

東京バード へ返信する コメントをキャンセル