Arduinoでマイクを使用する


18

編集:私はかなり以前からこの問題を調査してきました。それは私が思ったよりもはるかに難しいプロジェクトであり、初心者向けではないことが判明しました。これには、高価なハードウェア(マイクとアンプ)と、マイクロコントローラーでの高度なオーディオ分析が必要です。amplyfier回路を備えた完全なマイクでさえ、(この製品に関するコメントによると)望ましい結果を提供しません


私はArduinoを初めて使用します(ただし、プログラミングには精通しています)。構築されたために、VUメーター、私はArduinoのアナログの0端子にマイクを入れて、シリアル接続を介して値を表示したいです。

私はグーグルでこの回路を見つけました:

シンプルなオーディオプリアンプ

...そして、私はこの結果でそれを構築しようとしました:

(私は現在、Oli Glaserの回答で提案された回路を使用しています)

シリアルモニターの値は、音楽の音量によって変わりません。

Arduinoのアナログ入力の音量を測定する最も簡単な方法は何ですか?

また、TDA2822Mを持っていますが、このプロジェクトに役立つかどうかはわかりません。マイクのキャプションにはXF-18Dと表示されます。

編集:私のarduinoコード:

void setup() {
  Serial.begin(9600); 
}

void loop() {
  Serial.println(analogRead(0));
  delay(300);
}

シリアル出力:1023 1022 1022 1022 1022 1023 1022など

マイクが機能するかどうかを確認するにはどうすればよいですか?指向性ですか?

編集:私は現在、S9014トランジスタを使用しています。ADCとシリアル接続は機能します(ポテンショメータでテストしました)。

シリアル出力は現在57前後です。

また、マルチメーターやオシロスコープも持っていません。 私は今マルチメーターを持っています。


回路の出力にオーディオ波形が見えることをスコープで検証しましたか?
HikeOnPast

回路図で3V3と5Vのピンが短絡しているのはなぜですか?それが問題になる可能性があります。
コナーウルフ

いいえ、回路図を適切に描画しませんでした。
トースト

回答:


14

「最も簡単な」方法は、ADCで信号とサンプルを適用することです。結果をバッファに保存し、必要に応じて表示します(あなたの場合、RS232経由でPCに送信します)

示されている増幅回路は理想的ではありませんが、基本的なVUメーターに対しては合理的に機能するはずです。編集-C2に気づいたばかりですが、トランジスタからのDCバイアスをブロックし、信号がグランドより下に振れるため、これを削除します。

編集-ここに増幅トランジスタのためのより良い回路があります:

エレクトレットアンプ

これは、使用されるトランジスタについてあまり気にする必要はありません。出力バイアスは約2.5Vでなければなりません。
入力分周器(R3およびR4)の正確な値はそれほど重要ではありません。1:4の比率がより重要です。したがって、たとえば400kと100k、または40kと10kなどを使用できます(これらのそれぞれの値を上回ったり下回ったりしないでください)。C2は> 10uFでなければなりません。C1は> 1uFである必要があります(回路図のC1を置き換えます)
R1とR2はこれらの値である必要があります。
必要なのは、バイアス抵抗付きエレクトレット(回路図のR1)

懸念事項の1つは、Arduino 3.3Vと5Vのラインが互いに結びついているように見えることです-これは回路図エラーであると想定していますが、実際の回路の場合は機能せず、何かを損傷する可能性があります。
問題を特定するには、コードとPC側で見ているものを確認すると役立ちます。また、どのトランジスタを使用していますか?

オシロスコープを使用している場合は、マイク/トランジスタが正常に機能しているかどうかを確認できます。そうでない場合は、マルチメーターを使用して、さらに基本的なテストを実行できます(たとえば、+ 5Vが存在することを確認し、トランジスタのベースが〜0.6Vであることを確認し、信号が存在しない状態で+ 5Vまたはグランドに固定されていないことを確認します)

また、RS232が正しく動作していることを確認する必要があります。そのため、いくつかの簡単なコードを書いていくつかのテスト値を送信することをお勧めします。

リクエストされた情報を提供できれば、利用可能なツールについてより具体的なヘルプを提供できることをお知らせください。

編集-サンプリングが非常に遅い場合は、次のようなピーク検出回路が必要になります。

ピーク検出

この回路をトランジスタとArduinoピンの間に配置します(マイナスC2)

ダイオードは、ほぼすべてのダイオードにすることができます。キャップと抵抗の値は単なるガイドラインであり、少し変更できます。それらの値は、信号レベルで電圧が変化するのにかかる時間を示します。これは、RC定数を使用して計算できます(つまり、R * C-上記の例では、RC定数は1e-6 * 10e3 = 10msです。電圧は、元の値の90%低下するのに約2.3時定数かかります。上記の例では、電圧が1Vで始まり、信号を除去すると、23ms前後で0.1Vに低下します。

編集 -さて、私は大きな問題を見つけたと思います。あなたのS9012のトランジスタは、PNPトランジスタ(S9015のように)、あなたはこの回路にNPNトランジスタを必要としています。S9014は、 NPNトランジスタであるので、あなたは、このいずれかを使用する必要があります。

「104」とマークされたコンデンサは、ほぼ確実に0.1uFセラミックコンデンサです。値(pF単位)は、最初の2つの数値の後に、最後の数値で設定されたゼロの数が続きます。したがって、104の場合、値は10 + 4ゼロ、つまり100,000pFです。100,000pFは100nFまたは0.1uFです。

編集-スコープまたはマルチメーターがないと、ここでの生活は非常に難しくなります(できるだけ早く片方または両方を手に入れる必要があります)
しかし、エレクトレット/トランジスタ回路をテストするために使用できるいくつかの基本的なPCサウンドカードオシロスコープがあります。Visual Analyzerは非常に良い例です。

ビジュアルアナライザー

C2を交換する場合(厳密には必要ではありませんが、良い考えです)、信号を直接PCに送り、ソフトウェアで観察して、マイクと増幅が正しく機能しているかどうかを確認する必要があります。お使いのPCにラインが使用されている場合、マイク入力は通常2VまでのIIRCに適しています。エレクトレットを直接テストすることもできます-トランジスタビットを削除し、R1とC1を保持するだけで、C1の反対側から信号を取得します。
この方法は、することに注意してくださいません DCレベルをテストし、唯一の(souncard入力でDCブロッキングキャップによる)ACが、AC(オーディオ)信号は、あなたがここに興味を持っているものです。

これを試す場合は、スクリーンショットを投稿して、何が起きているのかを把握してください。


3.3Vと5Vは互いに接続されていません。このソフトウェアを使用するのは初めてです-ごめんなさい。コードを質問に入れますが、問題が発生する可能性はありません。また、今日、フォトレジスタを使用して、vuメーターを次のように表示するように6つのledに値を表示するプロジェクトを作成し、そのシリアル接続をテストしました。オシロスコープもマルチメーターも持っていません。トランジスタには「S9012 H 331」というキャプションがあり、「S9014 C 331」とS9015のものもあります。
トースト

@Toast-C2に関する編集を参照して、これを削除して直接接続します。
オリグレイザー

Cristoffonが答えで説明したように、C2を削除して部品を追加しました。それでも同じ結果。
トースト

1
ポテンショメータまたは可変電圧源がある場合は、入力回路に関係なく、0〜5Vの入力をADCの入力に印加してコードをテストできます。一度に2つのことをデバッグしようとしています-回路を分離し、オシロスコープを使用してその動作を検証するか、コードを分離して、コードを検証する予測可能な変数入力を提供します。
HikeOnPast

1
@OliGlaser回路に混乱しています。「エレクトレット」はマイクですか?マイクのもう一方のワイヤ、GNDまたはVCCはどこに行きますか?5または3.3Vをその回路に接続しますか?EDITコメントスレッドを読まずにブロックを理解できるように、何らかの方法でブロックを削除して編集してください。私は初心者でもあり、問題がどのように解決されたか、またあなたが投稿した回路をそのまま使用できるかどうかわかりません。
トマーシュザト-復帰モニカ

4

回路が動作していると仮定すると、ArduinoにはDCレベルに適したADCがありますが、オーディオ信号はkHz範囲にあります。信号のDC成分はゼロです。つまり、一定の電圧で浮動します。ADCが読み取っているのはその固定電圧です。

これを修正するには、ADCとコンデンサおよび抵抗器に接続する出力と直列にダイオードを配置します。

キャップは受信中のピーク値まで充電され、信号が停止すると抵抗がキャップを放電します。

--|>|---*---- adc
        *---- resistor -----*----ground
        \----- capacitor ---/

編集:ADC入力は、直列コンデンサによるバイアスがないため、実際にはフローティングです。私の解決策を試す場合は、C2を削除してください。


さて、これを回路に追加すると、シリアルモニターの信号は458になります(ただし、ノイズがある場合でも変わりません)。
トースト

トランジスタを「S9012 H 331」から「S9014 C 331」に交換しました。値は56です。–
トースト

1
Arduino ADCは、オーディオに十分な速度でサンプリングできます。私はそれらを使用していないが、私は(これまで5kHzの帯域幅に)10kspsはローファイのもののための罰金であるライブラリ関数、(通常使用している場合、私はかなり確信して、実際のATMEGAが速くサンプリングすることができますよ)で可能だと思います
オリグレイザー

@Toast-サンプリング速度はどれくらいですか?非常に遅い場合は、ピーク検出器を使用することをお勧めします。ただし、ソフトウェアでこれを行うことができます。
オリグレイザー

2
@Kristoffon-Arduino noではありませんが、オーディオのサンプリングと再生に何度も似たような8ビットのマイクロ(PIC16F、18Fなど)を使用しました。10kspsは簡単に実行できます。このAVR ADCドキュメントを引用するには:When using single-ended mode, the ADC bandwidth is limited by the ADC clock speed. Since one conversion takes 13 ADC clock cycles, a maximum ADC clock of 1 MHz means approximately 77k samples per second. This limits the bandwidth in single-ended mode to 38.5 kHz, according to the Nyquist sampling theorem.
Oli Glaser

4

1022、1023の測定値は、基本的にArduinoのADCでフルスケールです。図に示すように故障のない直列コンデンサを取り付けたと仮定すると、このレベルは、変化する電圧(つまりAC)のみを結合できるため、構築したマイク回路から来ることはできません。

その結果、ATMEGA自体のリーク電流を読み取っているのではないかと思われます。おそらく、他の(接続されていない)アナログピンでも同じ結果が得られるでしょう。

いくつかの大きな値の抵抗(10K〜100K)で非常に「軽量」な分圧器を作成してみて、これを使用してアナログ入力を基準電圧の半分にバイアスします。その後、入力なしの読み取り値は512付近になります。

ADC入力に適切にバイアスをかけたら、それを介して変動があるかどうかを確認しようと作業を開始できます。帯域幅の一部をアンダーサンプリングしている可能性があります。これは、高周波成分のエイリアシングを取得することを意味しますが、やろうとしているのが全体のボリュームを見積もるだけであれば、それほど問題にはなりません。


それは正しいように聞こえます、私はそれが過負荷だと思います。OPは、小さなスピーカーを接続して、そのアナログラインをデバッグすることを考えていますか?VUメーターを作成したとき、ヘッドフォンジャックからラインを取り、基本的にはAnalogReadに直接接続し、結果をマッピングしました。
Hellonearthis
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.