なんでも作っちゃう、かも。

Arduino/Make/フィジカルコンピューティング/電子工作あたりで活動しています。スタバの空きカップを使ったスタバカップアンプなど製作。最近はもっぱらArduinoと3Dプリンタの自作に興味があります。

Arduinoで遊ぼう - エレクトレット・コンデンサ・マイクでオーディオレベルメータを作る

Posted by arms22 on 2009年12月27日 11  2



Arduinoとエレクトレット・コンデンサ・マイクを使ってオーディオレベルメータを作ってみた。マイクで拾った音の大きさに応じて、LED8個を段階的に点灯させている。

エレクトレット・コンデンサ・マイク(以下ECM)は音の強弱により容量が変わる一種のコンデンサだ。ECMから音声信号を取り出すためには+極に電圧をかけ、その電圧をコンデンサを介して取り出す。音の強弱によりECMの容量が変化し、充放電することで電圧の変化となり、それが音声信号となる。

ECMの音声信号はとても小さく、そのままArduinoに入力してもノイズと区別がつかない。そんな時はOPアンプを使う。小さな信号を大きな信号に変えるOPアンプの使い方を紹介しよう。今回、OPアンプとして低電圧オーディオアンプ「LM386」を使った回路を紹介する。

回路図



エレクトレット・コンデンサ・マイク 回路図

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

実体配線


emc_lm386_arduino_brd.png
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



該当の記事は見つかりませんでした。