新しい子育てアプリをリリースしました「添い寝アラーム」
Posted on 2012年4月30日(月) 22:22
前々からちょっと書いていましたが、新しいアプリをリリースしました。
そもそも、ComicGlassの開発するために子どもを寝かしつけてから時間を取っていたのですが、子どもと一緒に寝てしまうんですよね。
この「子どもと一緒に寝てしまう」問題は多くの親が「そうそう!」って頷く問題なわけですが、それをなんとかしようというアプリです。アプリ名は「添い寝アラーム」です。
スクリーンショットはこんな感じ。
まず、最初にやったのは「暗闇でも止められるアラーム」です。
普通のアラームアプリは画面を見て止めますよね?
あれだと、もしまだ子どもが寝ていなかったりするときに画面を点灯させなければならないのが困るのです。
そういうわけで、加速度センサを利用し、iPhoneを軽く叩くとアラームがスヌーズになるアラームアプリを作りました。
しかし、これでやってみるとアラーム時間を何分後くらいに設定すればいいのかが難しい。
絵本を読み聞かせている途中になってしまったり、まだ子どもが起きていてしゃべっている最中や、ゴロゴロ転がっている(子どもはよく動きます)途中にアラームがなってしまったりします。
そこでアラーム時間の自動設定方法の開発に取り組みました。
使えるのはマイクと加速度センサ。
連日データを収集し、毎秒どのくらいのデータを取得し、どのように信号処理したらいいのかを試験しました。
少しでも楽に使えたらいいなーと思いながら毎回すこしづづ改善をした結果、それなりに良い感じになってきたので、本格的にアプリにしてみました。
(最初に時点では完全自分用で公開するつもりはなかったのですが)
最終的に、iPhoneの接近センサー、バイブレーター、マイク、スピーカー、加速度センサ、と、かなり内蔵デバイスを多く使うアプリになりました。
技術的な話をすれば、普通じゃありえないような頻度でAudioSessionを切り替えていたりと色々勉強になりました。
簡単に書きますと、
まずAudioSessionを切り替え、マイク入力を有効にします。
AudioSessionInitialize(NULL, NULL, NULL, NULL); UInt32 category = kAudioSessionCategory_PlayAndRecord; AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(UInt32), &category); AudioSessionSetActive(YES);
それで音声をモニタリング。
加速度センサは60Hzで取得して微分して使っています。
音声と加速度の認識処理の部分は説明できないので省きますが、完璧な検出はやはり無理なので、アラームタイミングを長くしたり短くしたりすることでだいたい目的の動作が得られるようになっています。
アラームタイミングになると、オーディオセッションをマナーモードでも音が出るようにPlaybackに切り替えてバイブレーターを鳴らします。
(録音モードのままだとスピーカーの音量が自動的に抑えられてしまうというのもあります)
もう一つ苦労したのが、スヌーズのやり方です。
iPhoneを軽く叩いた事を検出すればいいだけなので一見簡単そうなのですが、同時にバイブレーターが動作しているというのが問題でした。
iPhoneを置いている場所(の硬さ)によってバイブレーター→謎の伝達関数→加速度センサの値が全然違うんですよね。
そこで、最初の一定時間は「謎の伝達関数」を推定する処理を行い、その後軽く叩いた動作を検出するようにしています。
最初の着想は簡単だったのですが、調整がとにかく大変でした・・・。
子育て中で、「寝てしまう!」問題にお困りの方がいらっしゃいましたら是非お試しくださいませ。