hitode909の日記

以前はプログラミング日記でしたが、今は子育て日記です

子の泣いてる時間を観察したくてM5StickCで泣き声モニタを作った

深夜に絶叫する子を抱っこしていると、いつから泣いてるのか、いつまで泣いてるのか、など考えてしまって精神的に参ってくる。
実際のところどれくらいのペースで泣いてるのか可視化したくなって、M5StickCで可視化するグッズを作った。

作りたいもの

常時マイク入力がオンになっていて、直近しばらくの音量の履歴が可視化されたら便利そうだと考えた。
可視化によって子が泣き止むわけではなくても、「しばらく泣いてる気がしたけどまだ3分くらいだ」とか、「10分間に渡って静かにしていて偉い」とか数値を見て客観的な考察をできるようになりたい。

M5StickC

M5StickCは小型のM5Stack。
小さくて邪魔にならなさそうなのと、マイクがついているので買ってみた。
3000円以下で買ってきて書いたコードが動いて画面に表示もできるのでおもしろいと思う。
www.switch-science.com

実装する

Arduino言語はCみたいな言語で、言語詳細は知らないけどCだと思って書けば動く。以下のようなプログラムを書いた。

  • 各時間の音量を格納する配列を作って、音量の履歴を記録できるようにしておく。添字が1週したら0に戻す
    • 30分間、1秒につき10回ずつ計測することにして、長さ18000の配列を作る
  • マイクの入力から、各サンプルの絶対値の最大値を、その瞬間の音量として記録していく
    • 周波数の分析とか必要かと思っていたけど、子の声が他の音と比べて圧倒的にでかいので、音量を見るだけで十分だった
  • 画面サイズ160x80pxに収まるようにグラフ化する
    • 起動直後は保持するデータをすべて表示、最大で30分を表示する
    • 1分ごとに目盛り、5分ごとに大きい目盛りを描画する
    • Spriteに書き込むことでチラツキを防ぐ

やってることは簡単だけど紆余曲折あって、最初に1時間計測しようとしたらメモリが足りないとか、対数グラフで直近の値を詳細に見せようとしていたけど、何分前から泣いてるのかよくわからん、ということがあったり、途中までSerial.printの存在を知らなくて(なぜならリファレンスを読んでいないため)、デバッグに苦労したり。
子を膝に乗っけて、いい具合に泣いてるときに入力レベルを観察したりと、実際に使ってみるのが大事。

可視化

時間を見せるのに対数スケールを使ったのは悲劇で、画面の半分くらいが5分、左端まで行くと26分、みたいな変なグラフができてしまった。がんばって書いたけど無駄だった。ただリアルタイムにグラフがどんどん出るのは家具としてはおもしろいとは思う。


時間なんだから線形にしないと読めないだろう、と線形グラフにしたら、左端が30分前、真ん中が15分前、と一目で分かる見た目になった。
あと、やっていて気づいたのが、単に黒で塗ればそれで十分かというとそうでもなくて、5分の目盛りを目立たせたいのでここを黒にして、他はグレーにする、みたいな地味な調整をやったら見やすくなった。

f:id:hitode909:20210506094846j:plain
右が現在の値、左が30分前

もうちょっと良いグラフを貼っておく。5分泣き、5分休憩、8分泣き、10分休憩、そしていま再開、というグラフ。こうなったら環境を変えたほうが落ち着くことが多いので、散歩に出かけようと思う。
f:id:hitode909:20210506105539j:plain

わりと便利

ここ数日くらい使っていて、いつから泣いてるのか?ってときにチラ見できていて便利。リビングに置いてるけど、もう1個買ってきて、枕元にも置いておきたい。夜に寝ていて泣き声を聞いて起きたとして、今ちょうど泣き始めたところなのか、30分前からずっと泣いてたのか、を知れると、後者だとしたら、もうちょっと速く起きるためのアクションプランを考えられると思う。
また、複数台これが家にあると、どうやってデータを同期するか考え始めることができておもしろそう。リモートにデータベースを作れれば巨大配列を確保する必要がなくなり、プログラミング課題としても、もうちょっと楽しめると思う。

便利に使っているけど、イマイチな点や、もうちょっと改善したい点もある。

  • 本体を落としたり、マイク付近を触ってしまったときに大きなノイズが発生することで、うまいこと除去したい
    • ノイズはすぐに消えることに着目して、うまいこと平滑化できるとよいのかもしれない
  • 直近30分だけじゃなくて1日分の履歴を見たい
    • 毎日この時間に大騒ぎしてるとか分かったら便利そう
    • まずは長さ18000のfloatを確保しているのをなんとかする必要がある…

コードはここに置いています。お手元のM5StickCに書き込んでお手元のお子様の泣き声可視化にご利用ください。
180行くらいで音量の入力を取っていい具合に可視化できていて、行あたりの仕事量が高いと思う。
github.com

追記

いいこと聞いた、EEPROM試してみます。直感的には円形になってるとよさそうなのだけど縦80ピクセルしかないのではたして…というところはあります。

子の泣いてる時間を観察したくてM5StickCで泣き声モニタを作った - hitode909の日記

24時間のリングバッファを作って、円形に表示したら時計みたいで直感的になるのではないかと思った。ところで大きめのデータをとりたいときは生配列ではなくEEPROM使うのがいいです。

2021/05/06 10:50