RFモジュールは、433MHzのRF送信モジュールと受信モジュールで構成されています。 これらはASK(Amplitude shift keying)またはOOK(Of Hook Keying)タイプのRFモジュールです。 ロジックゼロを送信している間、送信機はキャリア周波数を完全に抑圧するため、バッテリー動作時の消費電力はわずかです。 ロジック1が送信されると、送信機はONになり、キャリア周波数がフルになるため、3V電源で約4.5mAという高い電力が供給されます。
送信機と受信機は、データ転送用にマイクロコントローラーとのインターフェイスが必要です。 データは送信機からシリアルに送信され、同調した受信機で受信されます。 RF送信機はマイコンからシリアルデータを受信し、送信機の4番ピンに接続されたアンテナを通して受信機に送信します。 受信機はアンテナを通してデータを受信し、それに接続されているマイクロコントローラにデータを与えます。
These RFモジュールは433MHzの特定の周波数で動作します。 RF信号は、障害物がある場合でも、送信機と受信機の間を移動することができます。 これらのモジュールは、短距離、低予算、シンプレックス・ベースの通信に使用されます。 消費電力が低いため、バッテリーベースの実装に最適です。 遠隔照明制御、長距離RFID、ワイヤレスアラームやセキュリティシステムなど、さまざまな分野で使用されています。 RF通信はモバイル通信に使用され、長距離通信が可能であるため、IoTベースのアプリケーションの構築に適しています。
433 MHz RFトランスミッタモジュール
この小さなモジュールが、RFトランスミッタです。 非常にシンプルです。 433.xx MHzで動作するように調整されたSAWレゾネータがモジュールの中心部です。 DATA入力にロジックHIGHが与えられると発振器がONとなり、433.xx MHzの一定のRF出力搬送波を生成し、DATA入力にロジックLOWが与えられると発振器がOFFとなり、搬送波は生成されません。
仕様
- 動作電圧:3V~12V
- 動作電流:最大40mA未満、最小9mA
- 共振モード:1.5V~2.5V
- 動作電圧:1.5V~2.0V
- 仕様 [ASK(振幅シフト・キー・)動作] [8442] [4641】 [共振モードの選択 (SAW)
- 変調モード: ASK
- 動作周波数: 433.92MHz
- 送信電力: 25mW
- 周波数誤差。 +150kHz(最大)
- 速度:10Kbps以下
- 送信範囲:90m(オープンスペース)
433 MHz RFレシーバーモジュール
これがRFレシーバーモジュールである。 複雑そうに見えても、送信モジュールと同じようにシンプルです。 RFチューナ回路、OPアンプ、PLLで構成されています。 送信機から受信した搬送波を数個のOPアンプで増幅しています。 増幅された信号はPLL(フェーズ・ロック・ループ)に送られ、デコーダがデジタル・ビット・ストリームに「ロック」することで、より良いデコード出力とノイズ耐性を得ることができます。 OOK/ASK
必要コンポーネント
- Arduino Nano (2)
- RF 433MHz受信モジュール
- ポテンショメータ
- 接続線
RF 433MHz送信モジュール
。
LED(5個)
回路図
Arduino Nanoを使ったRF送信機の回路図は以下のとおりです。 ここでは、ポテンショメータを接続し、RFトランスミッタを使用して受信機に送信する値を変化させます。
RF トランスミッタと Arduino のピン接続の詳細は以下の通りです
- Arduino の D12 ピン – RF トランスミッタの DATA ピン
- Arduino の VCC – RF トランスミッタの VCC
- GND – RF トランスミッタの GNDArduinoのGND-ポテンショメーターの1番ピン
- ArduinoのA2ピン-ポテンショメーターの2番ピン
- ArduinoのVCC-ポテンショメーターの3番ピン
Arduino NanoによるRFレシーバの回路図は、下表の通りです。 ここでは、LEDが並んでいます。 LEDは、受信機で受信したポテンショメーターの値に基づいてシフトされます。
以下、RF受信機とArduino
間のピン接続の詳細です
- ArduinoのD11ピン – RF受信機のDATAピン
- VCC – RF受信機のVCC
- ArduinoのGND – RF受信機のGND。
- LEDのプラス側をデジタルピンD2、D3、D4、D5、D6に接続
- LEDのマイナス側をグランドに接続します。
コードの説明
RF送信側と受信側の両方の完全なArduinoコードはこのチュートリアルの最後に与えられていますが、ここでは、プロジェクトの動作を理解するために完全なプログラムを説明しています。 しかし、コードを書き始める前に、まずArduino IDEにライブラリをインストールする必要があります。
ここでは、仮想ワイヤライブラリを使用します。
https://www.resistorpark.com/content/Arduino_Libraries/Arduino_Wireless_Communication_Libraries/VirtualWire.zip
VirtualWire は、アドレス指定、確認応答、再送信なしで短いメッセージを送信する機能を提供する Arduino ライブラリです。 メッセージは、ASK (amplitude shift keying) を使用してワイヤレスで UDP のように送信されます。
Arduino IDE でライブラリを追加するには Sketch>>Include library>>Add .ZIP library に移動し、上記のリンクからダウンロードしたライブラリをアップロードしてください。
プログラムをアップロードした後、両側のシリアルモニタを開くと、以下のような出力があります。
RF送信部の出力にはポテンショメータの値が、
そして受信部の出力には受け取ったセンサ値が表示されています。 LEDはセンサーの値の範囲に応じてシフトします。
このようにArduinoはRFベースの通信に使用することができるので、ArduinoベースのIoTプロジェクトをもっと見てみましょう。h>
const int SensorPin = A2; // ポテンショメータピン
int SensorData;
char SensorCharMsg;
void setup()
{
pinMode(SensorPin,INPUT);
// for debugging
Serial.Pirates
Serial.Pirates(SensorPin);
/{271>{271>pinMode(SensorPin,INPUT);
// for debugging// VirtualWire setup
vw_setup(2000); // Bits per sec
}
void loop()
{
// Sensor 1 data
SensorData = analogRead(SensorPin).Read and store
{
SensorData = data(sensorPin);
// 整数データを直接Char配列に変換
itoa(SensorData,SensorCharMsg,10);
// DEBUG
Serial.print(“Sensor Integer: “);
Serial.print(SensorData); //センサデータを表示
Serial.print(” Sensor CharMsg: “);
Serial.print(SensorCharMsg); //文字配列を表示
Serial.print(” SensorData: “);
Serial.Print(SensorCharMsg: “); //文字列を表示delay(100);
// END DEBUG
vw_send((uint8_t *)SensorCharMsg, strlen(SensorCharMsg)); // メッセージを送信
vw_wait_tx(); // 全てのメッセージが消えるまで待機
delay(200);
} // メッセージが消えるまで待機
delay(100);
// END DEBUG
vw_delay();// メッセージが消えるまで待機 // END void loop
RF Receiverセクションのコード
#include <VirtualWire.h>
int SensorData; // Sensor
char SensorCharMsg; // RF Transmission container
const int led1 = 2;
const int led2 = 3;
const int led3 = 4;
const int led4 = 5;
const int led5 = 6;
void setup()
{
Serial.DATA = 1;
Const int led2 = 1; // RF送信コンテナbegin(9600);
pinMode(led1, INPUT);
pinMode(led2, INPUT);
pinMode(led3, INPUT);
pinMode(led4, INPUT);
pinMode(led5, INPUT);
// VirtualWire
// IOとISRの初期化
// DR3100では必須
vw_set_ptt_inverted(true);
/Bits per sec
vw_setup(2000);
// 受信PLLの実行開始
vw_rx_start();
}。 // END void setup
void loop()
{
uint8_t buf;
uint8_t buflen = VW_MAX_MESSAGE_LEN;
// Non-blocking
if (vw_get_message(buf, &buflen))
{
int i;
// 良いチェックサムのメッセージ受信、それをダンプします。
for (i = 0; i < buflen; i++)
{
// SensorCharMsg Char arrayにバッファから対応する
// charを入れる。
SensorCharMsg = char(buf);
}
// char arrayをNullで終端する
// これをしないと、受信メッセージの桁数が
//前より少なくなると問題が起きる
//。
SensorCharMsg = ‘\0’;
// Sensor1CharMsg Char arrayをintegerに変換
SensorData = atoi(SensorCharMsg);
// DEBUG
Serial.print(“Sensor “);
Serial.println(SensorData);
// END DEBUG
}
if (SensorData <= 200)
{
digitalWrite(led1, HIGH);
}
else
digitalWrite(led1, LOW).
DigitalData (led1, LOW);
else
digitalWrite (led1, LOW).DEBUG
{271>{271>DigitalWrite(led1, LOW)
if ( SensorData > 200 & SensorData <= 400)
{
digitalWrite(led2, HIGH))。
}
else
digitalWrite(led2, LOW);
if ( SensorData > 400 && SensorData <= 600)
{
digitalWrite(led3, HIGH).Low、Low(LED2、Low);
{DigitalWrite(led3、HIGH);}
else
digitalWrite(led3, LOW);
if ( SensorData > 600 && SensorData <= 800)
{
digitalWrite(led4, HIGH);
}
else
digitalWrite(led4, LOW).Low
{
digitalWrite(led3, LIGH);
ELSE(led3, LOW)
if ( SensorData > 800 & SensorData <= 1023)
{
digitalWrite(led5, HIGH);
}
else
digitalWrite(led5, LOW);
}