目的
obnizに慣れ、IoT初心者としてその楽しさを知ることを目的に、継続してobnizと触れ合っていきます。
実装目標
最初は、距離センサーで人の動きを感知してライン経由で通知を送ってくれるプログラムを作ろうとしていました。
というのも、私が管理しているオープンスペースがあるのですが、部屋を離れていても、人が来た時に教えてくれると便利だなと思ったからです。そうした生活に根付いた便利さがあると、継続してobnizに興味を持てるのではと思います。
ただ、いきなり距離センサーが不機嫌で、電圧が高いだの何だの連呼しだし、時間がないのもあり路線を変更することになりました。(ハーゲンダッツより高いくせに、まさかこのまま壊れる気じゃないだろうな。)
実装目標 (変更)
ということで、光センサーの電圧の値を拾って、それによってスピーカーから出る音色が変わるテルミンのようなプロダクトを作ることにしました。
ちなみに、テルミンとは、1920年にロシアのテルミン博士が作った世界初の電子楽器。楽器に直接触れず、電磁場に手をかざすことで悲しそうな女性の声のような音がなる不思議な楽器です。
90年代後半頃に、よくミュージシャンが使っていた記憶があります。
懐かしの The Jon Spencer Blues Explosion とか。
環境・デバイス
Node.js v17.6.0
obniz v3.19.1
圧電スピーカー(13mm)
Cdsセル 5mmタイプ
超音波距離センサー HC−SR04
完成品
(追記)コードを一部書き換えて、動くものが完成しました。
とりあえず光センサーの明暗に反応して、音色が変わるテルミン的なやつはできた。#protoout #obniz pic.twitter.com/s6roR2PPCA
— yoshio333 (@yoshio333333) April 10, 2022
最終コード
const Obniz = require('obniz');
const obniz = new Obniz('-');
obniz.onconnect = async () => {
obniz.io0.output(true); // io0電圧を5Vに(電源+)
obniz.io2.output(false); // io2電圧を0Vに(電源−)
const speaker = obniz.wired('Speaker', { signal: 10, gnd: 11 }); //スピーカーの接続端子
// io1をアナログピンに(センサーの値を取得)
obniz.ad1.start((voltage) => {
// センサーの値が変わるたびに実行される
console.log(voltage);
//スピーカーに音出力
speaker.play(voltage*1000);
});
// displayに反映
obniz.display.clear();
obniz.display.print('theramin');
}
つまずいたポイント
①voltageをスピーカーのヘルツ数としてこのように、呼び込みたかったのですが…
speaker.play(voltage*7000);
このエラーが表示。
↓
ReferenceError: voltage is not defined
voltageは、この{}の中でしか動かないことがわかり、speakerの位置を移動させることでコードが走るようになりました。
obniz.ad1.start((voltage) => {}
②新たなるエラーの出現
動くには動いたのですが、少し音を鳴らすと強制的にこのエラーが出て落ちるようになってしまいました。
光センサーで貧者のテルミンにトライが、あと一息のところで新しいタイプのエラーが出現。セミの断末魔みたいな音でタイムアップ。ちきしょー!#protoout #obniz pic.twitter.com/XhFkeEGNAr
— yoshio333 (@yoshio333333) April 6, 2022
Error: No More pwm Available.
PWMというのは、パルス幅変調を指すらしく、よくわからんが、何かがいっぱいいっぱいと言っていそうなので、インターバルを入れて、電圧の数値を取ってくる頻度を下げてみようと試みていたのですが、タイムアップとなってしまいました。
(後日追記)
どうも、この宣言が、何度もループしていたことで、メモリーのようなものを食って、途中で落ちていたようでした。
const speaker = obniz.wired('Speaker', { signal: 10, gnd: 11 });
そのため、この{}の中からconstを外に出すことで、プログラミンが問題なく走るようになりました。
obniz.ad1.start((voltage) => {}
まとめ
あまり触る時間が取れず、残念な結果になったのですが、obniz自体は、プログラムが実体を伴って実生活にガシガシ侵食してくる感じが面白く。もう少し遊んでみようと思います。
(追記)
とりあえず、最低限のテルミンのようなものを作ることはできました。