使用带有 Arduino 的麦克风

电器工程 Arduino 声音的 麦克风
2022-01-17 00:15:22

编辑:我一直在调查这个问题很长一段时间。事实证明,这是一个比我想象的要困难得多的项目,而且不适合初学者。这需要昂贵的硬件(麦克风和放大器)和微控制器上的一些复杂的音频分析。即使是带有放大器电路的完整麦克风也无法提供所需的结果(根据对该产品的评论)


我对 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。

另外,我没有万用表或示波器。 我现在有一个万用表。

3个回答

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

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

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

驻极体放大器

这不应该太在意使用的晶体管,输出偏置应该在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 晶体管。S9014NPN 晶体管,所以你必须使用这个。

标有“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 阻塞电容),但您在这里感兴趣的是 AC(音频)信号。

如果您尝试这样做,请发布屏幕截图,以便我们了解正在发生的事情。

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

要解决这个问题,您可以将一个二极管与连接到 ADC 以及电容器和电阻器的输出串联。

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

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

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

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

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

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

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