気の向くままに辿るIT/ICT
webzoit.netウェブサイトホームページ
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ボードで完結しており、表題の機能までには至っておらず、まだ、未完で続きがある。

EasyWordMall UNO R3開発ボード USBケーブル付属 Arduinoと互換

EasyWordMall Pro Mini モジュール Atmega328 5V 16M Arduino用

Rasbee オリジナル FT232RL モジュール 5V 3.3V FTDI USB TTL 変換アダプタレッド 1個 [並行輸入品]

KKHMF Mini USB Nano V3.0 ATmega328P CH340G 5V 16M マイクロコントローラーボード モジュールArduinoと互換

Rasbee 400穴 ブレッドボード 8.5*5.5cm 1個

HiLetgo 400穴 ブレッドボード 8.5*5.5cm 5個セット

HiLetgo 400穴 ブレッドボード 8.5*5.5cm 10個セット

Rasbee SY-170 ミニブレッドボード カラフルブレッドボード 5個

HiLetgo 金属皮膜抵抗 1/4W 41種類x20=820個

HiLetgo ジャンパーワイヤー(オス-オス) 20cmx40本 5セット

Rasbee ジャンパーワイヤー(オス-オス) 各種長さx65本

HiLetgo 37センサーモジュールアソートキット/Arduino開発スターターキット

発信機と受信機の通信

 さて、表題の通り機能させるためには、これらの他、距離を考えれば、有線ではなく無線、無線でもBluetoothではなく、また、Arduino YUN、Arduino UnoとWeMos D1シールド(開発ボード)やESP8266などのWifiモジュールとWifi環境が必要になるだろう。

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

HiLetgo イーサネットシールドW5100 for Arduino UNO/MEGA2560

HiLetgo ESP8266 WiFiワイアレスモジュール UART

waves ESP32-DevKitC ESP-WROOM-32 ESP32 DevKitC V2 WiFi BLE 技適取得済 国内発送

waves ESP-WROOM-32 + 開発基盤 セット 国内発送

waves ESP8266 WiFiモジュール(技適取得済み) ESP-WROOM-02 キット 赤基盤

[スイッチサイエンス] ESP-WROOM-02ピッチ変換済みモジュール《シンプル版》

[スイッチサイエンス] ESP-WROOM-02ピッチ変換済みモジュール《フル版》

Rasbee WeMos D1 R3 簡易デザイン WiFi 開発ボード NODEMCU LUA ESP8266 Arduino UNO 適用 1個 [並行輸入品]

Rasbee OTA WeMos D1 CH340 WiFi 開発ボード ESP8266 ESP-12F For IDE UNO R3 Arduino用 1個 [並行輸入品]

Rasbee アップグレード版 WeMos D1 R2 WiFi UNO 開発板 ESP8266 Arduino 1個 [並行輸入品]

 ちなみに、ここでは、既に買ってしまって持っている、これはあくまで一時的な検証であるということで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とイーサネットシールド間のリセットにおけるバグについて考慮が必要となる場合もあるので留意のこと。