Arduinoでスペアナ作成物語① ~周波数変換器の動作確認~
2019.07.06 10:25
ARDUINO、LED、MAX4466マイクモジュール、MSGEQ7を使ったスペクトラムアナライザを作っていきます
今回はその途中で、点灯するLEDの数が少なめです
まずは今回作成したスペアナをご覧ください
実物を写真で撮りましたが、ジャンプワイヤで見づらくなってしまいました。。。
回路図
回路図は水魚堂の回路図エディタで作成しました
Arduinoの回路図は居酒屋ガレージ日記様より拝借しました、ありがとうございます
今回のポイントはマイクモジュールMAX4466で音を拾って、MSGEQ7で周波数変換することです
MSGEQ7で出力するバンド帯は63Hz、160Hz、400Hz、1kHz、2.5kHz、6.25kHz、16kHz
各バンドにつき1個のLEDが光るプログラムになっています
今回は関係ありませんが、マイクモジュールの動作電圧を3.3Vにしているため、最大3.3V、無音の時はその半分の電圧1.65Vを出力します
MSGEQ7はマイクモジュールからの入力を受けて、7バンドの強度を出力します
MSGEQ7の出力をArduinoのアナログピンA0に入力し、デジタルで読み取ります
この際、Arduinoは0~5.5Vの入力を0~1023値で読み取ります
下のプログラム上のMSoutValueがこの値にあたります
通常のスペクトラムアナライザは、各バンドにつき複数のLEDをダイナミック点灯させますので、次はシフトレジスタを用いてダイナミック点灯に挑戦します
<使用部品>
・オーディオ用7バンドスペクトラムアナライザ- MSGEQ7
関連記事
・【電子工作】Arduinoでスペアナ作成物語② ~シフトレジスタの動作確認~
・【電子工作】Arduinoでスペアナ作成物語③ ~完成偏~
・【電子工作】3x3x3 LEDキューブ作成
参考としてArduinoのプログラムを載せておきます
//Declare Spectrum Shield pin connections
#define RESET 2
#define STROBE 3
int MSout = A0;
#define led1 7
#define led2 8
#define led3 9
#define led4 10
#define led5 11
#define led6 12
#define led7 13
int MSoutValue = 0;
void setup() {
// put your setup code here, to run once:
//Set spectrum Shield pin configurations
Serial.begin(9600);
pinMode(RESET, OUTPUT);
pinMode(STROBE, OUTPUT);
pinMode(MSout, INPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
pinMode(led6, OUTPUT);
pinMode(led7, OUTPUT);
digitalWrite(STROBE, HIGH);
digitalWrite(RESET, HIGH);
//Initialize Spectrum Analyzers
digitalWrite(STROBE, LOW);
delay(1);
digitalWrite(RESET, HIGH);
delay(1);
digitalWrite(STROBE, HIGH);
delay(1);
digitalWrite(STROBE, LOW);
delay(1);
digitalWrite(RESET, LOW);
}
void loop() {
// put your main code here, to run repeatedly:
//led1
digitalWrite(STROBE, HIGH);
delayMicroseconds(50);
digitalWrite(STROBE, LOW);
MSoutValue = analogRead(MSout);
if (MSoutValue > 400){
digitalWrite(led1, HIGH);
}
else {
digitalWrite(led1, LOW);
}
Serial.println(MSoutValue);
delayMicroseconds(50);
//led2
digitalWrite(STROBE, HIGH);
delayMicroseconds(50);
digitalWrite(STROBE, LOW);
MSoutValue = analogRead(MSout);
if (MSoutValue > 400){
digitalWrite(led2, HIGH);
}
else {
digitalWrite(led2, LOW);
}
Serial.println(MSoutValue);
delayMicroseconds(50);
//led3
digitalWrite(STROBE, HIGH);
delayMicroseconds(50);
digitalWrite(STROBE, LOW);
MSoutValue = analogRead(MSout);
if (MSoutValue > 400){
digitalWrite(led3, HIGH);
}
else {
digitalWrite(led3, LOW);
}
Serial.println(MSoutValue);
delayMicroseconds(50);
//led4
digitalWrite(STROBE, HIGH);
delayMicroseconds(50);
digitalWrite(STROBE, LOW);
MSoutValue = analogRead(MSout);
if (MSoutValue > 400){
digitalWrite(led4, HIGH);
}
else {
digitalWrite(led4, LOW);
}
Serial.println(MSoutValue);
delayMicroseconds(50);
//led5
digitalWrite(STROBE, HIGH);
delayMicroseconds(50);
digitalWrite(STROBE, LOW);
MSoutValue = analogRead(MSout);
if (MSoutValue > 400){
digitalWrite(led5, HIGH);
}
else {
digitalWrite(led5, LOW);
}
Serial.println(MSoutValue);
delayMicroseconds(50);
//led6
digitalWrite(STROBE, HIGH);
delayMicroseconds(50);
digitalWrite(STROBE, LOW);
MSoutValue = analogRead(MSout);
if (MSoutValue > 400){
digitalWrite(led6, HIGH);
}
else {
digitalWrite(led6, LOW);
}
Serial.println(MSoutValue);
delayMicroseconds(50);
//led7
digitalWrite(STROBE, HIGH);
delayMicroseconds(50);
digitalWrite(STROBE, LOW);
MSoutValue = analogRead(MSout);
if (MSoutValue > 400){
digitalWrite(led7, HIGH);
}
else {
digitalWrite(led7, LOW);
}
Serial.println(MSoutValue);
delayMicroseconds(50);
}
<参考ブログ>