ESP32 & Python学习——实验9 声音传感器模块的原理和使用
声音传感器使用
这次实验涉及到了声音传感器,除了基本的代码学习,我也查找和总结了声音传感器一些基本原理(章节最后),帮助对代码进行更好的理解。
1 代码
声音传感器使用代码:
'''
实验名称:声音传感器实验
接线说明:使用普中ESP32开发板。声音传感器模块AO口-->ESP32 IO 34;传感器VCC-->3.3V;传感器GND-->GND
实验现象:在Thonny软件的shell区能看见声音的数值。
完成时间:2025/07/26
代码修改:罗特布克
备注内容:这里涉及到一个标定值,就是调试传感器的电位器AD11,可以插个薄片旋转,在安静的环境下调到1左右即可。
拓展思考:
1、可以监测声音分贝;
2、或者作为声控开关的检测部分。
'''
from machine import Pin,ADC
from time import sleep
sound = 34
# 初始化GPIO口
def setup():
global sound_ADC
sound_ADC = ADC(Pin(sound)) # 使用ADC类(模数转换器)创建名称为sound_ADC的ADC对象,该对象使用IO口34作为ADC的输入。
sound_ADC.atten(ADC.ATTN_11DB) # 11dB 衰减, 检测输入电压约0-3.6v。这里输入电源3.3v,满足条件。
# A0adc为ADC上传来的值,A0min为没有声音时ADC传来的电压,最大电压为3.3V。
# A0min可以定为1.7V,大概在3.3V的中间。因为声音转换后有正负半周,类似于正弦信号,音量大小只和幅值有关。
def Vvalue(A0adc,A0min):
vv1=(3.3*A0adc/4095-A0min)/(3.3-A0min)*1000 # 这里比较输入音量对应的电压值和1.7V的差距,除以总量程,放大1000倍,100倍声音辨识变化有点小。
# 1.7V就对应声音为0,和它的差距越大(不论正负)说明音量越大。调节电位器,就是在校准音量为0时的电压值。
vv1=abs(round(vv1)) # 先用round进行四舍五入,再用abs进行绝对值。因为音频有正负,绝对值表示音量大小。
return vv1 # 返回音量值0-1000.电压3.3V对应音量1000.
# 循环函数
def loop():
count = 0 # 计数值
while True: # 无限循环
voiceValue=Vvalue(sound_ADC.read(),1.7) # 设置0V对应的电压为1.7V
if voiceValue: # 当声音值不为0
print ("Sound Value:", voiceValue) # 打印出声音值
if voiceValue > 100: # 如果声音传感器读取值大于100
print ("声音超出范围! ", count) # 打印出计数值
count += 1 # 计数值累加
sleep(0.2) # 延时 200ms
# 程序入口
if __name__ == '__main__':
setup() # 初始化GPIO口
loop() # 循环函数
2 实验图片

3 实验显示结果
在shell区可以看到显示的音量结果:

4 声音传感器模块原理分析
4.1 驻极体话筒原理
驻极体话筒只有两个引脚,如下图

其工作原理是什么样的呢?箭头左边的就是驻极体话筒,右边是加的外围电路。原理参考视频驻极体话筒工作原理#音频信号 #驻极体话筒 #场效应管 #放大器_哔哩哔哩_bilibili

驻极体话筒包含一个驻极体和一个场效应管。驻极体相当于一个电容,里边有永久电荷,不会丢失。震动膜受到声波产生震动,从而使驻极体两个极板间距离发生变化,从而导致电容变化,Q=CU,Q不变,C改变,那么电压U改变。从而导致场效应管的阻抗变化(驻极体电容的电压变化(由声波引起)会调制JFET的栅极电压,进而改变其沟道电阻),所以+处的电压也随之改变。(进一步理解可以找找场效应管的资料,这里我没有继续深究了)
可以理解为整个驻极体话筒就是一个可变电阻,电阻值随声音强度变化。
4.2 声音传感器模块
以下图是4引脚声音传感器模块电路原理图(可以参考书籍《单片机三剑客——ESP32单片机与Python语言编程》)

这里的MIC就是驻极体话筒。
1、AO引脚信号输出工作过程
如下红色的部分,就和4.1类似,不过多了一个滑动变阻器。

电压VCC经过RP11、R13、MIC、最后连接GND,把MIC看成电阻,就经过了三个电阻的分压。保持无声状态,A处电压就和滑动变阻器电阻有关,滑动变阻器阻值越小,A点电压越大。
我这里设置的安静的时候AO电压值1.7V:安静时MIC处有一定的电阻,调节电位器阻值,使得MIC+R13阻值等于RP11阻值,A处大概就是一半的VCC(1.7V),此时是通过Shell区对应的声音值接近0时(一般不会到达0,达到1左右就行)来判断的。
声音的变化会导致等效电阻值变化,会比原来的值大或者小(这里和声音信号的周期性有关),从而导致A点电压变化。A点电压有可能大于或者小于1.7V,A点电压和1.7V的差值就是声音的强度。反应在shell界面就是音量值。
Ok这大致就是声音传感器的原理了。如有什么理解上的偏差,也请各位不吝赐教。
更多推荐



所有评论(0)