『Arduino側サウンドセンサの入力値をシリアル通信で送受信しつつ、Processingでグラフィックイコライザーっぽくリアルタイムグラフ表示』してみるページ。
Lチカに始まり、ArduinoとProcessing連携第6弾。
今回は、Arduinoのスケッチは、Arduinoフォーラムから辿り着いたMeasuring Sound Levelsを、ほぼ、そのまま使わせて頂き、これとオリジナルのProcessingスケッチを組み合わせてみました。
イコライザと言っても今回は、音に合わせてリアルタイムで棒グラフの高さが変わるという表示のみで調整できるわけではありません。
確認は、Icecastインターネットラジオ某局放送のJazzをArduino側の音センサで拾い、シリアル送信、Processing側でリアルタイム棒グラフ表示することで行ないました。
グラフ1本じゃなんなのでダミー2本追加で3本にし、なんちゃって感を増幅してみましたが、ガラケーやスマホのアンテナみたいになってしまった...。
スケッチは後述するとして回路として必要になるハードウェアは、Arduinoボードとサウンド(音)センサ・モジュール、ブレッドボードを各1個とジャンパワイヤ4本だけ。(もちろん、USBケーブルとPC、Arduino IDEもしくは代替も要るけど。)
今回、サウンドセンサには、37センサーキットに入っていた(感度が違う?)大・小のマイクが載ったポテンショメータ付きモジュール各1個、両方とも使ってみました。
必要なソフトウェアは、Arduino IDEか代替とProcessing。
Arduinoのスケッチは、シリアル送信値を整数にしたかったので100倍してint型変数に入れ、それを送信することにした以外は、先のリンク先Adafruitのものを、そのまま使わせて頂きました。
が、Arduinoフォーラムのコメントを鵜呑みにしただけで、こんなに行数の少ないスケッチなのに中身を理解できていない...。
というか、単位時間(ここでは50ms)あたりのアナログ値1024以内における振幅の上限下限ピークをサンプリング、その差を求め、一般的な出力5VのArduinoボードを想定し、電圧換算した値を送る...と書いてあることはわかってるつもり...
が、精度は高そうな気がしなくもない、ただ、なんで単にアナログピンからの入力値を電圧変換したもの(当初自分で書いたラフスケッチ)だとダメなのかが、いまいちピンとこない...。
Processing側のスケッチは、グラフ化の際のシリアル通信をそのままにグラフ表示を細工してみました。
スケッチの大半はシリアル通信部分であり、今回のために書いたと言える部分は、
...くらいしかありません。
説明用も兼ねて長ったらしい変数名を使っていたり、無駄な大きさのint型にしていたり、要るか要らないか微妙な変数もあったりしますが、気にしない。
尚、音量の大小、スピーカーと音センサの距離はもちろん、入力値によって結果が変わるので実際の環境に合わせて調整が必要になるでしょう。
また、それっぽく見えるようにするには、ある程度、抑揚のある音源が求められることは言うまでもありません。
当初、サウンドセンサの使い道を模索、イコライザー風にしようと思いたち、リアルタイムなグラフの描画は簡単だろうと思いこんでArduinoのスケッチも単にアナログ入力値を電圧変換して送信...としてみましたが、これがよくないようで音源再生時のみならず、何もしていない時にも過剰な反応を示すなど、どうも、うまくいかない...。
調整を試みる中でオーディオ用アンプやオペアンプが必要なのか?手持ちないし...と諦めかけたものの、気を取り直して[arduino eqaulizer]で検索、先のArduinoのスケッチにたどり着き、思い描いていた通りの結果を得ることができた次第。
ちなみに当記事用にYouTubeに上げた動画を張ってみましたが、YouTube上では再生できますが、当サイト上だと、なぜか、再生できず、調べてみると、デモとしてIcecastのインターネットラジオ局放送の曲を流していたのですが、どうやら、これが著作権チェックにひっかかった模様...ということでYouTubeから削除しました。