H3V4F ASK ワイヤレスモジュールを使う

ATmega328->ATmega328


今までいくつかASK(amplitude shift keying)ワイヤレスモジュールを試してきましたが、いずれもデータ送受信できる距離が30p程度のものばかりでした。
今回、たまたまH3V4F/H34Aという型番のASKワイヤレスモジュールを格安(送受信モジュール合わせて100円)で入手しました。
スペックはこちらにありま す。
全く期待していなかったのですが、非常に安定して送受信できました。

今回使用した送信モジュールは技術基準適合証明等のマーク(通称技適マーク)が交付されていませんので
これ以降の記事はあくまでも実験レベルと考えてください。


左上から「H3V4F-433Mhz受信モジュール」 「433Mhzの受信モジュール」 「315MHzの受信モジュール」
左下から「H34A-433Mhz送信モジュール」 「433Mhzの送信モジュール」 「315MHzの送信モジュール」

見た通り、送受信ともに非常に小さなモジュールです。
あまりに小さいのでクリスタル以外、実装されている部品のマーキングは全く読み取れません。


左が送信モジュール 右が受信モジュール



今回入手した受信モジュールは433Mhz 3.3Vのモデルですが、型番違いで315Mhz版や5V版/5V低消費電力版もあります。
受信モジュール
周波数 駆動電圧
H3V3E 315MHz 3.3V
H3V4F 433MHz 3.3V
H5V3C 315MHz 5.0V
H5V3M 315MHz 5.0V 低消費電力版
H5V3G 315MHz 5.0V 低消費電力版(?)
H5V4D 433MHz 5.0V
H5V4H 433MHz 5.0V 低消費電力版
H5V4N 433MHz 5.0V 低消費電力版(?)

送信モジュールも、H34A-433/H34A-315の2つが有りますが、駆動電圧は2.6V-12Vとなっています。

以下のスケッチで送受信できます。
なお、RCSwichライブラリは何種類かありますが、使用したのは
https://github.com/sui77/rc-switch
のライブラリです。

送信側
送信側はUNOを使いました。
送信モジュールのDataピンをUNOのPD7に接続しますが、特に使用できるポートに制限はないようです。
/*
  SendDemo - sends RF codes.
*/

#include <RCSwitch.h> // https://github.com/sui77/rc-switch
RCSwitch mySwitch = RCSwitch();

void setup() {
 
  // VCC  : 3.3V
  // GND  : GND
  // Data : 7
  // ANT  : in between the two headers!
 
  // Data
  pinMode(7, OUTPUT);  // Either way, we'll use pin 7 to drive the data pin of the transmitter.

  Serial.begin(9600);
 
  // Transmitter is connected to Arduino Pin #10  
  mySwitch.enableTransmit(7);
 
}

void loop() {
  static long value=0;   

//  mySwitch.send(value, 24);
  mySwitch.send(value, 32);
  value++;
  delay(1000);
}

受信側
受信側もUNOを使いました。
今回入手した受信モジュールは3.3V駆動の受信モジュールです。
UNO互換機の3.3Vピンの供給電流は信用できないので、5V→3.3Vのレギュレータを介して電源供給しています。
受信モジュールのDataピンをUNOのPD2に接続します。
受信用に使えるのはINT0、またはINT1のポートだけです。
/*
  RF_Sniffer - receive RF codes.
*/

#include <RCSwitch.h> // https://github.com/sui77/rc-switch
RCSwitch mySwitch = RCSwitch();

void setup() {
  Serial.begin(9600);
  mySwitch.enableReceive(0);  // Receiver on interrupt 0 => that is INT0
  Serial.println("mySwich start");
}

void loop() {
 
  if (mySwitch.available()) {
    
    int value = mySwitch.getReceivedValue();
    
    if (value == 0) {
      Serial.print("Unknown encoding");
    } else {
   
     Serial.print("Received ");
      Serial.print( mySwitch.getReceivedValue() );
      Serial.print(" / ");
      Serial.print( mySwitch.getReceivedBitlength() );
      Serial.print("bit ");
      Serial.print("Protocol: ");
      Serial.println( mySwitch.getReceivedProtocol() );
    }
    
    mySwitch.resetAvailable();
    
  }

}

受信側のシリアルモニターには受信したデータがこのように表示されます。
同じデータを3回か4回連続して受信しています。
ライブラリソースを見てみたら、送信側はデフォルトで10回、同じデータを送信しています。
10回のうち、何回か受信出来ればオケという思想です。


試しに送信側モジュールを別のモジュール(一番上の写真の下側中央)に変えてみましたが
問題なく通信できました。

このモジュールでは0の値は送受信できません。
送信側スケッチを見るとわかりますが、送信データの初期値は0ですが受信側には0は表示されません。
受信側の表示は必ず1から始まります。


見通しで、だいたい8Mぐらいまで離れても送受信できます。
高々100円のモジュールで、ちょっと気持ち悪いぐらい安定して通信できます。



アメリカではガレージドアの開閉に433Mhzのリモコンが使われている様で、
[garage door 433mhz]で検索すると沢山の商品がヒットします。
日本では自動ガレージドアはあまり見たことが有りませんが、アメリカでは当たり前なのかもしれません。
赤外線リモコンは屋外では使えないので、車の中からガレージドアの開閉をするには適しています。



また、433Mhzの無線で操作できる電源ソケットが多数販売されています。
[433MHz RF power sockets] とか [433MHz smart plug] で検索すると沢山の商品がヒットします。

次回は送信側をATtinyに変えてみます。