音(サウンド)センサモジュールを使ってみる(Arduino)
今回は、Sound (音)センサモジュールです。
私のセンサモジュールです。
・音声センサーモジュール [MIC393-M2]
aitendo
https://www.aitendo.com/product/14874
¥295-
※私のものは、大陸調達品で、¥50-前後で入手できます。
Soundセンサモジュールは、
モジュールのマイクで音情報を取得するものです。
このセンサモジュールには、
アナログ出力とデジタル出力の端子があり、
アナログ出力では、マイクの信号をそのまま取得でき、
デジタル出力では、可変抵抗で設定された値により、
HIGH(1)、LOW(0) を出力するものです。
※Soundセンサモジュールには、
アナログ出力のみ、デジタル出力のみのものもあります。
では、Arduino に接続して使ってみます。
アナログ出力とデジタル出力の情報を、
シリアルモニタで確認してみます。
回路は図の通りです。
この回路図の作図には fritzing を利用させて頂いております。
https://fritzing.org/home/
この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を点灯するスケッチを書いてみます。
回路は図の通りです。
スケッチです。
// 音センサモジュール利用の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() していますので、待機状態です。