11月26日発売 書籍『わかる!電子工作』にArduinoで動かす4足歩行ロボットを掲載して頂きました!

【電子工作】無線モジュール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ラインが使え、ノイズ対策などもされているようです。
基盤にビス穴もあり製作物に組み込みたい場合はソケットを装着すれば便利そうですね。(試してみます)

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();]を切り替えてデータの送信&受信を繰り返しています。

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

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

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

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

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

最後に!

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

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

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

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

コメントを残す