質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

2回答

24383閲覧

電子回路 コンデンサマイクの値を取得したい Arduino アンプ実装の効果は?

kt.tk.co

総合スコア27

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

1クリップ

投稿2016/11/14 00:55

編集2016/11/17 23:58

■はじめに
電子回路をはじめたばかりで、目的を達成できず試行錯誤しております。
お力添え頂けますと幸いです。

■目的

  • マイクから息を検出する

コンデンサマイクから波形を取得し、息の有無を判定したいと考えています。

■現在、課題としてわからないのは次の3つです

  • 1.アンプ(増幅器)は不要であるか?
  • 2.信号の基準点はどのように指定するか
  • 3.強い振動の後に、コンデンサマイクの値がすぐに戻らない

それぞれ1つずつ詳細をお伝えします。

■今回実装した回路の回路図が以下になります
実装回路図

コンデンサマイクやアンプなどを参考にしたサイトでは、Arduinoのアナログピン0とコンデンサの間に増幅器がありました。
今回の回路では増幅器を取り除いた状態です。


  • 1.アンプ(増幅器)は不要であるか?

息によってマイクを大きく振動させるため、波形を見ると振幅が大きく変化します。
今のところ音声信号解析などを行う予定はなく、振幅の大きさ・頻度のみで息を判定しようと考えています。

そのため、アンプによる増幅をしてしまうと大きな振幅を判別できず、音と振動の区別が難しくなると考えています。
参考サイト通りにアンプ(オーディオアンプIC LM386N-1)を入れて20倍の増幅率で実装しましたが、息を吹きかけると0-5vの範囲の振幅では波形が収まらず、波形の上が5vまたは下が0vに達している箇所がありました。(「増幅率が大きすぎて”クリップする”」と呼ばれるようですね)

Arduinoでアナログ値を読み取れるようなので、その読み取った値をソフトウェアで増幅処理することもできるのかな?と考えています。
(増幅回路はアナログ値のまま増幅してくれることに意味があると思うので、読み取った後の値を増幅することは無駄かと思いますが。)

これらを踏まえて、アンプを入れずにArduinoのアナログ回路で読み込むことを選択しましたが、アンプを入れないことによる弊害などがあるようでしたらご指摘頂けますと幸いです。
(実装する際にケーブル長が60cmほどになるため、ノイズなどが乗りやすくなりそうなのが不安です)

また、全く増幅を行わないと0-5vの幅を使い切らないので、ある程度の増幅は行いたいとも考えています。
使用したアンプ(オーディオアンプIC LM386N-1)では最小で20倍の増幅率となっておりましたが、これ以下の増幅率で増幅させたい場合におすすめの電子部品がありましたらお教えいただけますと助かります。
(なるべく小型なものであると実装するのに助かります。)

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


  • 2.信号の基準点はどのように指定するか

アンプを使用した回路では、その通りの回路を組むことで出力値が2.5vを基準点として得られました。
ただし、アンプを取り除いた回路を考えているのですが、参考サイトの回路ではどこでそのような処理をしていたかわからず困っております。
コンデンサマイクに入る抵抗値を調整したところ、8kΩに設定することで2.5vほどになりましたが、電子部品を抜き差しして電流を通す度に基準点が2.5Vから0.05vほどずれてしまいます。
2.5Vを基準として波形を出力させ±0.1Vほどの変化があった場合に処理を行わせようと考えていましたが、0.05vは細かすぎて誤差と言える範囲となり防ぐことはできないのでしょうか?
また、防ぐことができないようであれば、増幅させることで基準点がズレる問題をカバーする必要があるとの認識で間違いないでしょうか。

また、今回実装した回路での抵抗器の抵抗値や、Arduinoへの出力にコンデンサを挟む意味を理解できていません。
その点についてもご解説いただけますと幸いです。

この質問で載せた波形(次の質問項目で添付)については、0が基準点になるようにソフトウェアで補正しました。
キャリブレーションとして、はじめに1秒ほどの波形の区間で平均値を取り、その後、実際に取得できた波形から平均値を引いた値によって描画をしています。


  • 3.強い振動の後に、コンデンサマイクの値がすぐに戻らない

息を吹きかけた際に、マイクの波形が変化することは確認しました。
しかし、弱く吹いた際にはすぐに波形は元に戻りますが、強く吹いた場合になかなか戻りません。(おおよそ2秒ほどかけてゆっくりと戻ります)

試したところ、
手元にある小型のコンデンサマイクではこの症状になり、中型のコンデンサマイクでは問題なく値が元に戻りました。(本当に使いたいのは小型のマイク"WM-61M相当品"です。)

小型のマイク
中型のマイク

"コンデンサ"マイクなので大きさによって静電容量がどうたらこうたらといった理由があるように想像していますが、理解が足りず何が原因か・どうすれば解決できるか がわかりません。
お教えいただけますと幸いです。

波形は以下になります

弱く吹きかけた場合
弱く吹きかけた場合

強く吹きかけた場合(おおよそ2秒ほどで0に戻ります)
強く吹きかけた場合


Arduinoのプログラム

c

1 2//SPI通信で必要な部分 3#include <SPI.h> 4 5//データを入れる配列を用意 6int MicData; 7 8int counter = 0; 9int hosei = 0; 10long sum = 0; 11 12//////////// 13//初期設定// 14//////////// 15 16void setup() 17{ 18 Serial.begin(9600); 19 Serial.println("\r\nStart"); 20 delay(100); 21} 22 23void loop() 24{ 25 MicData = analogRead(0); 26 27 //マイクの基準点を補正するために、キャリブレーションを行う 28 if (counter < 200){ 29 //はじめはなにもしない 30 31 //カウントアップする 32 counter ++; 33 }else if(counter < 300){ 34 //合計を計算していく 35 sum = sum + MicData; 36 37 //カウントアップする 38 counter ++; 39 40 }else if(counter == 300){ 41 //補正値を計算する 42 //合計値から平均を求める 43 hosei = 0 - sum / 100; 44 45 //カウントアップする 46 counter ++; 47 48 } 49 50 51 52 //500が基準となるように補正する 53 MicData = MicData + hosei; 54 55 56 Serial.println( (MicData)); 57}

変更点 2016.11.17

参考サイトの回路を試してみました。

イメージ説明

■増幅なし
(-の値が出てないだけで、実際は0が中心になっている!?)
(ただし、時間が経つと基準点が上がってしまい、20分ほどで120が基準点となっていました・・・)
コンデンサ→増幅なし

■オペアンプ LM386-N1 による200倍 (参考サイト通り)

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

■オペアンプ LM386-N1 による20倍
コンデンサを外して倍率を200→20倍に変更

イメージ説明

■現状
どうにも理解が進まず、どのような手順で進めていくかがわかっていない状態です。

参考サイト通りに回路を組むことで、
>>約2.5V(図の縦軸512)を中心とした
>>±約2Vの範囲で値が変化 (読み取った値は100~900の間で変化)
ということは検証できました。

また、この回路であれば
>>- 3.強い振動の後に、コンデンサマイクの値がすぐに戻らない
という問題もおきませんでした。(抵抗R1を2.2kΩにしただけでは解決しませんでした。)

●疑問点1 : この参考サイトの回路では、コンデンサC2の後に電源・抵抗を繋げていないようですが、オペアンプによって基準点(ニュートラル時の電圧)を引き上げているのでしょうか。

●疑問点2 : 私の用途としては
>>読み取った値は100~900の間で変化
ではなく、0~1024の間で変化させたいのですが、参考サイトの回路のどの部分でそういった処理を行っているのかが不明です。
また、なぜ参考サイトでは100~900と範囲を狭めているのでしょうか。なるべく広く取得したほうが、レベル分けを細かくできるかと思いますが・・・

●疑問点3 : 増幅率を200から20倍に変えることで、基準点が500だったものから500と少しまであがってしまうのですね。どこでそのような処理になっているかわかっておりません。

■これからの予定
LM386のオペアンプを使うと簡単に参考サイトの処理は実装できましたが、やはり増幅率(利得)が大きすぎて用途に合わないようです。
10倍ほどあれば十分だと思うのですが、1-10倍のレールtoレールのオペアンプなどは市販されていないのですかね。
(秋月電子のwebサイトを見ましたが、それらしいものが見当たりませんでした。また、あまりに種類が多すぎて適切なものを選択できる自身もありませんでした。)


本当に申し訳ないのですが、MasahikoHirata様にお教え頂いた手順を理解しきれませんでした。

整理してみましたので、補足頂けますと幸いです。

●増幅しない場合
①R1はマイクのデータシートにも書いてある通りRL2.2kΩで固定
②電源は5Vを仕様
③C2(-)に2.5ボルト電源から10KΩで接続
④???
イメージ説明

ためしに③まで試してみた(2.5Vを取れなかったので実際には3.3Vを接続の状態で実装)ところ、たしかにArduinoのA0で得られる値の基準点が上がりました。
しかし、接続した後に2.5Vを排除したところ、基準点は上がったままの状態でした。推測ではあるのですが、MIC1もC2もどちらもコンデンサだと思うので、GNDとしての0点を正しく設定できておらず基準点が定まっていないように思われます。参考サイト通りにアンプを接続した状態でC2(-)の値を測ると0を基準点としていましたが、そうでない状態でC2(-)の値を測ると基準点がずれてしまいました。

●増幅する場合
→おそらく3倍ほどに増幅できれば十分だと考えています。そもそもそのようなオペアンプなどはあるのでしょうか。


また、理解不足でわからない点についてまとめます。

>>ADCの電源範囲内に信号が収まるように回路を用意
→増幅率が私の目的にあったオペンプを用意する という意味でしょうか

>>貴殿のような形ではなく(波形を求める)恐らく、低速の処理で’音声’が入力された時の電圧の累積(コンデンサーマイク側)の電圧の低下(音が入ると電圧が低下して、接続コンデンサの反対側の電圧が上がる)これをADCで量子化(デジタル化)した値でLEDを点灯してますね。
→ArduinoのアナログピンではADCでデジタル化された値のみしか取得できないはずなので、私も最終的にはデジタル化された値をつかって処理をする予定です。これは低速の処理なのですかね?

>>従って、抵抗値はカタログデータ通りのRL2.2Kで、そして波形でなければADCの値を基にレベルを示せば希望している結果になるかと
→音声信号解析などを行う予定ではないので、基準点からの電圧の増減を取れれば目的が実現できると考えています。

>>(中間値は関係なく)無音状態を’ニュートラル’として考えた場合、これを最低値として考え、最大(最大の音)の値の間でデータが変動すれば目的が達せられるのでは?
→基準点を512に上げるのではなく、基準点を0のままでコンデンサ側の電圧上昇のみを取得したほうがよい という認識で間違いないでしょうか?


大変恐縮ですが、
コンデンサマイクの値を取得する回路で、
・基準点(ニュートラル時)が2.5V(512)になる。
・0~5V (0~1024)を取る。
・倍率が1~20倍ほどを変更できる。
といった回路のアイディアをお教えいただけますと幸いです。


変更点 2016.11.18

トランジスター(2SC1815)で増幅を行っているサイトを新たに参考にしました。
【きむ茶工房ガレージハウス】音センサー(マイク)でLEDを点灯させます

その結果、電圧の分圧をやっと理解しまして、次のようにすることで2.5V(512)の基準点を安定して取ることができました。

イメージ説明

イメージ説明

基準点を取れてから試して見たところ、やはり増幅せずに使うには信号が小さすぎるようです。
このままトランジスターで増幅を行ってみようと思います。
参考にしたサイトではトランジスターを二重に配置していましたが、一重でどの程度増幅されるか試してみることにします。

お教えいただいた流れとして
①増幅率を目的の値(0~5V の0~1024を取るよう)にする
②基準点を目的の値(2.5vの512)にする
ことで今回の目的を達成できそうです。

今回欲している増幅器があるかについては質問内容を増幅器だけにまとめて質問し直そうと思います。
ご回答いただきありがとうございました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

まず’1.アンプ(増幅器)は不要であるか?’については参照されたサイトでも書かれている通りで、ノイズに’音’が埋もれないためや、伝送の時の信号の劣化を抑えるのに’あったほうが良い’ですね。
’3.強い振動の後に、コンデンサマイクの値がすぐに戻らない’は、使用されたマイクの仕様をみるとRL=1KやRL=2.2Kと定格の値がありますが、実際は8Kで復帰に掛かる電流が不足しているためですね。マイクとArduinoの接続にコンデンサーを入れているのは直流成分が直接Arduinoに流れ込まないようにするためです。
最後に'2.信号の基準点はどのように指定するか'は逆方向で考えていくと分かりやすいのですが、ADCの電圧範囲内に信号が収まるように回路を用意。回路は無信号の時に5Vの半分の2.5Vにしたい。となるとOPAMPでその範囲に収まるように抵抗値を決定。その入力にはコンデンサーマイクを使用する。と考える。
ここまで決まればまずOPAMPは5Vの単電源で動くもので0~5Vの範囲でスイングするからレール to レールのもの。(出力がVcc、つまり電源範囲を超えることは無いからある意味Arduinoの保護回路)
それで回路と参照を見てみるとLM386の回路そのまま使えば簡単ですね。(回路図でPIN6にVs=Vcc=5V)を忘れないように。それと参照サイトの回路図にもRLは2.2Kになってますよ。
これからアンプの先の信号の電圧を確認すればADCからの値の処理が必然的に決まると思います。

投稿2016/11/14 02:19

MasahikoHirata

総合スコア3747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kt.tk.co

2016/11/14 03:39

ご回答頂きありがとうございます。 何度か目を通しましたがすぐには理解できない部分があるため、じっくりと時間をかけて読み直したいと思います。 後ほどお教えいただいた内容を私が理解できているかの確認や、調べてわからない部分がありましたら再度質問させていただきます。 お手数ではありますが再度ご教授いただけますと幸いです。 取り急ぎ確認・お礼のご連絡とさせていただきます。 ありがとうございます。
kt.tk.co

2016/11/14 05:46

>>’1.アンプ(増幅器)は不要であるか?’について 「ノイズに’音’が埋もれない」 「伝送の時の信号の劣化を抑える」 で“あったほうが良い”という程なのですね! 手元にある知識のみで判断していたためなにか大きな見落としがあるかと思っていたため、詳しい方からお教えいただけるととても助かります。 >>’3.強い振動の後に、コンデンサマイクの値がすぐに戻らない’ 「参考サイト通りに実装すること」を優先しすぎており、データシートを読むという意識が欠けておりました。また、マイクに繋がる抵抗R1によって信号の基準点を変更する方法が正しいと勘違いしておりました。ご指摘いただきました通り、最も使いたい(中型マイクよりも使いたい)小型マイクはVs:2.0V, RL2.2Vとなっておりました。今一度回路を組みなおして定格での動作を確認いたします。 何度も初歩的な質問で申し訳ないのですが、データシート(http://akizukidenshi.com/download/ds/spl/XCM6035-2022-354R.PDF)にあるVs(Standard operation voltage):2.0vと、Voltage range:1.1v ~ 10v の違いをお教えいただけないでしょうか。 今までコンデンサマイクのHowToサイトをいろいろと探してきましたが、どのサイトでも電源は5vを使用していたと記憶しております。 そのため、Vsで動作させる場合と、Voltage rangeで動作させる場合の違いが気になっております。お手数ですがお教えいただけますと幸いです。 >>マイクとArduinoの接続にコンデンサーを入れているのは直流成分が直接Arduinoに流れ込まないようにするためです。 何度かコンデンサーC2を入れた状態と、コンデンサーC2を除いた状態でマイクの波形を比較してみましたが、R1に8kΩの抵抗を入れていたからか出力値はコンデンサの有無に関係なく2.5vほどを基準点としたものが得られました。 8kΩを使用するのは明らかに間違えているということはご指摘いただいた通りですので、もう一度試してみます。おそらく理解が正しければ、コンデンサーC2を入れていれば直流成分が流れ込まず、マイクの波形が0を基準点として出力されているものと認識していますが間違いないでしょうか。 >>最後に'2.信号の基準点はどのように指定するか'は逆方向で考えていくと分かりやすいのですが、 申し訳ないのですが、まだここで説明いただいた部分を理解できていないため、後ほど読み直してご返信いたします。 引き続き、何卒よろしくお願いいたします。
MasahikoHirata

2016/11/14 05:58

’今までコンデンサマイクのHowToサイトをいろいろと探してきましたが、どのサイトでも電源は5vを使用していたと記憶’については、 元々のコンデンサーマイク(オーディオ用)は48Vで決して5Vは標準でない。しかし最近のデバイスはTTL電圧5VがUSBでも多用されているので5Vの記事が多い。
MasahikoHirata

2016/11/14 06:03

ozwkさんの回答にも’C2(-)に10kぐらいのオーダーの抵抗をかまして2.5Vに接続すれば、 入力がないとき2.5Vになります。 コンデンサは直流に対して抵抗率無限大とみなせます。 要するに無音のとき何もつながっていない状態と同等になるので、 抵抗を挟んで適当な電圧レベルに繋いでやれば、そこを基準にして振動します。’つまり無音状態の時に2.5Vになるように抵抗で釣る(プルアップ)とかOPAMPであれば電圧の加算・減算もできるので希望の範囲に直線的に信号が出力されるように設計。
MasahikoHirata

2016/11/14 13:23

仕事の手すき状態になったので、追記します。参考にされたサイトの再現もしてみました。貴殿のような形ではなく(波形を求める)恐らく、低速の処理で’音声’が入力された時の電圧の累積(コンデンサーマイク側)の電圧の低下(音が入ると電圧が低下して、接続コンデンサの反対側の電圧が上がる)これをADCで量子化(デジタル化)した値でLEDを点灯してますね。従って、抵抗値はカタログデータ通りのRL2.2Kで、そして波形でなければADCの値を基にレベルを示せば希望している結果になるかと(中間値は関係なく)無音状態を’ニュートラル’として考えた場合、これを最低値として考え、最大(最大の音)の値の間でデータが変動すれば目的が達せられるのでは?
kt.tk.co

2016/11/18 00:08

ご回答いただきありがとうございます。 回答を読ませて頂いておりましたが、なかなか理解できず、ご連絡が遅れて失礼しました。 何度も読み直すことで、2.5Vで基準点を取ることができました。 はじめの質問欄に画像や考えなどをまとめながら試行錯誤しておりました。 本質問でご回答頂いた内容について解決することができました。 貴重なお時間だけでなく、再現までしていただきありがとうございました。 わからないことばかりでとても時間が掛かってしまいましたが、アドバイス頂いたことで心が折れずに目的へ一歩進むことができました。 目的の増幅率(利得)の増幅器がみつからないため、あらためて増幅器に絞った質問を投稿させていただこうと思います。 オペアンプの非反転増幅回路を作ることで、「オペアンプのデータシートにある最小の増幅率20倍よりも小さな増幅ができるのでは?」と考えています。 それではお仕事の忙しい中、ご回答いただきありがとうございました。 またお時間がありましたらお力添え頂けますと幸いです。 それでは失礼致します。
guest

0

信号の基準点はどのように指定するか

C2(-)に10kぐらいのオーダーの抵抗をかまして2.5Vに接続すれば、
入力がないとき2.5Vになります。

コンデンサは直流に対して抵抗率無限大とみなせます。
要するに無音のとき何もつながっていない状態と同等になるので、
抵抗を挟んで適当な電圧レベルに繋いでやれば、そこを基準にして振動します。

LM386もデータシートを見ると、
内部で抵抗を挟んでGNDに繋いであって、
その後バイアスを掛けて2.5V基準にしてます。

投稿2016/11/14 02:06

ozwk

総合スコア13512

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kt.tk.co

2016/11/14 03:57

ご回答頂きありがとうございます。 C2の後に抵抗を入れて2.5Vにするのですね。 2.5Vの電源 → 10kΩの抵抗 → C2(-) の回路を付け足すというイメージで間違いないでしょうか。 下の参考サイトにある「R2」を2.5Vの電源から接続するというイメージですね? http://www.geocities.jp/zattouka/GarageHouse/micon/Arduino/ECM/ECM.htm (R2とVRの意味がわからなかったので、申し訳ないのですがR2とVRを使用している意味などをわかりましたらお教えいただけますと幸いです。) 一度、R1の抵抗を半固定抵抗で検証してみた際に、Arduinoで取得した信号の基準点が変化したのでR1によって調整するものだと思いこんでいました。 他に回答していただいたMasahikoHirata様の説明と合わせると、R1はコンデンサマイクの電源のためだけにあるという認識で間違いないでしょうか。 まだご回答いただいた内容を理解できていない部分があるため、再度ご回答いただいた内容を読ませていただきます。 取り急ぎ確認・お礼のご連絡とさせていただきます。 ありがとうございます。
ozwk

2016/11/14 04:08

> R2とVRの意味 電圧を作っています。 VR=0なら0Vで(短絡しているのでよろしくない) VR=20kなら 5*20k/(47k+20k) ~ 1.5 LTspiceなど回路シミュレータで遊んでみるといいですよ
kt.tk.co

2016/11/18 00:11

ご回答いただきありがとうございました。 試行錯誤の末、目的の2.5Vを基準に取ることができました。 まだ増幅について課題は残っていますが、ここで質問した内容について解決することができました。 お時間・お手数を掛けてお教え頂きありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問