これを作りました🎶
#obniz でテルミンもどき pic.twitter.com/hDeXBs76pc
— kohbis (@kohbis) December 8, 2019
必要なもの
- obniz
- モジュール
- スピーカー
- 距離センサー
 
- 音を出しても怒られない環境
モジュールたち
スピーカー
こちらのスピーカーを使用しました。
周波数に対応した音が鳴ります。
(ブザーっぽい音が結構な大きさで鳴るので夜は動かせませんでした笑)
var speaker = obniz.wired("Speaker", {signal:0, gnd:1});
speaker.play("周波数");
🎶ドレミファソラシド🎶
| 音名 | 周波数 | |
|---|---|---|
| ド | C4 | 523.251 | 
| レ | D4 | 587.330 | 
| ミ | E4 | 659.255 | 
| ファ | F4 | 698.456 | 
| ソ | G4 | 783.991 | 
| ラ | A4 | 880.000 | 
| シ | B4 | 987.767 | 
| ド | C5 | 1046.502 | 
const obniz = new Obniz("XXXX-XXXX");
const C4 = 523.251;
const D4 = 587.330;
const E4 = 659.255;
const F4 = 698.456;
const G4 = 783.991;
const A4 = 880.000;
const B4 = 987.767;
const C5 = 1046.502;
const music = [C4, D4, E4, F4, G4, A4, B4, C5];
obniz.onconnect = async () => {
  const speaker = obniz.wired("Speaker", {signal:10, gnd:11});
  for(let m of music) {
    speaker.play(m);
    await obniz.wait(1000);
  }
  speaker.stop();
};
距離センサー
障害物との距離を mm(ミリメートル) で返してくれます。
センサーから50mm単位で音階を割り当てて、テルミンっぽい感じで音を鳴らせるようにします。
公式のサンプルを参考にさせていただき、最終的にはこんな感じになります。
const obniz = new Obniz("XXXX-XXXX");
const C4 = 523.251;
const D4 = 587.330;
const E4 = 659.255;
const F4 = 698.456;
const G4 = 783.991;
const A4 = 880.000;
const B4 = 987.767;
const C5 = 1046.502;
obniz.onconnect = async () => {
  const hcsr04 = obniz.wired("HC-SR04", {gnd:3, echo:2, trigger:1, vcc:0});
  const speaker = obniz.wired("Speaker", {signal:10, gnd:11});
  while(true) {
    let avg = 0;
    let count = 0;
    for (let i=0; i<3; i++) {
      const val = await hcsr04.measureWait();
      if (val) {
        count++;
        avg += val;
      }
    }
    if (count > 1) {
      avg /= count;
    }
    if (50 < avg && avg < 100) {
      speaker.play(C4);
    } else if (100 < avg && avg < 150) {
      speaker.play(D4);
    } else if (150 < avg && avg < 200) {
      speaker.play(E4);
    } else if (200 < avg && avg < 250) {
      speaker.play(F4);
    } else if (250 < avg && avg < 300) {
      speaker.play(G4);
    } else if (300 < avg && avg < 350) {
      speaker.play(A4);
    } else if (350 < avg && avg < 400) {
      speaker.play(B4);
    } else if (400 < avg && avg < 450) {
      speaker.play(C5);
    } else {
      speaker.stop();
    }
    await obniz.wait(400);
  }
}
演奏
(クオリティはご勘弁ください🙇♂️)
チューリップ
ドレミだけで、かつテンポが一定の曲は演奏しやすいです。
#obniz でチューリップ pic.twitter.com/9sWLU1YPC7
— kohbis (@kohbis) December 8, 2019
パプリカ
半音を組み合わせると、演奏できる曲がぐっと増えますね!
ただテンポが一定でないので、距離センサーの判定タイミングとずれると難しい。。
#obniz でパプリカ pic.twitter.com/ZEp0L5vEqe
— kohbis (@kohbis) December 8, 2019
最後に
距離センサーで取得した値を処理していくので、どうしても一定の間隔が必要になり、テルミンの「うゎんうゎん」感を出すことはできませんでした。(頑張ったらできるのかな)
先日参加した養老乃瀧ハッカソンで↓を作ったのですが、そのときに「音×IoT」って面白いな!と思ったので今回テルミンもどきを作ってみました。
#yorohack 指ぱんっちんでオーダーww pic.twitter.com/cLQ4cYdGlJ
— 菅原のびすけ (@n0bisuke) October 27, 2019
obnizは持っていたもののサーボモーターくらいしかまともに使ったことはなかったので、とても楽しかったです!
RaspberryPiやM5Stackも好きですが、Javascriptでサクッと開発できてしまうこの手軽さは本当にすばらしいと思います。
Thank you, Obniz!!
Let's Obniz!!
