ドアホンの子機

2021年1月5日

うちはカメラ付きドアホンを付けてるんですけど、親機から鳴るチャイム音が聞こえない場所の方が多いという事を家にいる時間の長くなった最近、家族全員が気づき始めました

B06WW4XYVJ
パナソニック ワイヤレスモニター付 テレビドアホン 電源コード式 VL-SWD220K

Version1.0 シンセサイザー有線型

正式なオプションで追加のメロディーサインというものがあると分り、つなぎ方を見たら、親機と有線で繋ぐだけという事が解って、じゃあ作れるじゃん?って

B003U3C94O
パナソニック(Panasonic) メロディーサイン 61-5418-54

音を大きくするにはスピーカーの性能が大事、でもよく分らないので参考にしたサイトに書いてあった「8Ω8W」というスピーカーを電子部品通販サイトで探したら、ちょっと違うけど形が面白いスピーカーを発見
このスピーカーを基準にしてケース等の選定をして、鳴らすチャイムは何にしよう
単純なBeep音(PCの起動スイッチみたいな「ピコン!」みたいな電子音の事)じゃ芸がない
なんか無いかな?って様々なキーワードを試しながらネットをさまよって「PWMDAC_Synthライブラリ」という物を発見、Arduinoだけで実現できるシンセサイザーライブラリ

必要な信号は、ドアホンの親機から拾えるチャイム信号とスピーカーに出力する信号の2つ
電源はACアダプターで、マイコンから出てくる電圧は5V、大きい音を出すためにもう少し高い電圧をスピーカーにかけたいので、12VのACアダプターを使ってトランジスタを使おう、マイコンに入力するために三端子レギュレーターで12Vを5Vに落とす回路も必要、こうやってまずは脳内設計をしてマイコンを選定
必要な足の数は2つなのでATtiny85で良いかな?そう思って、まずはブレッドボード上で検証
うーん、PWMDAC_Synthライブラリが動かない、よく分らないけど、Arduinoを使う時でも出力できるピン番号に制限があるし、何かそれをするのに必要な物がATtiny85には無いのかな?
でもArduino UNOを入れるとなるとケースが大きくなっちゃうよ?そこで登場するのがArduino NANOというモデル

B008GRTSV6
Arduino Uno Rev3 ATmega328 マイコンボード A000066 B01I4KVWPE
Arduino Nano

私が使うのはオリジナル品ではなく、互換機、中国の零細企業が様々な互換機を超安価で発売しています、どうやって儲けが出てるのか不明なくらい安いんです

B072F5NS4X
ELEGOO Arduino用 Nanoボード V3.0 CH340/ATmega328P、Nano V3.0互換 (3)

このNANO互換機を使ってPWMDAC_Synthライブラリを試したらあっさり綺麗な音が鳴って、よし、ケースに余裕あるし、これを使う事に決定!

で、CADで設計してプリント基板を作って、ケースを加工して部品をはんだ付けして
途中で「電池駆動もできるな!」って気付いて電池ボックスを追加して

いつも、失敗の可能性を考えて、部品は2個ずつ買うんですが、電池ボックスの位置とかちゃんと設計しなおそうと思って、これはプロトタイプという事で、設置はしないで、でも設計熱が冷めちゃってたので、しばらく放置してたんですよ

Version2.0 和音Beep有線型

しばらくして、ATtiny85でもシンセサイザーまでは行かないけど、Beep音で和音を流せるソースコードを自動生成するツール『Mymelo2』を発見、ドアチャイムだし、和音が出せるならBeepでも良いね!という事で、Arduino NANOを止めてATtiny85で電池ボックスを付けた物を再設計しよう!

スポンサーリンク

そう思っていた矢先に、面白い物を発見

Version2.1 MP3再生有線型

MP3を記録して、それをマイコン制御で再生させられるモジュール「JQ6500」これも互換機なら1個400円程度、サイズは切手サイズなので、どこにでも入れられるし、良いじゃんこれ!
そう思って基板設計をして、モジュールを購入…正規品はUSBメモリとしてPCは認識するので、MP3ファイルをコピーするだけなんだけど、互換機にはこのUSBメモリ認識機能が付いていないので専用ツールでファイルを転送する必要があって、まあ、結果上手くいかなかったので次へ

B07ZKGP7R6
HiLetgo 2pcs JQ6500音声モジュールサウンドモジュールMCU 5チャンネルシリアル制御MP3音楽再生SPI

次に見つけたのが、MicroSDカード内のMP3を連続再生するモジュール「DFPlayer Mini」安価で低容量のSDカードを用意する手間があったけど、これも互換機なら1個200円程度
こっちは、マイコンが無くても動くモジュールなので、まずはマイコンなしでテスト…大成功!
マイコンに繋いでチャレンジ、ATtiny85でもArduonoでも問題なく動くことも確認

でもね、このモジュールたちを探している過程で、他にも面白い物を見つけてまして…

B0822FR4BQ
KKHMF 3個 TFカード Uディスクミニ SD MP3プレーヤー オーディオ 音声 モジュールボード Arduino DFPlayに対応

Version3.0 MP3再生無線型

特定小電力無線、免許のいらない無線機、おもちゃのトランシーバーとかバブル時代にスキー客に流行った無線機とか、今回のドアホンの親機と子機もこの無線、これをマイコンで扱えるようにするモジュール「NRF24L01」これを使えば煩わしい配線必要ないし、子機の数増やせるし面白いじゃん!

B08B881JBG
VKLSVAN 5個セット NRF24L01 2.4GHzワイヤレスモジュール MiniパワーエンハンスドバージョンSMDレシーバートランシーバー Arduinoと互換性

そう思って設計開始、最初に作ったケースを再利用するのでちょっと窮屈だけど、なんとか収めて、親機を作らないとね「DFPlayer Mini」だけならATtiny85で足りるけど「NRF24L01」を付けるならマイコンはNANOで、無線を常時監視しないといけないので、電源はACアダプターで

Version3.1 シンセサイザー無線型

このケースをどうやって壁に設置しようか?据置型のケースなので、何かオプション無いのかな?
このケースは『タカチ電機工業』というメーカーの物で、壁に設置する用のケースも売ってるし、それを親機子機用に買えばいいよね?!という事で、ケースを新調、設計のし直しをする事にしました

常時監視が必要なのでスリープはしない、そうすると電池駆動は非現実なので常時電源供給が必要、マイコンをArduino NANOにするなら電源供給はUSBで良い、ただしNANOはMini-USBなので、一般的なスマホの充電器はそのままでは使えないから、Micro-USB端子に変換、こうすれば設定変更も蓋を開けずにPCに繋いで出来るし、さらに「NRF24L01」を動かすには3.3Vの電圧が必要、USBだと5Vなので、3.3Vに落とす回路が必要、だったら降圧回路の入っているArduino NANOをそのまま使えば良い、という事で親も子もNANOを使う事に、NANOを使うなら「DFPlayer Mini」でMP3再生しなくても「PWMDAC_Synthライブラリ」で十分じゃん、という事でVer1.0に無線機能が付いたところに落ち着きました

でもね、ここでまた問題発生!日本国内で無線通信をする機器は「適合表示無線設備」の印『技適マーク』が付いている物しか使用できないという法律が!!こういう杓子定規な法律多いよね、こういう法律が多いからガラパゴス化するんですけどね、テレビもそう、B-CASカードが必須だから海外メーカーの安価なテレビが使えないとかね、という事で、ここまで考えて、設計して、材料を買ったけど「NRF24L01」は使えないという><

日本国内では使えないけど、一応ソースコードを置いておきます

スポンサーリンク
//インターホン信号送信サーバ
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

RF24 radio(9, 10); // CE, CSN
//無線のアドレス情報、ここが一致するクライアントだけが受信できる
const byte address[6] = "00001";

int button_pin = 2;
boolean button_state = 0;

void setup() {
  pinMode(button_pin, INPUT_PULLUP);  //プルアップしているのでノーマルクローズ(通常時がHIGH)
  radio.begin();                  //無線通信を開始する
  radio.openWritingPipe(address); //データを送信するアドレスを設定する
  radio.setPALevel(RF24_PA_MIN);  //送信機と受信機の距離に応じて、最小値または最大値に設定できます。
  radio.stopListening();          //これにより、モジュールが送信機として設定されます
}

void loop() {
  button_state = digitalRead(button_pin);
  radio.write(&button_state, sizeof(button_state));  //受信者へボタンの状態を送信 
  delay(1000);
}
//インターホン信号受信クライアント
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#define PWMDAC_OUTPUT_PIN   3
#include <PWMDAC_Synth.h>


PWMDAC_CREATE_WAVETABLE(squareWavetable, PWMDAC_SQUARE_WAVE);      // 矩形波
PROGMEM const Instrument instrument = {squareWavetable, {2, 32, 8, 0}};
PWMDAC_CREATE_INSTANCE(&instrument);

RF24 radio(9, 10); // CE, CSN
//無線のアドレス情報、ここが一致するサーバからだけ受信できる
const byte address[6] = "00001";

boolean button_state = 0;
int led_pin = 2;

void setup() {
  radio.begin();
  radio.openReadingPipe(0, address);   //データを受信するアドレスを設定する
  radio.setPALevel(RF24_PA_MIN);       //送信機と受信機の間の距離に応じて、これを最小または最大に設定できます。
  radio.startListening();              //これにより、モジュールがレシーバーとして設定されます

  pinMode(led_pin , OUTPUT);
  delay(10);
  PWMDACSynth::setup();
}

//サーバ側のスイッチがプルアップしているときはスイッチON=LOW
//プルアップしていない場合はスイッチON=HIGHになる
void loop() {
  if (radio.available()) {              //データを探しています。
    radio.read(&button_state, sizeof(button_state));    //データの読み取り
    if(button_state == LOW) {
      digitalWrite(led_pin , HIGH);
      syn(76, 200);
      syn(72, 200);
      syn(67, 200);
      syn(72, 200);
      syn(74, 200);
      syn(79, 600);
      syn(74, 200);
      syn(76, 200);
      syn(74, 200);
      syn(67, 200);
      syn(72, 800);
      syn(76, 200);
      syn(72, 200);
      syn(67, 200);
      syn(72, 200);
      syn(74, 200);
      syn(79, 600);
      syn(74, 200);
      syn(76, 200);
      syn(74, 200);
      syn(67, 200);
      syn(72, 800);
      PWMDACSynth::noteOff(1, 72, 0);
      PWMDACSynth::update();
      digitalWrite(led_pin , LOW);
    }
    else {
      digitalWrite(led_pin , LOW);
    }
  }
  PWMDACSynth::update();
  delay(5);
}

int syn(int nam, int tim){
  delay(10);
  PWMDACSynth::noteOn(1, nam, 127);
  PWMDACSynth::update();
  delay(tim * 1.5);
  PWMDACSynth::noteOff(1, nam, 0);
  PWMDACSynth::update();
}

じゃあ次は、技適マークの付いたWi-Fiモジュールを使ってみよう!

Version4.0 IoT

技適マークの付いたWi-Fiモジュールと言えば「ESP32」技適マーク付きでも超安価、さらに「ESP-WROOM-32D開発ボード」というものはArduinoの様にプログラミングが出来る物で別途マイコンが必要ないという優れもの、このモジュールを使って、さらに子機は作らずLINEで通知を送る親機だけを作る事に、スマホにプッシュ通知ですよ、IoTですよ、難点は外出中も通知が届いちゃう所w

B086WWNP9Y
VKLSVAN ESP32 ESP-32S NodeMCUマイクロUSBデュアルコア開発ボードモジュール 2.4GHz ワイヤレスWiFi + Bluetoothデュアルモード ESP-WROOM-32モジュール内臓 マイクロコントローラ

親機子機っていうスタイルでも作れるし、Bluetoothも使えるので、色々考える余地はあります

ESP32

ESP32は奥が深い、いくつかの種類を入手したので、色々考えて後日別で記事を書こうと思いますがちょっとだけ
一旦はLINEに通知で終了と考えたけど、ドアホンの親機が設置してあるのは居間、キッチンに行くだけでチャイム音が聞こえない、居間を出るだけで聞こえなくなるチャイム音、普段の生活で部屋の中を移動するだけの時にスマホを持ち歩くのか?という問題があるので、LINE通知だけで済ますのは意味がないのではないかと思い直して、チャイムが鳴る子機も作らないとね!となりました

でも問題発覚!「PWMDAC_Synthライブラリ」はArduinoでしか動かないので、ESP32でメロディーを流すなら何か別の方法を模索する必要があり、探したところ裏技的にESP32のメモリ領域にMP3ファイルを保存できることが分かりました「SPIFFS領域」という部分だそうです

子機に飛ばす方式を何にしよう、Wi-FiかBluetoothか、Bluetoothは10mくらい届くらしい

Arduinoは何が出来るか、全部ではないけど大部分が頭に入っているので、脳内設計が出来るのですが、ESP32はとにかく機能が豊富なので、脳内設計がなかなか進みません
出来る事が多いっていうのは実は考えがまとまらなくて難しいという事なんです

著者のプロフィール
noheyaのアバター