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

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



Ads by Google

11 Comments

says..."管理人のみ閲覧できます"
このコメントは管理人のみ閲覧できます
2010.08.25 22:43 | | # [edit]
arms22 says..."Re: はじめまして"
電源はUSBのバスパワー5Vを使っています。
プログラムはPC上で作成し、マイコンの方にやっぱりUSB経由で書き込んでいます。

ボタン電池でも問題ないと思いますよ。
LEDを点灯させるには電池を直列にして電圧を稼ぐ必要がありそうです。

マイコンを使わずにおなじようなことをしたい場合、
次のLEDドライバなどが良さそうです。
入力電圧レベルの大きさを12ドットのLEDで表示するICです。
http://eleshop.jp/shop/g/g6C9131/
2010.08.25 23:04 | URL | #- [edit]
says..."管理人のみ閲覧できます"
このコメントは管理人のみ閲覧できます
2010.08.28 14:43 | | # [edit]
arms22 says..."Re: 先日はありがとうございました。"
電子工作系の書籍は買ったことがないので、
ちょっとわかりませんね。。

電子工作系のページは沢山ありますから、
googleで調べてみればすぐに見つかると思いますよ。

手当たり次第に全部読んでみるのもいいと思います。
自分が作りたいと思っていたものが、
すでに作られていることもよくあります。

私は関西の人間なので、関東のお店はよく分りませんが、
秋月電子や千石、マルツあたりでだいたいそろうのではないでしょうか。
2010.08.28 15:27 | URL | #- [edit]
says..."管理人のみ閲覧できます"
このコメントは管理人のみ閲覧できます
2012.07.14 14:02 | | # [edit]
arms22 says..."Re: はじめまして"
こんな感じかな?

int onoff = 0;
void loop()
{
int input = analogRead(ecmPin);
input = abs(input - 512);
if(input > 300){ // ここは調整すること
if(onoff == 1){
onoff = 0;
}else{
onoff = 1;
}
}
digitalWrite(ledPin, onoff);
}
2012.07.14 20:27 | URL | #- [edit]
says..."管理人のみ閲覧できます"
このコメントは管理人のみ閲覧できます
2012.10.25 09:18 | | # [edit]
arms22 says..."Re: 初めまして"
あと必要なものはオシロスコープとか安定化電源とかステーションタイプの半田ごてとかでしょうか;)
まぁとりあえずそんだけあれば十分だと思うよ。
必要な部品は回路図にぜんぶ書いてあるからそれを参照してください。
ArduinoはUNOでもduemilanoveでもMEGAでもOK。
あとはやる気と根性だな。
2012.10.30 21:39 | URL | #- [edit]
says..."オーディオレベルメータ"
この記事を参考にし同じものを作ろうとしているのですが、
うまく動いてくれません。

電子工作は初めてなので的はずれな質問なのかもしれないのですが、
回路図と実態配線でR1の抵抗の値が違うのですがどちらを参考にすれば良いのでしょうか?
2013.12.13 18:41 | URL | #- [edit]
says..."No title"
たぶん2.2kΩでいいとおもう。
MICの使い方調べてみて。
2013.12.13 21:29 | URL | #j7sy4omY [edit]
says..."No title"
素早い返答ありがとうございます。

MICについてはあまり知識がないので、
もう一度よく調べてみます。

よく調べもせずに質問してしまい申し訳ありません。
2013.12.14 01:47 | URL | #- [edit]

Leave a reply






管理者にだけ表示を許可する

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