ASK ワイヤレスモジュールでチャイムを鳴らす


315MHzのASK送信モジュールを使って、市販のワイヤレスチャイムを鳴らすことができましたので紹介します。
使用したワイヤレスチャイムはREVEX社のX800と いう製品です。




余談ですが、上の写真を見て分かるように技術基準適合証明等のマーク(通称技適マーク)は、
送信側だけに交付されていればいいことが分かります。

この製品はRevex社のX10送信機を使って、ワイヤレスでチャイムを鳴らす製品ですが、
315MHzのASK送信モジュールを使うと、X10送信機を使わなくても、Arduinoから操作することができます。


左が315MHzの受信モジュール 右が送信モジュール



最初に315MHzの受信モジュール(H3V3E)を使って、X10送信機が使っている送信コードを解析します。
使用したスケッチは以下のスケッチです。
/*
  RF_Sniffer - receive RF codes.

  VCC  : Arduino 3.3V
  GND  : Arduino GND
  Data : Arduino PD2
  ANT  : in between the two headers!

*/

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

void display_Running_Sketch (void){
  String the_path = __FILE__;
  int slash_loc = the_path.lastIndexOf('/');
  String the_cpp_name = the_path.substring(slash_loc+1);
  int dot_loc = the_cpp_name.lastIndexOf('.');
  String the_sketchname = the_cpp_name.substring(0, dot_loc);

  Serial.print("\nArduino is running Sketch: ");
  Serial.println(the_sketchname);
  Serial.print("Compiled on: ");
  Serial.print(__DATE__);
  Serial.print(" at ");
  Serial.print(__TIME__);
  Serial.print("\n");
}

void setup() {
  Serial.begin(9600);
  display_Running_Sketch();
  mySwitch.enableReceive(0);  // Receiver on interrupt 0 => that is pin #2
  Serial.println("RF_Sniffer start");
}

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

}

このコードを実行して、X10送信機の送信ボタンを押すと、IDEのシリアルモニターにはこのように表示されます。


受信したコードの先頭4バイト(0x5F55)がチャネル、末尾2バイト(0x54)がチャイム音を示しています。
チャネル番号が分かったら、315MHzの送信モジュールを使って、以下のスケッチを実行します。
チャネル番号は手元の受信機に合わせて変更してください。
/*
  SendDemo - sends RF codes.

  VCC  : Arduino 3.3V
  GND  : Arduino GND
  Data : Arduino PD7
  ANT  : in between the two headers!
*/

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

void display_Running_Sketch (void){
  String the_path = __FILE__;
  int slash_loc = the_path.lastIndexOf('/');
  String the_cpp_name = the_path.substring(slash_loc+1);
  int dot_loc = the_cpp_name.lastIndexOf('.');
  String the_sketchname = the_cpp_name.substring(0, dot_loc);

  Serial.print("\nArduino is running Sketch: ");
  Serial.println(the_sketchname);
  Serial.print("Compiled on: ");
  Serial.print(__DATE__);
  Serial.print(" at ");
  Serial.print(__TIME__);
  Serial.print("\n");
}


void setup() {
  Serial.begin(9600);
  display_Running_Sketch();
 
  // Data
  pinMode(7, OUTPUT);  // Either way, we'll use pin 7 to drive the data pin of the transmitter.
  // Transmitter is connected to Arduino Pin #10 
  mySwitch.enableTransmit(7);

}

void loop() {
  static int pos =0;
  unsigned long value;
  unsigned long channel = 0x5f5500;
  int sound[] = {0x00, 0x01, 0x04, 0x05,
                 0x10, 0x11, 0x14, 0x15,
                 0x40, 0x41, 0x44, 0x45,
                 0x50, 0x51, 0x54, 0x55};

  int pmax = sizeof(sound) / sizeof(int);
  Serial.print("pmax=");
  Serial.println(pmax);
 
  value = channel + sound[pos];
  Serial.print("value=");
  Serial.println(value,16);
  mySwitch.send(value, 24);
  mySwitch.send(value, 24);
  mySwitch.send(value, 24);
  pos++;
  if (pos == pmax) pos = 0;
  delay(30000);
}

30秒ごとにで音色を変えてチャイムが鳴ります。
3回続けて同じコードを送信していますが、受信機側に同じコードを連続して受け取っても、連続した同じコードは無視する仕組みが入っています。