音センサーを使う

Arduino

研究室に転がっていた音声センサモジュールを使ってみます。型番はおそらくMIC393-M2だと思われます。

回路図は右のようになります。

音声センサーには5Vの電源を供給します。

端子AOは音声に応じたセンサー出力がアナログ値で得られます。

端子DOは音声センサーに付属している半固定抵抗によって調整された値に応じてディジタル値が出力されます。

回路を組み立てた様子を左の写真に示します。

写真写りが悪くて申し訳ありません。LEDが2個とも点灯しています。

LED1は電源供給時に転倒します。LED2は音に反応した場合に点灯します。

いまは,電源を供給しただけなのでLED2は点灯しないはずです。そこで半固定抵抗の値を調整し,LED2が消灯する場所を探します。

私の場合,LED2を消灯するためにはかなり半固定抵抗を反時計回りに回さなければなりませんでした。(80回程度?)

LED2を消灯させたことを確認して,それではAO端子からアナログ出力されている値をシリアルモニターで確認します。

スケッチを以下に示します。

4行目:センサーのアナログ出力をArduinoのA0端子で受け取ります。
7行目:アナログデータを格納する変数です。
12行目:シリアルモニターの通信速度を設定します。
18行目:A0端子で読み取ったアナログ値をa0_dataに格納します。
21行目:その値をシリアルモニターに表示します。
24行目:1ms待機して18行目以降を繰返します。

シリアルモニターやシリアルプロッタで電圧波形の様子を確認してください。音に反応することがわかると思います。では,次にデジタル出力確認してみましょう。スケッチは下のようになります。

同じく,シリアルモニター・シリアルプロッタで確認してください。音声信号を検知すると値が1になります。では,最後に音声信号を検知したらLEDが光る回路を作成します。回路図およびスケッチは以下の通りです。完成したら,早速試してみましょう!

(後日談)このセンサーですが、感度調整が非常に難しいです。シリアルモニターで音を検知したときのアナログ出力とデジタル出力の値を見ていると、アナログ出力は少し変化して、デジタル出力は変化しない場合が多いです。そこで、アナログ出力を用いてLEDをON、OFFするプログラムを作りました。

// 音センサモジュール利用のLED点灯
 
// ポート指定用変数設定
int in_port = A0;    // センサ デジタル情報入力
int out_port = 13;  // LED点灯用出力
 
// 受信データ用変数設定
int a_data;    // analogデータ用
// 電圧値変換用変数
float v_data, v_data_old;
 
// LED点灯のため朗フラグ
int LEDon = 0;

// 音声認識の感度調整
float cv = 0.03;

void setup() {
  // シリアルモニタ通信速度設定
  Serial.begin(9600);  
  // ポート設定
  pinMode(out_port, OUTPUT);  // LED用出力設定 
  // システム起動直後のアナログ値
  a_data = analogRead(in_port);   // アナログデータ
  // 電圧表現に変換計算
  v_data_old = (float)a_data / 1024.0f * 5.0f;
}
 
void loop() {
  // put your main code here, to run repeatedly:
  // 音センサからの情報取得
  a_data = analogRead(in_port);   // アナログデータ
  // 電圧表現に変換計算
  v_data = (float)a_data / 1024.0f * 5.0f;
  // 受信アナログ情報によりLED動作決定
  if(fabs(v_data - v_data_old) >= cv) {  
    if(LEDon==0){
      digitalWrite(out_port, HIGH);     // LED点灯
      LEDon=1;
    }else{
      digitalWrite(out_port, LOW);     // LED消灯 
      LEDon=0 ;
    }
  }
 
  // 受信データをシリアルモニタへ出力
 
  // シリアルモニタへ出力
  Serial.print(a_data); 
  Serial.print("    ");
  Serial.println( v_data );
     
  // 待機
  delay(1);
}

ま、このプログラムでも、変数cvの値の設定が難しいのですが、センサー本体の調整よりはましです!

コメント

タイトルとURLをコピーしました