【電子工作】Arduinoでスペアナ作成物語① ~周波数変換器の動作確認~

Arduinoでスペアナ作成物語① ~周波数変換器の動作確認~

2019.07.06 10:25


ARDUINOLEDMAX4466マイクモジュール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をダイナミック点灯させますので、次はシフトレジスタを用いてダイナミック点灯に挑戦します



<使用部品>

Arduino UNO

マイク増幅器 MAX4466モジュール

オーディオ用7バンドスペクトラムアナライザ- MSGEQ7

LED青 5mm


関連記事
【電子工作】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);

}


<参考ブログ>

オーディオ用スペアナ製作

Arduinoで遊ぶブログ

機械系学生によるブログ

返信を残す

メールアドレスが公開されることはありません。