Raspberrino

ラズベリーノ。ArduinoやRaspberry Piなどの電子工作で便利なものを作っちゃうぞ!

音姫もどきを自作してみた (Arduinoで人感センサー連動リモコンを作成)

f:id:ikkigonta:20150509150432j:plain

TOTO音姫のようなトイレ用の擬似流水音発生装置には、いくつか問題があるように思っていたので、今回はトイレ用の擬音装置を、Arduinoを使って自分でも実現できる方法で作ってみました。

私が感じる音姫の問題とは

  • 音がしょぼい。いかにも擬音といった感じのこもった音で、リアルじゃない。
  • 音自体がトイレの水を流す音をシミュレートしたもので、気持ちのよい音ではない。
  • ボタン式のものは、意識している自分をアピールしているようで、押すのがためらわれる。
  • 賃貸物件では設置が難しい。

目指したもの

  • 音姫より良い音がすること。
  • 自然の水のせせらぎや波の音、そしてアンビエントな音楽によって、不快な音をオブラートに包むこと。
  • 自動で音が流れ始めて、自動で止まること。
  • それなりにかっこいいこと。少なくとも見苦しくないこと。

どうやって音楽をならすか

音楽を出すのに一番手軽で、わりといい音がするものと言えば、いわゆる「ラジカセ」かな、と思ったのですが、トイレに置くのは変な感じ。そこで、かっこいいラジカセ的なものを探したところ、かの有名な無印良品のCDプレーヤーを思い出しました。MoMAコレクションに選ばれてる、深澤直人デザインのやつ。換気扇のように紐を引っ張ると音が鳴り出すのが特徴なんですが、どうやらリモコンでも操作可能なことがわかりました。だったら、Arduinoに人感センサーを付けて、再生ボタンのリモコン信号を飛ばせばいいじゃん!

用意したもの

制御箱を作る

f:id:ikkigonta:20150509154719j:plain 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);
}

センサーをケースに納める

f:id:ikkigonta:20150509155439j:plain iPhoneの空箱はサイズ的にもぴったりで、綺麗に収まります。センサー用の穴まで予め開いている穴の位置でぴったり! 電源は、USBのACアダプタを使って、USBから供給することにしました。

完成

f:id:ikkigonta:20150509161207j:plain というわけで、このようなものが出来上がりました。動作確認をしたところ、CDプレーヤーのリモコン信号受光部が右上にあるらしく、 赤外線LEDの出力が届かない! しかなたいので、ジャンパーワイヤーを伸ばしてみたところ、正常に動作しました。この部分は、そのうちどうにかしたいと思います。(冒頭の写真ではストローで隠しています)

なお、CDプレーヤーなので、再生を送信してから、CDが回転して、実際に曲が流れるまでのタイムラグが若干気になります。 あと、再生位置を覚えていてくれないので、毎回1曲目しか再生できません。

とは言え、今回の、Arduinoとプレーヤーは完全に独立したものなので、汎用性が高いのではないでしょうか。 例えば、人を検知してリモコン信号でテレビをつけることや、照明をつけること、などにも応用が可能だと思います。

音姫TOTO株式会社の登録商標です。