はじめに
今回も制作中のサウンドグラフィックイコライザーシールド(SGES)について説明します。ブログの更新が久し振りですので、制作物の紹介動画を載せておきます。
前回はSGESの部品構成を説明しました。SGESはArduinoで動かしていますので、今回はSGESを動かすためのスケッチについて説明をします。スケッチの主な流れは下記の通りです。
- 各値の初期設定
- MSGEQ7から音の大きさ値を取得
- 音の大きさに応じてLEDを制御
今回説明するのは2番のMSGEQ7から音の大きさを取得するスケッチです。それに伴ってピン配置やタイミングチャートなども説明します。
目次
1. MSGEQ7の概要
まずはMSGEQ7が何かということですが、MSGEQ7はグラフィックイコライザー用ICです。入力された音声信号から7つの周波数の音の強さをアナログ出力します。周波数は63[Hz]、160[Hz]、400[Hz]、1[kHz]、2.5[kHz]、6.25[kHz]、16[kHz]です。
図1 MSGEQ7の外観(写真は秋月電子から)
このMSGEQ7にマイクやAUXなどから音声信号を入力し、MSGEQ7の出力をArduinoで読み取って、周囲の音の大きさを測ります。
2. MSGEQ7の接続
ArduinoでMSGEQ7を制御するためにはピンを接続する必要があります。接続するのはArduinoのデジタル入出力ピンにMSGEQ7のRESETとSTROBE、アナログ入力ピンにOUT、合計3本のピンです。
図2 ArduinoとMSGEQ7の接続
RESETとSTROBEの2つの線でMSGEQ7を制御し、OUTからのアナログ値をArduinoでA/D変換して読み取ります。
3. MSGEQ7の制御方法
MSGEQ7はRESETとSTROBEの2本で制御するわけですが、これらの信号はデータシートに記載されているタイミングチャートに従って動かします。
図3 MSGEQ7のタイミングチャート(データシートから)
このタイミングチャートを満たすようにArduinoのピンを動かします。下記がMSGEQ7制御部分のみを抜粋したソースコードです。
void ReadMSGEQ7(){
digitalWrite(MSGEQ7_RESET, LOW);
delayMicroseconds(100); //Reset to Strobe Delay(trs)
//FREQ_NUMは7
for(byte freq=0; freq<FREQ_NUM; freq++){
digitalWrite(MSGEQ7_STROBE, LOW);
delayMicroseconds(50); //Output Setting Time(to)
valAmplitude[freq] = analogRead(MSGEQ7_OUT);
delayMicroseconds(20); //指定や名称無し。これとtoとtsの合計がStrobe to Strobe Delay(tss)
digitalWrite(MSGEQ7_STROBE, HIGH);
delayMicroseconds(30); //Strobe Pulse Width(ts)
}
digitalWrite(MSGEQ7_RESET, HIGH);
delayMicroseconds(1); //Reset Pulse Width(tr)
}
簡単に説明すると「STROBEを変化させながらOUTPUTを読み込む処理を7回繰り返す」ということをしています。時間は余裕を持たせてタイミングチャートの1.5倍くらいにしています。
4. スケッチの実行結果
上記のソースコードを実際に動かしたときのSTROBE(赤線)とOUT(青線)の波形が下図です。
図4 MSGEQ7制御時の波形
STROBE信号やOUT出力の変化がちゃんと7回ありますので、7つの周波数を読み取れていることが分かります。この波形は確か適当な音楽を流しながら測定したものでした。400[Hz]や1[kHz]の音が大きく鳴っていることが分かります。
STROBE信号の設定したタイミングと実際のタイミングについてですが、HIGHの時間はスケッチの設定が30[us]に対して実際は約35[us]とそこまで差がありません。ですがLowの時間はスケッチが70[us]に対して実際は190[us]と結構差があります。これはanalogRead()の処理で100[us]〜200[us]かかるためです。ですので、問題はありません。
おわりに
今回はこのようにArduinoでMSGEQ7をきちんと制御することが出来ました。次回は取得した値からLEDを光らせるスケッチの説明をする予定です