- nRF24L01RFモジュールを理解する
- nRF24L01とArduinoのインターフェース
- 受信側:Arduino UnonRF24L01モジュール接続
- 送信機側:Arduino NanonRF24L01モジュール接続
- nRF24L01 +ワイヤレストランシーバモジュールの操作
- Arduino用のnRF24L01のプログラミング
- nRF24L01をワイヤレスで使用したサーボモーターの制御
モノのインターネット(IoT)、インダストリー4.0、マシンツーマシン通信などがますます普及する一方で、ワイヤレス通信の必要性が高まっており、クラウド上で相互に通信するマシン/デバイスが増えています。設計者は、Bluetooth Low Energy(BLE 4.0)、Zigbee、ESP43 Wi-Fiモジュール、433MHz RFモジュール、Lora、nRFなどの多くのワイヤレス通信システムを使用しており、メディアの選択は、使用されているアプリケーションのタイプによって異なります。
とりわけ、ローカルネットワーク通信に人気のあるワイヤレスメディアの1つはnRF24L01です。これらのモジュールは、ボーレートが250Kbpsから2Mbpsの2.4GHz(ISM帯域)で動作します。これは多くの国で合法であり、産業および医療アプリケーションで使用できます。また、適切なアンテナがあれば、これらのモジュールはそれらの間で最大100メートルの距離を送受信できると主張されています。面白いですね!!?したがって、このチュートリアルでは、これらのnRF24l01モジュールと、Arduinoなどのマイクロコントローラープラットフォームとのインターフェイス方法について詳しく学習します。また、このモジュールの使用中に一般的に直面する問題のいくつかの解決策を共有します。
nRF24L01RFモジュールを理解する
nRF24L01モジュールは、あるトランシーバモジュールの両方の送信を各モジュールにできることを意味し、データを受信するが、それらがあるので、それらのいずれかの時間でデータを送信または受信することができる半二重。このモジュールには、データの送受信を担当する北欧の半導体製の汎用nRF24L01ICが搭載されています。 ICはSPIプロトコルを使用して通信するため、任意のマイクロコントローラーと簡単にインターフェースできます。ライブラリはすぐに利用できるので、Arduinoを使用するとはるかに簡単になります。標準のnRF24L01モジュールのピン配列を以下に示します。
モジュールからの動作電圧に有する3.6Vまで1.9V(典型的には3.3V)とのみの非常に少ない消費電流12ミリアンペアそれ電池効率的ひいてはもコインセルで実行できるなり、通常動作時。動作電圧は3.3Vですが、ほとんどのピンは5Vトレラントであるため、Arduinoなどの5Vマイクロコントローラーと直接接続できます。これらのモジュールを使用するもう1つの利点は、各モジュールに6つのパイプラインがあることです。つまり、各モジュールは他の6つのモジュールと通信して、データを送受信できます。これにより、モジュールはIoTアプリケーションでスターネットワークまたはメッシュネットワークを作成するのに適したものになります。また、125の一意のIDの広いアドレス範囲を持っているため、閉じた領域では、これらのモジュールのうち125を互いに干渉することなく使用できます。
nRF24L01とArduinoのインターフェース
このチュートリアルでは、一方のArduinoに接続されているサーボモーターを制御して、もう一方のArduinoのポテンショメーターを変更することにより、nRF24L01をArduinoに接続する方法を学習します。簡単にするために、1つのnRF24L01モジュールを送信機として使用し、もう1つを受信機として使用しましたが、各モジュールはデータを個別に送受信するようにプログラムできます。
nRF24L01モジュールをArduinoに接続するための回路図を以下に示します。バラエティについては、受信機側にUNO、送信機側にNanoを使用しました。ただし、接続のロジックは、ミニ、メガなどの他のArduinoボードでも同じです。
受信側:Arduino UnonRF24L01モジュール接続
前に述べたように、nRF24L01はSPIプロトコルの助けを借りて通信します。Arduino NanoおよびUNOでは、ピン11、12、および13がSPI通信に使用されます。したがって、MOSI、MISO、およびSCKピンをnRFからピン11、12、および13にそれぞれ接続します。ピンCEとCSはユーザーが構成できます。ここでは、ピン7と8を使用しましたが、プログラムを変更することで任意のピンを使用できます。nRFモジュールはArduinoの3.3Vピンから給電されます。これはほとんどの場合動作します。そうでない場合は、別の電源を試すことができます。nRFとのインターフェースとは別に、サーボモーターをピン7に接続し、Arduinoの5Vピンを介して電力を供給しました。同様に、送信回路を以下に示します。
送信機側:Arduino NanonRF24L01モジュール接続
トランスミッターの接続も同じです。さらに、Arduinoの5Vadグラウンドピンの両端に接続されたポテンショメーターを使用しました。0〜5Vの範囲で変化する出力アナログ電圧は、NanoのA7ピンに接続されています。両方のボードは、USBポートを介して給電されます。
nRF24L01 +ワイヤレストランシーバモジュールの操作
ただし、nRF24L01をノイズなしで動作させるために、次のことを検討する必要があります。私はこのnRF24L01 +に長い間取り組んできましたが、壁にぶつかるのを防ぐのに 役立つ次の点を学び ました。モジュールが通常の方法で機能しなかったときに、これらを試すことができます。
1.市場に出回っているnRF24L01 +モジュールのほとんどは偽物です。EbayとAmazonで見つけることができる安価なものは最悪です(心配しないでください、いくつかの調整でそれらを機能させることができます)
2.主な問題は、コードではなく電源です。オンラインのコードのほとんどは正しく機能します。私自身、個人的にテストした機能するコードがあります。必要な場合はお知らせください。
3. NRF24L01 +として印刷されるモジュールは、実際にはSi24Ri(はい、中国製品)であるため、注意してください。
4.クローンモジュールとフェイクモジュールはより多くの電力を消費します。したがって、Si24Riの消費電流は約250mAになるため、nRF24L01 +データシートに基づいて電源回路を開発しないでください。
5.電圧リップルと電流サージに注意してください。これらのモジュールは非常に敏感で、簡単に焼損する可能性があります。(;-(これまでに2つのモジュールを揚げた)
6.モジュールのVccとGndの間に2つのコンデンサ(10uFと0.1uF)を追加すると、電源を純粋にするのに役立ち、これはほとんどのモジュールで機能します。
それでも問題がある場合は、コメントセクションで報告するか、これを読んだり、フォーラムで質問したりしてください。
また、nRF24L01を使用したチャットルームの作成に関する以前のプロジェクトも確認してください。
Arduino用のnRF24L01のプログラミング
GitHubでmaniacbugによって作成されたライブラリがすぐに利用できるため、これらのモジュールをArduinoで使用するのは非常に簡単です。リンクをクリックしてライブラリをZIPフォルダーとしてダウンロードし、[スケッチ]-> [ライブラリを含める] -> [。ZIPライブラリの追加]オプション を使用してArduinoIDEに追加し ます。ライブラリを追加した後、プロジェクトのプログラミングを開始できます。2つのプログラムを作成する必要があります。1つは送信機側用で、もう1つは受信機側用です。ただし、前に述べたように、各モジュールは送信機と受信機の両方として機能します。どちらのプログラムもこのページの最後にあります、送信機コードでは受信機オプションがコメント化され、受信機プログラムでは送信機コードがコメント化されます。モジュールが両方として機能する必要があるプロジェクトを試行している場合に使用できます。プログラムの動作を以下に説明します。
すべてのプログラムと同様に、ヘッダーファイルをインクルードすることから始めます。nRFはSPIプロトコルを使用するため、SPIヘッダーとダウンロードしたライブラリも含まれています。サーボライブラリは、サーボモーターを制御するために使用されます。
#include
次の行は、CEピンとCSピンについてライブラリに指示する重要な行です。回路図では、CEをピン7に接続し、CSをピン8に接続しているため、ラインを次のように設定します。
RF24 myRadio(7、8);
RFライブラリに関連付けられているすべての変数は、複合変数構造として宣言する必要があります。このプログラムでは、変数 msg を使用してRFモジュールとデータを送受信します。
構造体パッケージ { intmsg; }; typedef structpackageパッケージ; パッケージデータ;
各RFモジュールには、それぞれのデバイスにデータを送信するために使用できる一意のアドレスがあります。ここではペアが1つしかないため、送信機と受信機の両方でアドレスをゼロに設定しますが、複数のモジュールがある場合は、IDを任意の一意の6桁の文字列に設定できます。
バイトアドレス= {"0"};
次に、 voidセットアップ 関数内で、RFモジュールを初期化し、ノイズのない115バンドで動作するように設定し、モジュールを250Kbpsの最小速度で最小消費電力モードで動作するように設定します。
void setup() { Serial.begin(9600); myRadio.begin(); myRadio.setChannel(115); // WIFI信号より上の115バンド myRadio.setPALevel(RF24_PA_MIN); // 最小 電力低怒りmyRadio.setDataRate(RF24_250KBPS); //最小速度myservo.attach(6); Serial.print( "セットアップが初期化されました"); delay(500); }
void WriteData() 関数は、渡されたデータを書き込みます。前に述べたように、nRFにはデータの読み取りまたは書き込みが可能な6つの異なるパイプがあります。ここでは、データを書き込むためのアドレスとして0xF0F0F0F066を使用しました。受信側では、書き込まれたデータを受信するために、 ReadData() 関数で同じアドレスを使用する必要があります。
void WriteData() { myRadio.stopListening(); //受信を停止し、 送信 を開始しますmyRadio.openWritingPipe(0xF0F0F0F066); //この40ビットアドレスでデータを 送信しますmyRadio.write(&data、sizeof(data)); delay(300); }
void WriteData() 関数はデータを読み取り、それを変数に入れます。ここでも、ここでデータの読み取りまたは書き込みを行うことができる6つの異なるパイプのうち、データを読み取るためのアドレスとして0xF0F0F0F0AAを使用しました。これは、他のモジュールの送信機がこのアドレスに何かを書き込んだため、同じアドレスから読み取っていることを意味します。
void ReadData() { myRadio.openReadingPipe(1、0xF0F0F0F0AA); //読み取るパイプ、40ビットアドレス myRadio.startListening(); // Transmintingを停止し、Reveicingを開始します if(myRadio.available()) { while(myRadio.available()) { myRadio.read(&data、sizeof(data)); } Serial.println(data.text); } }
これらの行とは別に、プログラムの他の行は、POTを読み取り、マップ機能を使用して0から180に変換し、それに応じてサーボを制御するレシーバーモジュールに送信するために使用されます。サーボインターフェースのチュートリアルですでにそれを学んだので、私はそれらを一行ずつ説明していません。
nRF24L01をワイヤレスで使用したサーボモーターの制御
プログラムの準備ができたら、送信機と受信機のコード(以下に記載)をそれぞれのArduinoボードにアップロードし、USBポートで電源を入れます。両方のボードのシリアルモニターを起動して、送信されている値と受信されている値を確認することもできます。送信機側のPOTノブを回したときにすべてが期待どおりに機能している場合は、反対側のサーボもそれに応じて回転するはずです。
プロジェクトの完全な動作は、以下のビデオで示されています。これらのモジュールが最初の試行で機能しないのはごく普通のことです。問題が発生した場合は、コードと配線を再度確認し、上記のトラブルシューティングガイドラインを試してください。何も機能しない場合は、フォーラムまたはコメントセクションに問題を投稿してください。解決を試みます。