Arduinoで遊ぼう - エレクトレット・コンデンサ・マイクでオーディオレベルメータを作る
Arduinoとエレクトレット・コンデンサ・マイクを使ってオーディオレベルメータを作ってみた。マイクで拾った音の大きさに応じて、LED8個を段階的に点灯させている。
エレクトレット・コンデンサ・マイク(以下ECM)は音の強弱により容量が変わる一種のコンデンサだ。ECMから音声信号を取り出すためには+極に電圧をかけ、その電圧をコンデンサを介して取り出す。音の強弱によりECMの容量が変化し、充放電することで電圧の変化となり、それが音声信号となる。
ECMの音声信号はとても小さく、そのままArduinoに入力してもノイズと区別がつかない。そんな時はOPアンプを使う。小さな信号を大きな信号に変えるOPアンプの使い方を紹介しよう。今回、OPアンプとして低電圧オーディオアンプ「LM386」を使った回路を紹介する。
回路図

OPアンプの出力をArduinoのアナログ端子0番に接続。OPアンプから出力される音声信号はArduinoの電源電圧の半分=約2.5Vを中心に±約2Vの範囲で値が変化する。analogRead()で読み取った値は100~900の間で変化する。
実体配線

ECMには極性があるので注意すること(+端子に印がついている事が多い)。
スケッチ
abs()を使ってanalogRead()で読み取った値の絶対値を求める。map()を使って50~380の絶対値を0~8段階のオーディオレベルにマッピングしている。
int levelLeds[] = {
2,3,4,5,6,7,8,9 };
void setup()
{
for(int i=0;i<8;i++){
pinMode(levelLeds[i],OUTPUT);
digitalWrite(levelLeds[i],LOW);
}
Serial.begin(9600);
}
int ecmPin = 0;
void loop()
{
static int lasEcmLevel = 0;
int input = analogRead(ecmPin);
Serial.print(input);
Serial.print(", ");
input = abs(input - 512);
Serial.println(input);
int ecmLevel = map(input, 50, 380, 0, 8);
// if(ecmLevel > lasEcmLevel)
// lasEcmLevel++;
// else if(ecmLevel < lasEcmLevel)
// lasEcmLevel--;
lasEcmLevel = ecmLevel;
int pos;
for(pos=0;pos<lasEcmLevel;pos++){
digitalWrite(levelLeds[pos],HIGH);
}
for(;pos<8;pos++){
digitalWrite(levelLeds[pos],LOW);
}
delay(5);
}
DIY Tengu on a breadboard
http://tinkerlog.com/2007/10/22/diy-tengu-on-a-breadboard/
実用・電子工作 - マイクアンプ基本形
http://www002.upp.so-net.ne.jp/jsrc/densi/micamp.html
スイッチサイエンス - エレクトレット・コンデンサ・マイク・モジュール
http://www.switch-science.com/products/detail.php?product_id=141