Arduinoを使って娘の覚醒状態をLINE通知する(試作最終形)
Table of Contents
3月から始めたArduinoからLINEに通知するシステムですが、4月は忙しく全く手がつかず、5月の連休にやっと最終形にたどり着きました。途中の投稿はこちら。
→ Arduinoを使って娘の覚醒状態をLINE通知する(まだ途中)
試作機最終形 #
最終形と言っているものの、ひとまず手元にあったケースに入れただけ。とはいえ、マイクで声を拾って、LINEに通知を送る目的は達成しました。
制作意図と課題 #
課題は、1階で食器洗いや洗濯をしていると、2階で寝ている娘の泣き声が聞こえにくいことでした。
システム #
Arduinoでマイクの音を処理し、一定のレベルを超える入力があったら、娘ボットのAPIに通知します。娘ボットAPIから、LINE Messaging APIにプッシュ通知リクエストを投げ、妻と僕のLINEに通知が届くようにしました。
Arduino側の実装 #
ここについては、だいたい当初の予定通り、ESP-WROOM02とアンプ付きマイクモジュールをArduinoに接続するだけで達成。その他、システムの状態を表示するLEDを付けたりもしました。
覚醒状態検出アルゴリズム #
大したことをしているわけではないです。アンプ付きのマイクモジュールがノイズを拾いやすかったことと、Arduinoで使えるデータストレージが小さいので、いろいろ処理しています。
通知までの処理は、差分→差分の移動平均→しきい値を超えた回数をカウント→カウントのしきい値を超えたら通知することにしています。
元の波形。
差分。
差分の移動平均。
ここに、声ははっきり現れるので、どれくらい長く変化が続いたかを数えることで、泣いているかどうかを判定します。
試行と感想 #
実際に娘が寝ている横でArduinoの電源を入れ、ちゃんと通知が届くことを確認しました。まれに泣いていなくても通知が来ることがありましたが、ある程度の精度はありました。使用した妻からは、泣いているときは通知がくるので安心との感想を得ることができました。
システムの弱点が有ることも予想できていました。大きな音のノイズには弱いです。5月上旬は寒かったので、エアコンを付けていたのですが、それから出る低周波に反応してしまいました。
割と精度良かったはずの娘ボットが今日は調子悪く、泣いていなくても7分おきに通知が来るようになった。デバッグしたところ、寒くてつけていたエアコンが出す低周波ノイズをマイクがガッツリ拾っていたことがわかった。 pic.twitter.com/NptMGpJahz
— 鈴木 孝宏 (@sussan0416) May 8, 2018
差分でやっている以上、しかたがないことです。FFTなどで周波数ごとに分解して処理するようにしたら、エアコンに反応しないようにできるかもしれません。
今後の課題 #
いろいろありますが、ざっくり以下のような感じです。
- ノイズに反応しないように改善する
- ハイパス、ローパスの回路を組み込んでアンプを自作する
- FFTをかけて、人の声の周波数帯で音量を測定するようにする
- 機械の堅牢性を高める
- 娘に壊されないよう、ある程度雑に扱っても壊れないようにする
- コンセント電源をやめ、電池駆動にする
- 専用のケースを作る
- 手作業での木材の加工は意外と難しいことがわかったので、その他の材料を検討する
- 2階で拾った音をそのまま1階でスピーカーなどで流せばよかったのではという代替案も出てきた
以上。