気の向くままに辿るIT/ICT/IoT
IoT・電子工作

Arduinoで『玄関チャイム・ドアベル・呼び出しベル・呼び鈴』を作る

ホーム前へ次へ
Arduinoって?

Arduinoで『玄関チャイム・ドアベル・呼び出しベル・呼び鈴』を作る

Arduinoで『玄関チャイム・ドアベル・呼び出しベル・呼び鈴』を作る

2017/10/15

 Arduinoを使って『玄関チャイム・ドアベル・呼び出しベル・呼び鈴』を自作してみるページ。

 これがあると例えば、キッチンで「ご飯できたよ」の合図として(非金属で覆った)スイッチをタッチすると他の階や廊下でメロディが鳴るとか、玄関ばかりでなく、部屋のドアベルにもできたりもするでしょう。

タッチセンサと圧電スピーカーによるチャイム・ベル機能

タッチセンサとパッシブブザーによるドアベル・チャイム

 このところ、暇さえあれば、Arduinoで、できれば、増えてきた手持ちのセンサーやモジュール、電子部品類で何か作れないか...と考えています。

 そんな折、ふむふむと思ったのが、Arduinoで静電容量インターホンとリンク先で参照していた建築発明工作ゼミ2008 Arduino タッチセンサ

 37センサーキットに入っていて使い道がなかなか思いつかなかったものの1つにパッシブブザーやアクティブブザーがありました。

 他方、タッチセンサは、電子パーツ購入時、度々見かけていたし、金属なら銅箔テープやアルミホイルでさえタッチセンサになり得るのも知ってはいましたが、どうも興味をそそらず、一方、Arduinoでインターホンというのも脳裏をよぎらなかったわけではありませんが、必要性を感じずじまいだったのですが、なぜか、今回は興味が湧きました。

 音は、「ブー」とか、「ウィーン」とかでなく何らかのメロディを奏でたいと思い、参考にさせて頂いたのが、tone関数によるドレミを例示してくれていた圧電スピーカをつないで音を鳴らす

 その圧電ブザーがどちらを指すのか復習のため、アクティブブザーとパッシブブザーの動作確認を自己参照、tone関数を使えていることからパッシブブザーである模様。

#include <avr/sleep.h>
 
#define OUT_PIN 8
//#define IN_PIN 9
#define IN_PIN 3
#define BEAT 500   // 音の長さを指定
#define PINNO 12   // 圧電スピーカを接続したピン番号
 
int f=0;// フィルタ用変数
 
void wakeUpNow(){
Serial.println("wake up!");  // 復帰時にシリアルモニターに表示
delay(500);
}
 
void sleepNow(){
Serial.println("sleep down!");  // スリープ時にシリアルモニターに表示
delay(10);
set_sleep_mode(SLEEP_MODE_PWR_DOWN);  // スリープモードの設定
sleep_enable(); //スリープを有効にする
 
//attachInterrupt(1,wakeUpNow, RISING);  // 割り込み処理の設定
attachInterrupt(digitalPinToInterrupt(IN_PIN), wakeUpNow, RISING);
sleep_mode();  // 指定したモードでスリープを開始
sleep_disable();  // 割り込みによってスリープから復帰
detachInterrupt(1);  // 割り込み処理を解除する
}
 
void setup(){
  // モニタリングのためシリアル通信開始
  Serial.begin(9600);
  // 8番ピンをデジタル出力
  pinMode(OUT_PIN,OUTPUT);
  // 3番ピンをデジタル入力
  pinMode(IN_PIN,INPUT);
}
 
void loop(){
  // 静電容量変化量の変数を用意
  int a=0;
  // 8番ピンをHIGHで出力
  digitalWrite(OUT_PIN, HIGH);
  // 指が触れたとき3番ピンがHIGHになるまでをカウント
  while (digitalRead(IN_PIN)!=HIGH){
    // カウントする
    a++;
  }
  if (f > 50 ) {
    melody();
  } else {
    sleepNow(); // スリープモードにする
  }
  delay(1);
  // 8番ピンをLOWにする
  digitalWrite(OUT_PIN, LOW);
  // モニタリング:値を出力
  Serial.println(a);  
 
  // 値を滑らかにするフィルタ式
  f+=(a-f)/2;
  // モニタリング:フィルタ値を出力
  Serial.print("f : ");
  Serial.println(f);
}
 
void melody() {
     tone(PINNO,262,BEAT);  // ド
     delay(BEAT);
     tone(PINNO,262,BEAT);  // ド
     delay(BEAT);
     tone(PINNO,392,BEAT);  // ソ
     delay(BEAT);
     tone(PINNO,392,BEAT);  // ソ
     delay(BEAT);
     tone(PINNO,440,BEAT);  // ラ
     delay(BEAT);
     tone(PINNO,440,BEAT);  // ラ
     delay(BEAT);
     tone(PINNO,392,BEAT);  // ソ
     delay(BEAT);
     delay(BEAT);
     tone(PINNO,349,BEAT);  // ファ
     delay(BEAT);
     tone(PINNO,349,BEAT);  // ファ
     delay(BEAT);
     tone(PINNO,330,BEAT);  // ミ
     delay(BEAT);
     tone(PINNO,330,BEAT);  // ミ
     delay(BEAT);
     tone(PINNO,294,BEAT);  // レ
     delay(BEAT);
     tone(PINNO,294,BEAT);  // レ
     delay(BEAT);
     tone(PINNO,262,BEAT);  // ド
     delay(BEAT);
     delay(BEAT);
/*
     tone(PINNO,262,BEAT);  // ド
     delay(BEAT);
     tone(PINNO,294,BEAT);  // レ
     delay(BEAT);
     tone(PINNO,330,BEAT);  // ミ
     delay(BEAT);
     tone(PINNO,349,BEAT);  // ファ
     delay(BEAT);
     tone(PINNO,392,BEAT);  // ソ
     delay(BEAT);
     tone(PINNO,440,BEAT);  // ラ
     delay(BEAT);
     tone(PINNO,494,BEAT);  // シ
     delay(BEAT);
     tone(PINNO,523,BEAT);  // ド
     delay(3000);           // 3秒後に繰り返す
*/
}

 メロディは、なぜか、あっさり、すんなり音階を口ずさむことが出来た曲『きらきら星』の一節とし、BEAT値を変更、小節区切りでdelay(BEAT)を1つ追加、鳥よけを作るでも使ったスリープ機能を取り入れ、attachInterrupt関数など割り込みに利用できるデジタルピンD2、D3を使うにあたり、ピン配置を変更してみたスケッチがコレ。

 回路は、圧電センサ(パッシブブザー)モジュールのS、+(中央ピン)、-(マイナス)にD12、5V(or 3.3V)、GND、金属片からワニグチクリップなどを介して信号入力用に(スリープに対し、Unoで外部割り込みに使えるD2/D3の内)D3、また、出力用に1MΩの抵抗〜D8につなぎます。

 この状態で金属部に手を触れると『きらきら星』が流れるのですが、この仕組みは、なかなか興味深い。

 参照先にもありますが、タッチセンサについては、相応に抵抗値を大きくすれば、金属類に直接触れなくとも、絶縁体である紙や木、ガラスなどを介してもタッチに反応するので透明プレートのみならず、センサー自体を隠すことも可能。

 ここでは、タッチセンサになり得る手持ちの金属ということで、手近にあって100均で買ったと思しきL字ステーを使ってみました。

 今回の検証では、抵抗に1/4W カーボンの1MΩを使いましたが、それでも紙ペラ1枚ならこれを介しても反応しました。

 また、Arduinoボードには、Unoを使いましたが、当然、NanoやPro Miniなどでも可であり、自身もそうするつもりです。

 電源については、今回、ACコンセント接続のUSB充電器からとりましたが、モバイルバッテリからとることもできるでしょう。

 ただ、この時点では、1台のArduinoボードで完結しており、表題の機能までには至っておらず、まだ、未完で続きがあります。

発信機と受信機の通信

 さて、表題の通り機能させるためには、これらの他、距離を考えれば、有線ではなく無線、無線なら10m程度までのエリアをカバーできるといわれているBluetoothか、無線LANならArduino YUN、Arduino UnoとWeMos D1シールド(開発ボード)やESP8266などのWifiモジュールとWifi環境が必要になるでしょう。

 接続数などを考慮するとドアベルには、Bluetoothが妥当と言えるでしょうが、後述のESP-32はBluetoothだけでなく無線LANも対応しているため、オーバースペックと言えるでしょう。

 一方、Bluetoothモジュールやその他無線の選択肢はそう多くなさ気、更に日本で使う場合、技適済みであるものと考えるといまのところ、相当限定される模様であるため、ここは敢えて無線LANでの実装を考えてみることにします。

 無線LANを使う場合、Arduino YUNは無線LANばかりでなく、OSとしてLinuxもインストールされており、ここではオーバスペック、シールドや開発ボードだとArduinoボードを選ぶ、より柔軟に対応でき、価格面から言っても、より安価なESP8266などのWifiモジュールを使うのが無難でしょう。

 更に同一ネットワーク上で通信可能な送信側と受信側の2組の構成が必要となるので、一方をWiFiモジュールで無線、他方を有線とするなら、有線側には、Arduino Ethernetか、Unoなどにイーサネットシールド(この場合、ArduinoボードとしてPro Miniは使いづらいかも)など、共に無線ならWiFiモジュールが2つ必要ということになります。

 尚、ESP8266には、多くの種類がありますが、日本の技適を通っているもの(技術基準適合証明等を受けた機器)としては、このチップをも搭載したESP-WROOM-02やESP-WROOM-32といったものがあり、これらは、ユニバーサル基板やブレッドボードで使おうと思うとピッチが異なるため、ピッチ変換基板(ブレイクアウトボード)付きを買うか、別途これを用意する必要があります。

 もし、ESP-WROOM-02を選択する場合、ピッチ変換基板(ブレイクアウトボード)付きには、シンプル版とフル版があるようですが、実装品の機能との兼ね合いにはなるものの、配線だけを考えると、これが容易なシンプル版を買う方がベターかもしれません。

 ちなみに、ここでは、既に買ってしまって持っている、これはあくまで一時的な検証であるということでESP8266の内、ESP-01互換っぽいボードを使おうと思います。

 ESP8266はマイコンを内蔵しており、自作簡易回路を使えば、Arduino IDEからスケッチを書き込み、機能させることもできるのですが、ここでは、Arduinoボードからシリアル通信によってESP8266の無線通信機能のみを利用します。

 Arduinoボードでは、D0/D1(RX/TX)を使ったハードウェアシリアル通信と2つの任意のデジタルピンを割り当てられるソフトウェアシリアル通信を利用できます。

 違いとしては、前者は、高速で通信可能なためESP8266でデフォルトの通信速度115200で通信できますが、利用可能なデジタルピンは固定、USB接続によるスケッチのアップロードにもハードウェアシリアル通信を利用、共有しており、共用する場合、スケッチのアップロードをする際には、ピンを抜く必要があるため、開発・デバッグ中は面倒で不便、後者には、この不便さはなく、任意のデジタルピンを利用できる柔軟性がありますが、体感的には許容範囲と思われるも安定して通信できる速度が最大で9600と若干遅いこと、最初に一度だけですが、ESP8266側の通信速度設定を変更する必要があります。

 何れにしてもライブラリSoftwareSerial.hをインクルード、SoftwareSerial mySSC(SSC_RX, SSC_TX)などとしてインスタンスを生成、mySSC.begin(9600)として通信速度を設定すれば、あとは、インスタンスで利用可能なメソッドやオブジェクトを使うだけとスケッチを書く上では、簡単に利用できるようになっています。

 というわけでESP8266で...

 と思ったら、手持ちのESP-01らしき互換ボードの1つが壊れ、代替として買った同品も微妙に壊れた模様、追加で買ってあるESP-12Fもあるのですが、ブレイクアウトボードがなく、使えないため、準備が整い次第やってみることとし、ここでは、次のような苦肉の策を取ることにします。

代替回路/Arduio Uno + Ethernet shield W5100 + Webブラウザ

#include  <avr/sleep.h>
 
#define  OUT_PIN  5
#define  IN_PIN  3
#define  BEAT  500  //  音の長さを指定
#define  PINNO  12  //  圧電スピーカを接続したピン番号
 
#include  <SPI.h>
#include  <Ethernet.h>
 
//  MACアドレスを入力
byte  mac[]  =  {
    0xDE,  0xAD,  0xBE,  0xEF,  0xFE,  0xED
};
//  ローカルネットワークアドレスに沿ったIPアドレスを入力
IPAddress  ip(192,  168,  0,  7);
 
//  IPアドレスを使うEthernet serverライブラリの初期化と使用したいポートを設定
//  (HTTPのデフォルトポートは80)
EthernetServer  server(80);
 
void  wakeUpNow(){
    Serial.println("wake  up!");  //  復帰時にシリアルモニターに表示
    delay(500);
}
 
void  sleepNow(){
    Serial.println("sleep  down!");  //  スリープ時にシリアルモニターに表示
    delay(20);
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);  //  スリープモードの設定
    sleep_enable();  //スリープを有効にする
  
    //attachInterrupt(1,wakeUpNow,  RISING);  //  割り込み処理の設定
    attachInterrupt(digitalPinToInterrupt(IN_PIN),  wakeUpNow,  RISING);
    sleep_mode();  //指定したモードでスリープを開始
    sleep_disable();  //割り込みによってスリープから復帰
    detachInterrupt(1);  //割り込み処理を解除する
}
 
void  setup(){
    //  モニタリングのためシリアル通信開始
    Serial.begin(9600);
    //  5番ピンをデジタル出力
    pinMode(OUT_PIN,OUTPUT);
    //  3番ピンをデジタル入力
    pinMode(IN_PIN,INPUT);
    while  (!Serial)  {
    ;  //  シリアルポートが接続されるのを待つ(PCにUSB接続する場合にのみ必要)
    }
    //  イーサネット接続とサーバを開始
    Ethernet.begin(mac,  ip);
    server.begin();
    Serial.print("server  is  at  ");
    Serial.println(Ethernet.localIP());
}
 
void  loop(){
    //  クライアントの接続を待つ
    EthernetClient  client  =  server.available();
    if  (client)  {
    Serial.println("new  client");
    //  HTTPリクエストは空行で終わる
    boolean  currentLineIsBlank  =  true;
    while  (client.connected())  {
    if  (client.available())  {
        //  5番ピンをHIGHで出力
        digitalWrite(OUT_PIN,  HIGH);
        if  (digitalRead(IN_PIN)==HIGH){
        Serial.println("playing the melody ...");
        melody();
        }  else  {
        sleepNow();  //  スリープモードにする
        }
        delay(1);
        //  5番ピンをLOWにする
        digitalWrite(OUT_PIN,  LOW);
    }
    }
    //  クライアント接続を終了
    client.stop();
    Serial.println("client  disconnected");
    }
}
 
void  melody()  {
      tone(PINNO,349,BEAT)  ;    //  ファ
      delay(BEAT)  ;
      tone(PINNO,440,BEAT)  ;    //  ラ
      delay(BEAT)  ;
      tone(PINNO,392,BEAT)  ;    //  ソ
      delay(BEAT)  ;
      tone(PINNO,262,BEAT)  ;    //  ド
      delay(BEAT)  ;
      delay(BEAT)  ;
      tone(PINNO,349,BEAT)  ;    //  ファ
      delay(BEAT)  ;
      tone(PINNO,392,BEAT)  ;    //  ソ
      delay(BEAT)  ;
      tone(PINNO,440,BEAT)  ;    //  ラ
      delay(BEAT)  ;
      tone(PINNO,349,BEAT)  ;    //  ファ
      delay(BEAT)  ;
      delay(BEAT)  ;
      tone(PINNO,440,BEAT)  ;    //  ラ
      delay(BEAT)  ;
      tone(PINNO,349,BEAT)  ;    //  ファ
      delay(BEAT)  ;
      tone(PINNO,392,BEAT)  ;    //  ソ
      delay(BEAT)  ;
      tone(PINNO,262,BEAT)  ;    //  ド
      delay(BEAT)  ;
      delay(BEAT)  ;
      tone(PINNO,262,BEAT)  ;    //  ド
      delay(BEAT)  ;
      tone(PINNO,392,BEAT)  ;    //  ソ
      delay(BEAT)  ;
      tone(PINNO,440,BEAT)  ;    //  ラ
      delay(BEAT)  ;
      tone(PINNO,349,BEAT)  ;    //  ファ
      delay(BEAT)  ;
      delay(BEAT)  ;
}
  1. サーバ及び圧電センサ再生用にPCに接続したArduino Uno+イーサネットシールドW5100による有線LANを使用
  2. クライアントとしてPCのブラウザをサーバにアクセスさせる(URL入力欄に指定アドレスを入力後、[Enter]する)ためだけに使用
  3. 2項の条件に加え、指定した出力用デジタルピン、入力用デジタルピンがHIGHの時にメロディを奏で、それ以外はスリープさせる

 つまり、サーバにHTTPアクセスした上で金属片にタッチするとメロディが1度だけ流れ、以後、触れなければスリープ、再度触れればメロディが...となります。

 そのスケッチがコレ。

 Webサーバ機能については、Arduino IDEのサンプルスケッチ『Ethernet => WebServer』を流用。

 曲が同じでは芸がないので、このスケッチでは、メロディを『ウェストミンスターの鐘』(日本の学校でよくチャイムに使われる曲)にしてみました。

 回路は、圧電センサ(パッシブブザー)モジュールのS、+(中央ピン)、-(マイナス)にD12、5V、GND、金属片からワニグチクリップなどを介して信号入力用に(スリープに対し、Unoで外部割り込みに使えるD2/D3の内)D3、出力用に1MΩの抵抗〜D5につなぐだけ。

 本来は、クライアント側で検知した金属片へのタッチを示す信号を受け取るところだが...とか、あんなにうるさいくらい大きな音が、なぜか、耳に当てないと聴こえないほど小さくなりました、また、ブラウザでアクセスするまでの間、なぜか、雑音が入る...とか、delayの値設定の問題か、シリアルモニタ上の表示が微妙...といったことは、さておき、回路の使用・確認方法は次の通り。

代替回路の使用方法

1) PCにArduinoボードをUSB接続、先のスケッチを書き込み、配線をし、シリアルモニタとブラウザを開くとシリアルモニタに[server is at ...]とスケッチで指定のIPアドレスが表示されます。

Arduino Uno+W5100とPCブラウザで代替のタッチセンサによるドアベル回路使用方法1

2) そのIPアドレスをブラウザのURLアドレス欄に入力して確定(キーボードの[Enter]押下など)。

Arduino Uno+W5100とPCブラウザで代替のタッチセンサによるドアベル回路使用方法2

3) シリアルモニタに[new client]と表示されます。

Arduino Uno+W5100とPCブラウザで代替のタッチセンサによるドアベル回路使用方法3

4) 回路上の金属片に触れる。

Arduino Uno+W5100とPCブラウザで代替のタッチセンサによるドアベル回路使用方法4

5) シリアルモニタに[sleep down!]、[wake up!]と共に[playing the melody ...]と表示され、メロディが流れ、終わると[sleep down!]と表示され、スリープモードに入り、スイッチとしている金属に触れるとメロディが...といった流れになります。

 尚、Arduino Unoとイーサネットシールド間のリセットにおけるバグについて考慮が必要となる場合もあるので留意のこと。

[追記:2018/07/29]

 そもそもArduinoなしでESP8266を2つ使ったWiFi玄関チャイム・呼び出しベルができました。

ホーム前へ次へ