■はじめに
電子回路をはじめたばかりで、目的を達成できず試行錯誤しております。
お力添え頂けますと幸いです。
■目的
- マイクから息を検出する
コンデンサマイクから波形を取得し、息の有無を判定したいと考えています。
■現在、課題としてわからないのは次の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相当品"です。)
"コンデンサ"マイクなので大きさによって静電容量がどうたらこうたらといった理由があるように想像していますが、理解が足りず何が原因か・どうすれば解決できるか がわかりません。
お教えいただけますと幸いです。
波形は以下になります
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)にする
ことで今回の目的を達成できそうです。
今回欲している増幅器があるかについては質問内容を増幅器だけにまとめて質問し直そうと思います。
ご回答いただきありがとうございました。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/14 03:39
2016/11/14 05:46
2016/11/14 05:56
2016/11/14 05:58
2016/11/14 06:03
2016/11/14 13:23
2016/11/18 00:08