2019年07月14日

サウンドグラフィックイコライザーシールド -スケッチその1(MSGEQ7の制御)

はじめに

 今回も制作中のサウンドグラフィックイコライザーシールド(SGES)について説明します。ブログの更新が久し振りですので、制作物の紹介動画を載せておきます。


 前回はSGESの部品構成を説明しました。SGESはArduinoで動かしていますので、今回はSGESを動かすためのスケッチについて説明をします。スケッチの主な流れは下記の通りです。
  1. 各値の初期設定
  2. MSGEQ7から音の大きさ値を取得
  3. 音の大きさに応じて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]です。

I-12887.jpg
図1 MSGEQ7の外観(写真は秋月電子から)

 このMSGEQ7にマイクやAUXなどから音声信号を入力し、MSGEQ7の出力をArduinoで読み取って、周囲の音の大きさを測ります。


2. MSGEQ7の接続

 ArduinoでMSGEQ7を制御するためにはピンを接続する必要があります。接続するのはArduinoのデジタル入出力ピンにMSGEQ7のRESETとSTROBEアナログ入力ピンにOUT、合計3本のピンです。

0711_MSGEQ7ピン配置.png
図2 ArduinoとMSGEQ7の接続

 RESETとSTROBEの2つの線でMSGEQ7を制御し、OUTからのアナログ値をArduinoでA/D変換して読み取ります。


3. MSGEQ7の制御方法

 MSGEQ7はRESETとSTROBEの2本で制御するわけですが、これらの信号はデータシートに記載されているタイミングチャートに従って動かします。

2019-07-11.png
図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(青線)の波形が下図です。

0711_タイミングチャート.png
図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を光らせるスケッチの説明をする予定です


×

この広告は180日以上新しい記事の投稿がないブログに表示されております。