遠隔チャイムのアナログ連動


[shiftallさんのブログ記事](https://blog.shiftall.net/ja/archives/324/)をみて，遠隔チャイムの連動いいなぁと感じ，obnizならもっと簡単なシステムで作れるのでは？？　と思ったので作ってみました．


## つくったもの

片方のチャイムを鳴らすともう片方のチャイムが<font color="Red">**物理的に**</font>押されるデバイス
![20180907_134609.GIF](https://qiita-image-store.s3.amazonaws.com/0/227015/39c54972-8db1-2a0b-c3c0-dd1b186ba898.gif)


## 動作フロー

![スクリーンショット 2018-09-07 13.55.22.png](https://qiita-image-store.s3.amazonaws.com/0/227015/0430cb90-f22a-10d7-d597-d3cc58e047d8.png)


[元ネタ](https://blog.shiftall.net/ja/archives/324/)の動作フローよりも項目が少なくなっています．
書くのがめんどくさくなって省略した　とかではなくて，obnizが勝手にやってくれる部分が多いので，シンプルになってます．

特に遠隔地連動している感じがしませんが，obnizAとobnizBはぜんぜん違う場所にあって大丈夫です．地球の裏側とかでも大丈夫です．

それなのに一つのプログラムの中でその２つが同時に扱えるってちょっと不思議ですね



## 素材
![IMG_8639.jpg](https://qiita-image-store.s3.amazonaws.com/0/227015/d5c12cf1-e64f-a5c5-35f6-3538c6040516.jpeg)

- [obniz](https://obniz.io) * 2
- へら (100円均一のものを使いました)
- [マイクモジュール](https://obniz.io/sdk/parts/AE_MICAMP/README.md?iframe=false)
- ワイヤ（マイクモジュールとobnizの接続に使います）
- [サーボモータ](https://obniz.io/sdk/parts/ServoMotor/README.md?iframe=false)
- ピンヘッダ（サーボモータとobnizの接続に使います）

あと，上の写真にはないですがobnizの電源用にモバイルバッテリーとUSBケーブルが２個ずつ必要です．

## つなげ方

まずはヘラとサーボモータを物理的に接着します．
最初はセロハンテープでぐるぐる巻きにしてたのですが，すぐ外れてしまったので，こういうときに万能なグルーガンで接着しました
![IMG_8647.JPG](https://qiita-image-store.s3.amazonaws.com/0/227015/a1eec24f-fba5-957f-8c48-17d275bd73bd.jpeg)


サーボモーターから出ている３本の線をobnizの０〜２番品に接続したらチャイムを鳴らす方は出来上がりです

- obnizB io0 : servo GND (茶色線) 
- obnizB io1 : servo VCC (赤線) 
- obnizB io2 : servo SIGNAL (黄色線) 

![IMG_8646.JPG](https://qiita-image-store.s3.amazonaws.com/0/227015/45b4e452-975c-f20a-3830-9c36a3354244.jpeg)


チャイムの音を検出する方はもっと簡単で，マイクモジュールとobnizをワイヤで接続するだけです．

- obnizA io0 : マイク VCC 
- obnizA io1 : マイク GND  
- obnizA io2 : マイク SIGNAL 

![IMG_8648.JPG](https://qiita-image-store.s3.amazonaws.com/0/227015/d2ba670a-99c3-6cff-6550-c4b558e95232.jpeg)


## ソースコード

書くプログラムも簡単です．
まずは２つのobnizに接続するのを待ちます 

`OBNIZ_A_ID`と`OBNIZ_B_ID`だけはそれぞれのobnizのidを書く必要があります

別々の２箇所にあるobnizを並列に並べて書けるのがやはり不思議ですね.

```javascript
var obnizSensor = new Obniz("OBNIZ_A_ID");
var obnizMotor = new Obniz("OBNIZ_B_ID");
  
(async function(){
  await obnizSensor.connectWait();
  await obnizMotor.connectWait();
  
  // ２つのobnizとながったらここで処理を書く

})();
```

接続が完了したら，マイクとサーボモータをつなげて初期設定（サーボモーターの角度の設定）を行います

```javascript
  var microphone = obnizSensor.wired("AE_MICAMP", {vcc:0, gnd:1, out:2});
  var servo = obnizMotor.wired("ServoMotor", {gnd: 0, vcc:1 , signal:2 });
  servo.angle(90.0); 
```

あとはもうマイクが反応したらサーボを動かして押すだけですね．
何回か試したところ，チャイムが鳴ると4.5V以上が来るっぽいので，しきい値を4.5V，サーボモータがチャイムを鳴らす時間を2000ms（＝2秒）にしています

ちょっとした工夫としては state変数を使うことで２連続でマイクが反応してしまうみたいなことを避けるようにしています.

```javascript

var threshold = 4.5;
var duration = 2000;
var state =  "none";

microphone.onchange = function(voltage){
    if(voltage > threshold ){
      if(state === "none"){
        state = "chime";
        console.log("chime");
        servo.angle(20.0); 
        
        setTimeout(()=>{
          state =  "none";
          servo.angle(90.0);
        }, duration);
      }
    }
}
```



## ソースコード全体

obnizはnode.jsかhtmlかでjavascriptを書くのですが，今回はhtmlでやりました．
全体のコードはこんなのになります

```html
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <script src="https://obniz.io/js/jquery-3.2.1.min.js"></script>
  <script src="https://unpkg.com/obniz@1.10.0/obniz.js" crossorigin="anonymous"></script>
</head>
<body>

<div id="obniz-debug"></div>
<h1>obniz instant html</h1>

<script>
var obnizSensor = new Obniz("OBNIZ_A_ID");
var obnizMotor = new Obniz("OBNIZ_B_ID");
var threshold = 4.5;
var duration = 2000;
var state =  "none";
  
(async function(){
  await obnizSensor.connectWait();
  await obnizMotor.connectWait();
  
  var microphone = obnizSensor.wired("AE_MICAMP", {vcc:0, gnd:1, out:2});
  var servo = obnizMotor.wired("ServoMotor", {gnd: 0, vcc:1 , signal:2 });
  servo.angle(90.0); 
  microphone.onchange = function(voltage){
    if(voltage > threshold ){
      if(state === "none"){
        state = "chime";
        console.log("chime");
        servo.angle(20.0); 
        
        setTimeout(()=>{
          state =  "none";
          servo.angle(90.0);
        }, duration);
      }
    }
  }
})();

</script>
</body>
</html>

```

HTMLの諸々を含めても50行も書かずに作れました．
こういったワイヤレスのものをサクッと作りたいときにobnizは楽ですね

![20180907_134609.GIF](https://qiita-image-store.s3.amazonaws.com/0/227015/39c54972-8db1-2a0b-c3c0-dd1b186ba898.gif)
↑ちゃんと見るとワイヤレスであるのがわかると思います