音姫もどきを自作してみた (Arduinoで人感センサー連動リモコンを作成)
TOTOの音姫のようなトイレ用の擬似流水音発生装置には、いくつか問題があるように思っていたので、今回はトイレ用の擬音装置を、Arduinoを使って自分でも実現できる方法で作ってみました。
私が感じる音姫の問題とは
- 音がしょぼい。いかにも擬音といった感じのこもった音で、リアルじゃない。
- 音自体がトイレの水を流す音をシミュレートしたもので、気持ちのよい音ではない。
- ボタン式のものは、意識している自分をアピールしているようで、押すのがためらわれる。
- 賃貸物件では設置が難しい。
目指したもの
- 音姫より良い音がすること。
- 自然の水のせせらぎや波の音、そしてアンビエントな音楽によって、不快な音をオブラートに包むこと。
- 自動で音が流れ始めて、自動で止まること。
- それなりにかっこいいこと。少なくとも見苦しくないこと。
どうやって音楽をならすか
音楽を出すのに一番手軽で、わりといい音がするものと言えば、いわゆる「ラジカセ」かな、と思ったのですが、トイレに置くのは変な感じ。そこで、かっこいいラジカセ的なものを探したところ、かの有名な無印良品のCDプレーヤーを思い出しました。MoMAコレクションに選ばれてる、深澤直人デザインのやつ。換気扇のように紐を引っ張ると音が鳴り出すのが特徴なんですが、どうやらリモコンでも操作可能なことがわかりました。だったら、Arduinoに人感センサーを付けて、再生ボタンのリモコン信号を飛ばせばいいじゃん!
用意したもの
- Arduino Uno R3:(SWITCH SCIENCE)
- 赤外線LED:OSI5LA5113A (秋月)
- 赤外線リモコン受信モジュール:OSRB38C9AA (秋月)
- 人感センサー:PIR Motion Sensor Module DYP-ME003(ヴイストンロボットセンター)
- 抵抗 47Ω (秋月)
- ブレッドボード(秋月)
- ジャンパーワイヤー
- CDプレーヤー:CPD-4(無印良品)
- CD:iTunesで自然のせせらぎ音をいくつか購入して焼いたCD-R
制御箱を作る
iPhoneの空箱を利用して、Arduinoとブレッドボードを収めました。
リモコン信号の取得
リモコン信号の取得は、下記のサイトを参考にさせてもらいました。シリアル出力される文字列の、最初のカンマまでの最初の数字を除いて配列にコピペしたところ、問題なく動作しました!
参考サイト:Arduinoでリモコン作成
人感センサーとの連動
人感センサーと連動して、さきほど取得したリモコン信号を送信するコードを書きます。この人感センサーは人が近くで動いている時だけHIGHを返すため、人が動かないとすぐLOWになってしまいます。トイレで人はそんなに動かないため、HIGHで音楽を再生して、LOWで音楽を停止する、という実装をしてしまうと、音楽はすぐに止まってしまいます。
そこで、内部フラグ(currentState)で、人がいるかいないかを管理しています。人感センサーがHIGHになったらcurrentStateもtrueとなり、音楽を再生します。その後、LOWとなった状態が60秒以上続いたら、currentStateをfalseとして音楽を停止しています。
/* 人感センサーは動きを感知するので、動きがなければLOWになる。 currentStateが切り替わるときに、sendPlay,sendStopを送信する crrentStateは、人感センサーがOFFになって約60秒たつとfalseになる。 */ int ir_out = 2; int jinkan_in = 8; boolean currentState = false; int sensorLowCount = 0; // 再生のリモコン信号 unsigned int dataPlay[] = {895,449,54,57,54,58,54,56,54,57,54,57,54,56,54,57,54,169,54,57,54,170,54,57,54,56,54,169,54,169,54,170,54,57,54,56,54,57,54,56,54,169,54,57,54,57,54,57,53,57,54,169,54,169,54,169,54,57,54,169,54,169,54,169,54,169,54,4352,895,226,54}; // 停止のリモコン信号 unsigned int dataStop[] = {896,449,54,57,54,57,54,56,54,57,54,57,54,56,55,56,54,169,54,58,54,169,54,57,54,57,54,169,54,169,54,170,54,56,54,169,55,56,54,58,54,169,55,56,54,56,54,56,55,56,54,57,54,169,54,169,54,57,54,169,54,169,54,169,54,170,54,4353,895,226,54}; unsigned long us = micros(); // セットアップ void setup() { //Serial.begin(57600); pinMode(jinkan_in, INPUT); pinMode(ir_out, OUTPUT); } // dataからリモコン信号を送信 void sendData(unsigned int *data) { int dataSize = sizeof(data) / sizeof(data[0]); for (int cnt = 0; cnt < dataSize; cnt++) { unsigned long len = data[cnt]*10; // dataは10us単位でON/OFF時間を記録している unsigned long us = micros(); do { digitalWrite(ir_out, 1 - (cnt&1)); // cntが偶数なら赤外線ON、奇数ならOFFのまま delayMicroseconds(8); // キャリア周波数38kHzでON/OFFするよう時間調整 digitalWrite(ir_out, 0); delayMicroseconds(7); } while (long(us + len - micros()) > 0); // 送信時間に達するまでループ } } void loop() { int sensorVal = digitalRead(jinkan_in); if(sensorVal == HIGH){ //Serial.println("H"); if(currentState == false){ //Serial.println("sendPlay"); sendData(dataPlay); currentState = true; } sensorLowCount = 0; }else{ //Serial.println("L"); if(currentState == true){ sensorLowCount++; if(sensorLowCount > 600) { //Serial.println("sendStop"); sendData(dataStop); currentState = false; } } } delay(100); }
センサーをケースに納める
iPhoneの空箱はサイズ的にもぴったりで、綺麗に収まります。センサー用の穴まで予め開いている穴の位置でぴったり! 電源は、USBのACアダプタを使って、USBから供給することにしました。
完成
というわけで、このようなものが出来上がりました。動作確認をしたところ、CDプレーヤーのリモコン信号受光部が右上にあるらしく、 赤外線LEDの出力が届かない! しかなたいので、ジャンパーワイヤーを伸ばしてみたところ、正常に動作しました。この部分は、そのうちどうにかしたいと思います。(冒頭の写真ではストローで隠しています)
なお、CDプレーヤーなので、再生を送信してから、CDが回転して、実際に曲が流れるまでのタイムラグが若干気になります。 あと、再生位置を覚えていてくれないので、毎回1曲目しか再生できません。
とは言え、今回の、Arduinoとプレーヤーは完全に独立したものなので、汎用性が高いのではないでしょうか。 例えば、人を検知してリモコン信号でテレビをつけることや、照明をつけること、などにも応用が可能だと思います。