LoginSignup
4

More than 3 years have passed since last update.

posted at

updated at

obnizでテルミンもどき🎶

これを作りました🎶

obniz.jpg

必要なもの

  • 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);
  }
}

演奏

(クオリティはご勘弁ください🙇‍♂️)

チューリップ

ドレミだけで、かつテンポが一定の曲は演奏しやすいです。

パプリカ

半音を組み合わせると、演奏できる曲がぐっと増えますね!
ただテンポが一定でないので、距離センサーの判定タイミングとずれると難しい。。

最後に

距離センサーで取得した値を処理していくので、どうしても一定の間隔が必要になり、テルミンの「うゎんうゎん」感を出すことはできませんでした。(頑張ったらできるのかな)

先日参加した養老乃瀧ハッカソンで↓を作ったのですが、そのときに「音×IoT」って面白いな!と思ったので今回テルミンもどきを作ってみました。

obnizは持っていたもののサーボモーターくらいしかまともに使ったことはなかったので、とても楽しかったです!
RaspberryPiやM5Stackも好きですが、Javascriptでサクッと開発できてしまうこの手軽さは本当にすばらしいと思います。

Thank you, Obniz!!
Let's Obniz!!

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
4