音(サウンド)センサモジュールを使ってみる(Arduino)

今回は、Sound (音)センサモジュールです。
私のセンサモジュールです。

Sound (音)センサモジュール
Sound (音)センサモジュール

音声センサーモジュール [MIC393-M2]
  aitendo
  https://www.aitendo.com/product/14874
   ¥295-
  ※私のものは、大陸調達品で、¥50-前後で入手できます。

Soundセンサモジュールは、
モジュールのマイクで音情報を取得するものです。
このセンサモジュールには、
アナログ出力とデジタル出力の端子があり、
アナログ出力では、マイクの信号をそのまま取得でき、
デジタル出力では、可変抵抗で設定された値により、
HIGH(1)、LOW(0) を出力するものです。
※Soundセンサモジュールには、
 アナログ出力のみ、デジタル出力のみのものもあります。

では、Arduino に接続して使ってみます。

アナログ出力とデジタル出力の情報を、
シリアルモニタで確認してみます。

回路は図の通りです。
   この回路図の作図には fritzing を利用させて頂いております。
   https://fritzing.org/home/

回路図1
回路図1

このSoundセンサモジュールは使用前に感度調整が必要です。
供給電圧により感度が変化するため、
供給電圧の変化が大きい場合は、使いづらいと思います。

画像のSoundセンサモジュールの右にあるLED(LED1)が電源供給、
左側のLED(LED2)が音反応時のものです。

調整は、使用環境により変わりますが、
今回は、無音状態で、可変抵抗を回し左側のLED(LED2)が,
消灯した辺りが良いと思います。

センサ感度の調整
センサ感度の調整

電源を供給しながら、可変抵抗を廻して調整しますが、
無音状態で、LEDが点灯していれば、緩めます。(反時計回り)
LEDが消灯していれば、締め込みます。(時計回り)
これで、ちょうど消灯した辺りに調整します。
※調整ネジの締め込み、緩めは、壊さないよう慎重に行います。

アナログ出力される値を見てみます。
スケッチです。

// 音センサ(アナログ生値表示)

// ポート指定用変数設定
int a0_in_port = A0;    // センサ デジタル情報入力

// 受信データ用変数設定
int a0_data;    // analogデータ用

void setup() {
  // put your setup code here, to run once:
  // シリアルモニタ通信速度設定
  Serial.begin(9600);  
}

void loop() {
  // put your main code here, to run repeatedly:
  // 音センサからの情報取得
  a0_data = analogRead(a0_in_port);   // アナログデータ
  
  // シリアルモニタへ出力
  Serial.println( a0_data ); 
 
  // 1m秒待機
  delay(1);
}

では、マイコンボードに書き込んで実行してみます。

 シリアルプロッタ 画面
シリアルプロッタ 画面
実際の回路
実際の回路

シリアルモニタを開くと、0~1023の値が表示されています。
調整ができていれば、500程度の値でしょうか。
音を与えると、値が変化するのが分かります。
確認しづらいので、シリアルプロッタで確認します。
グラフ表示され、変化が分かりやすくなりました。

続いて、電圧値に変換して見てみます。
スケッチです。

// 音センサ(アナログ生値→電圧値表示)

// ポート指定用変数設定
int a0_in_port = A0;    // センサ デジタル情報入力

// 受信データ用変数設定
int a0_data;    // analogデータ用
// 電圧値変換用変数
float v_data;

void setup() {
  // put your setup code here, to run once:
  // シリアルモニタ通信速度設定
  Serial.begin(9600);  
}

void loop() {
  // put your main code here, to run repeatedly:
  // 音センサからの情報取得
  a0_data = analogRead(a0_in_port);   // アナログデータ

  // 受信データをシリアルモニタへ出力
  // 電圧表現に変換計算
  v_data = (float)a0_data / 1024.0f * 5.0f;

  // シリアルモニタへ出力
  //  Serial.println( a0_data ); 
  Serial.println( v_data );
    
  // 1m秒待機
  delay(1);
}

マイコンボードに書き込んで実行してみます。

シリアルプロッタ 画面
シリアルプロッタ 画面

2.5V程度のところの値が連続的に出力されています。
音を与えると、値が変化するのが分かります。
シリアルプロッタで確認しています。

デジタル出力も確認します。
スケッチです。

// 音センサ(デジタル値)

// ポート指定用変数設定
int d8_in_port = 8;     // センサ アナログ情報入力
int a0_in_port = A0;    // センサ デジタル情報入力

// 受信データ用変数設定
int d8_data;    // digitalデータ用
int a0_data;    // analogデータ用
// 電圧値変換用変数
float v_data;

void setup() {
  // put your setup code here, to run once:
  // シリアルモニタ通信速度設定
  Serial.begin(9600);  
  // ポート設定
  pinMode(d8_in_port, INPUT);     // センサ情報入力設定
}

void loop() {
  // put your main code here, to run repeatedly:
  // 音センサからの情報取得
  a0_data = analogRead(a0_in_port);   // アナログデータ
  d8_data = digitalRead(d8_in_port);  // デジタルデータ

  // 受信データをシリアルモニタへ出力
  // 電圧表現に変換計算
  v_data = (float)a0_data / 1024.0f * 5.0f;

  // シリアルモニタへ出力
  //  Serial.println( a0_data ); 
  //  Serial.println( v_data );
  Serial.println( d8_data ); 
    
  // 10m秒待機
  delay(10);
}

マイコンボードに書き込んで実行してみます。

シリアルモニタ画面
シリアルモニタ画面

シリアルモニタを開くと、無音時には 0 値が表示されています。
音を感知すると、1値が表示されます。

最後に、Soundセンサで音を感知したら、
LEDを点灯するスケッチを書いてみます。

回路は図の通りです。

回路図2
回路図2

スケッチです。

// 音センサモジュール利用のLED点灯

// ポート指定用変数設定
int d8_in_port = 8;     // センサ アナログ情報入力
int a0_in_port = A0;    // センサ デジタル情報入力
int d13_out_port = 13;  // LED点灯用出力

// 受信データ用変数設定
int d8_data;    // digitalデータ用
int a0_data;    // analogデータ用
// 電圧値変換用変数
float v_data;

void setup() {
  // put your setup code here, to run once:
  // シリアルモニタ通信速度設定
  Serial.begin(9600);  
  // ポート設定
  pinMode(d8_in_port, INPUT);     // センサ情報入力設定
  pinMode(d13_out_port, OUTPUT);  // LED用出力設定 
}

void loop() {
  // put your main code here, to run repeatedly:
  // 音センサからの情報取得
  a0_data = analogRead(a0_in_port);   // アナログデータ
  d8_data = digitalRead(d8_in_port);  // デジタルデータ

  // 受信デジタル情報によりLED動作決定
  if(d8_data == HIGH){
    digitalWrite(d13_out_port, HIGH);     // LED点灯
    delay( 500 );    // 500m秒待機
  } else {
    digitalWrite(d13_out_port, LOW);      // LED消灯
  }

  // 受信データをシリアルモニタへ出力
  // 電圧表現に変換計算
  v_data = (float)a0_data / 1024.0f * 5.0f;

  // シリアルモニタへ出力
  //  Serial.println( a0_data ); 
  Serial.println( v_data );
  //  Serial.println( d8_data ); 
    
  // 1m秒待機
  delay(1);
}

マイコンボードに書き込んで実行してみます。

実際の回路
実際の回路

音を与えると、LEDが点灯します。
LEDの点灯時間は0.5秒としています。
※この間、 delay() していますので、待機状態です。