提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
提示:这里可以添加本文要记录的大概内容:
声音传感器用的最多的就是咪头,也叫驻极体话筒。使用MAX4466芯片连接咪头,可以提高采样精度。达到高精度的声音采样。
提示:以下是本篇文章正文内容,下面案例可供参考
一、MAX4466声音模块
模块供电2.4V -5.5V。输出OUT为模拟量。使用Arduino AD口采样数字量输出范围为0-1023 即。如果电源用的3.3V。即代表0V对应数字0,3.3V对应数字1023。
如果是采用ADC0832 AD采样芯片。这是8位AD。即数字采样对应为0-255。这里以Arduino为例说明。
接线:模块 VCC-----接Arduino 3.3V管脚。
模块GND------接Arduino GND管脚
模块OUT-------接Arduino A0管脚 模拟管脚
二、程序代码
//本例程里面,MAX4466的VCC接 3.3V
#define MIC_IN A0 //MAX4466 OUT管脚接A0口
int sampleWindow = 50; //50ms采样一次。频率20Hz
void setup()
{
Serial.begin(9600); //模拟采样不需要初始化管脚
}
void loop()
{
double soundSensed = sampleSoundPeak(); //采样得到数字采样值0-1023
double volts = (soundSensed * 3.3) / 1024; //转换成模拟电压,真实电压值
Serial.print(soundSensed); //串口显示出数字值
Serial.print(" "); //串口显示出电压值
Serial.println(volts);
}
//声音采样子函数
double sampleSoundPeak()
{
double startMillis = millis(); //记录采样开始的时间
int signalMax = 0;
int signalMin = 1024;
int sample;
while ( (millis() - startMillis) < sampleWindow ) //当时间小于50ms时继续采样
{
sample = analogRead(MIC_IN); //读取A0口的采样值
if (sample < 1024) //采集声音的最高值与最低值
{
if (sample > signalMax) //用这个语法采到一个周期50ms内最高的声音
{
signalMax = sample;
}
else if (sample < signalMin) //用这个误法采到一个周期50ms内最低的声音
{
signalMin = sample;
}
}
}
int peakDifference = signalMax - signalMin; //得到幅值,返回幅值
return peakDifference;
}
总结
提示:这里最难理解的是声音采样子函数里面的if 与else if这两句程序。新手可能比较难以理解。
这里再说明一下。方便新手学习。if满足之后,后面的else if就不执行了。有些新手可能有困惑就是在这个地方。明白这个就很好理解了。假如有一个声音,它的电压值是1.5V。换算成数字量是500左右,具体的值你们可以计算。这里只是举例,不需要太精确。
500这个值,大于signalMax=0这个值。所以signalMax被重新赋值成为500,这个时候,如果声音值,持续比500高的话。signalMax会一直被改写最高的值。
如果这个时候的声音值,低于这个signalMax的最高值后。再次执行 if (sample > signalMax) 这一句语句,不成立。直接跳过。就跑到了else if这一句里面。这个语句刚好相反,就是不停的记录最低声音值。一直到我们不发出任何声音后,采样的就是环境声音。这个时候,用最大值signalMax减去signalMin最小值。就得到非常完美真实的声音值。再换算出来就OK了。
这个算法写的非常好。是国外的一个程序员写的。
Written by Shani Mensing, edited by Audrey St. John
if (sample > signalMax) //用这个语法采到一个周期50ms内最高的声音
{
signalMax = sample; //
}
else if (sample < signalMin) //用这个误法采到一个周期50ms内最低的声音
{
signalMin = sample;
}