在Arduino上使用麦克风


18

编辑:我已经在这个问题上研究了一段时间。事实证明,这比我想象的要困难得多,对于初学者来说这不是什么。这需要昂贵的硬件(麦克风和放大器)以及微控制器上的一些复杂的音频分析。即使是带有放大电路的完整麦克风也无法提供理想的效果(根据该产品的评论)


我是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引脚短路?那可能是个问题。
康纳·沃尔夫

不,我只是没有正确绘制原理图。
敬酒

Answers:


14

“最简单”的方法就是简单地通过ADC施加信号和采样。将结果存储在缓冲区中,然后根据需要显示(在您的情况下,通过RS232发送到PC)
如果需要信号的RMS电平,则需要在发送到PC之前或之后的某个时间进行计算。

如图所示,您的放大电路不是理想的,但对于基本的VU表应该可以正常工作。编辑-我刚刚注意到C2,将其移开,因为它将阻塞来自晶体管的DC偏置,并且信号将摆动到地以下。

编辑-这是放大晶体管的更好电路:

驻极体放大器

不必太在乎所使用的晶体管,输出偏置应在2.5V左右。
输入分频器(R3和R4)的确切值不是太重要,而是1:4的比率更为重要。因此,您可以使用例如400k和100k,或40k和10k等(尽量不要高于或低于这些各自的值)。C2应该> 10uF。C1应该> 1uF(在原理图中替换C1),但
R1和R2确实需要为这些值。
您所需要的只是带有偏置电阻的驻极体(原理图中的R1)

需要关注的一点是Arduino 3.3V和5V线似乎绑在一起-我假设这是一个原理图错误,但是如果在实际电路中是这种情况,它将无法正常工作,并且可能会损坏某些器件。
要查明问题,将有助于查看您的代码以及在PC端看到的内容。您还使用什么晶体管?

如果您有示波器,则可以检查一下您的麦克风/晶体管是否正常工作。如果不是,则可以使用万用表执行其他一些基本测试(例如,确认存在+ 5V,确认晶体管的基极处于〜0.6V,测试集电极以确保其未固定至+ 5V或接地且没有信号)

另外,您还需要确保RS232正常工作,因此编写一些简单的代码来发送一些测试值将是一个好主意。

如果您可以提供所需的信息,并告诉我们您可以使用的工具,则可以提供更具体的帮助。

编辑-如果您采样速度太慢,则需要这样的峰值检测电路:

峰值检测

您可以将此电路放在晶体管和Arduino引脚之间(减去C2)

二极管几乎可以是任何二极管。电容值和电阻值只是一个准则,可以稍作更改。它们的值决定了电压随信号电平变化需要多长时间。您可以使用RC常数(即R * C-在上面的示例中,RC常数为1e-6 * 10e3 = 10ms)进行计算。电压大约需要2.3个时间常数才能下降到其原始值的90%,因此在上面的示例中,如果电压始于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电平,仅会测试AC(由于声卡输入中的DC屏蔽帽),而不会测试DC(音频)信号。

如果您尝试此操作,请发布屏幕截图,以便我们了解发生的情况。


3.3V和5V未捆绑在一起。这是我第一次使用此软件-抱歉。我将把我的代码放在问题中,但没有任何问题。另外,我今天做了一个使用光敏电阻并在六个LED上显示值的项目,就像我希望我的VU仪表看起来像,然后我测试了它的串行连接。我既没有示波器也没有万用表。晶体管的标题为“ S9012 H 331”,我的标题为“ S9014 C 331”和S9015。
敬酒

@Toast-参见有关C2的编辑,将其删除并直接连接。
奥利·格拉泽

我删除了C2并添加了零件,正如Kristoffon在他的回答中描述的那样。结果还是一样。
吐司

1
如果具有电位计或可变电压源,则可以将0-5V输入施加到ADC的输入以测试代码,而与输入电路无关。您试图同时调试两件事-使用示波器隔离电路并验证其行为,和/或隔离代码并提供可预测但可变的输入以验证代码。
HikeOnPast

1
@OliGlaser我对电路感到困惑。“驻极体”是麦克风吗?麦克风的另一根线(GND或VCC)在哪里?是否将5或3.3V连接到该电路?您能否以某种方式删除这些EDIT块并对其进行编辑,以便无需阅读注释即可理解它?我也是一个初学者,不了解如何解决问题以及是否可以使用您原样发布的电路。
托马什Zato -恢复莫妮卡

4

假设您的电路工作正常,音频信号在kHz范围内,而Arduino具有适用于DC电平的ADC。信号上的DC分量为零,也就是说,它在固定电压上浮动。ADC读取的是该固定电压。

为了解决这个问题,您需要在输出端串联一个二极管,该输出端连接到ADC以及电容器和电阻器。

当信号消失时,电容将充电至接收到的峰值,而电阻将使电容放电。

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

编辑:ADC输入实际上是浮动的,因为由于串联电容器而没有任何偏置。如果您要尝试我的解决方案,请删除C2。


好的,我将其添加到电路中,串行监视器上的信号现在是458(但是在有噪声的情况下仍然不会改变)。
敬酒

我将晶体管从“ S9012 H 331”更换为“ S9014 C 331”,其值为56。–
Toast

1
Arduino ADC能够足够快地采样音频。我不使用它们,但我认为使用库函数可以达到10ksps(高达5kHz的带宽),这对于lo-fi素材来说很好(我很确定,如果正常使用,实际的ATMega可以更快地采样)
Oli Glaser 2012年

@Toast-您的采样速度有多快?如果非常慢,则峰值检测器是个好主意。不过,您可以在软件中执行此操作。
奥利·格拉泽

2
@Kristoffon-并非没有Arduino,但我使用了类似的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

您在Arduino的ADC上对1022和1023的读数基本上是满量程的。假设您如图所示安装了一个无故障的串联电容器,则该电平不能来自您构建的麦克风电路,因为它只能耦合变化的电压(即AC)。

结果,我怀疑您正在读取ATMEGA本身内的泄漏电流-您可能会在其他(未连接的)模拟引脚上得到相同的结果。

尝试用一些高阻值电阻器(在10K和100K之间)制作一个非常“轻巧”的分压器,并使用它将模拟输入偏置到参考电压的一半(您也可以使用电位计,这为您提供了一些额外的测试能力)。那么您的无输入读数应在512附近。

一旦对ADC输入施加了适当的偏置,就可以开始尝试查看是否有偏差。您可能会对带宽进行一些欠采样,这意味着您将获得高频分量的混叠,但是如果您要做的只是估算整体音量,那应该不会有太大问题。


听起来不错,我想它已经超负荷了。OP曾经考虑过连接一个小型扬声器来调试该模拟线路的读数。当我制作一个Vu计时,我从耳机插孔接了线,基本上直接插入AnalogRead,然后将结果映射出来。
Hellonearthis
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.