亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

带有 Arduino Nano 33 BLE 的声谱可视化器

组件和用品

Arduino Nano 33 BLE
× 1
驻极体麦克风放大器 Max9814
× 1
0.91 英寸 OLED I2C 显示屏,128 x 32 像素
× 1
电容 4.7 nF
取决于您的 RC 低通滤波器和您选择的截止频率
× 1
电容 470 µF
× 1
电阻 2K
取决于您的 RC 低通滤波器和您选择的截止频率
× 1

应用和在线服务

Arduino IDE

关于这个项目

简介

在小型 OLED 显示屏中查看条形图如何响应音乐和声音。图表左端的频率最低,右侧的频率最高。

施工

连接

  • 根据更适合您系统的灵敏度连接麦克风增益:VCC 麦克风增益 对于 40dB,低灵敏度,GND 麦克风增益 为 50dB,中等灵敏度或让麦克风浮动 GAIN 60dB,高灵敏度。
  • 连接模拟引脚 0 A0 到麦克风放大器OUT
  • 连接3.3V , , SDA (或模拟 4 A4 ) 和 SCL (模拟 5 A5 ) 到 I2C SSD1306
  • 在电源总线的 VCC 和 GND 之间连接一个 470 uF 的电容器

获得低频噪音?

噪音来自测量系统附近正在工作的任何电子设备。所有电子设备都以固定频率和交流电(AC)电压工作,频率为 50 Hz 或 60 Hz 是您所在国家/地区的电源线频率。您可以使用法拉第笼轻松消除噪音。把你的电路放在一个盒子里,然后把盒子接地。将电路接地。

Arduino Nano 33 BLE 的引脚排列

使用 arduino 核心 AnalogRead 和 Arduino Nano 33 BLE,我们每秒只能获得大约 35, 000 个样本,因此我们不能对 17.5 Khz 以上的频率使用 FFT,因为我们必须读取时钟并在繁忙的等待循环中进行几次比较将要谨慎并采取 8 kHz 的上限。所以我们可以使用一个简单的 RC 低通滤波器来避免超出该频率的烦人的解决方案。

R =180Ω C =0.1uF 截止频率 fc =8842 [Hz]

这里使用 2K Ohm 电阻器和 4.7 nF 电容器来实现截止频率 fc =17000[Hz]

最大采样率粗略计算

使用普通的ArduinoanalogRead()函数对音频采样太慢,所以我们来计算最大采样率。

我们将估计使用 arduino 核心 AnalogRead 和 Arduino Nano 33 BLE 可以获得多少样本。

让我们运行这个小程序来估算一下。

/*
* 用AnalogRead粗略计算最大采样率
*/

#define ANALOG_PIN A0

#define SAMPLES 1000000.0
int newTime;
int analogValue;
void setup() {

Serial.begin(9600);
Serial.println("Sampling. .. 请稍等。");
}

void loop() {
// 把你的主要代码放在这里,重复运行:
newTime =micros ();

// 100 万个样本
for (int i =0; i <(int)SAMPLES; i++){
analogValue =analogRead(ANALOG_PIN);
}
float elapsedTimePerSampleUs =(micros()- newTime) / SAMPLES;
Serial.print("每个样本的时间(我们):");
Serial.println(elapsedTimePerSampleUs);
Serial.print("最大采样频率(hz):");
Serial.println(pow(10,6) /elapsedTimePerSampleUs);
}

使用 arduino 核心 AnalogRead 和 Arduino Nano 33 BLE,我们每秒只能获得大约 35, 000 个样本。奈奎斯特定理的结果近似双倍速率要求将我们的频谱可视化器限制为低于 17 kHz 的频率。我们可以使用低通滤波器来跳过高于该限制的频率。

我们必须在繁忙的等待循环中读取时钟并进行几次比较,我们将谨慎行事,并采取 8 kHz 的上限。

// 采样
for (int i =0; i unsigned long newTime =micros();
int value =analogRead(ANALOG_PIN );
vReal[i] =value;
vImag[i] =0;
while (micros() <(newTime + sampling_period_us)) {
yield();
}
}

用户界面

屏幕分为 11 个频区,您可以用对数标度将频率分组,类似于人耳感知它们的方式。

人类可以检测大约 20 Hz 至 20 kHz 频率范围内的声音。 (人类婴儿实际上可以听到略高于 20 kHz 的频率,但随着他们的成熟会失去一些高频灵敏度;一般成年人的上限通常接近 15-17 kHz。)

将使用区域 3 至 13(11 个区域)作为我们的代表。

每个条形表示带间隔线的带内最大值和带实心矩形带带内的平均值。

使用分贝显示值,并以启发式方式获得预选参考。

它是如何工作的?

使用快速傅立叶变换或 FFT 将音频样本转换为频谱。

然后将频谱划分和分组为14个区域,只有11个区域以dB表示。

关于麦克风模块

驻极体麦克风

驻极体是一种准永久带电的电介质。它是通过加热陶瓷材料制成的,将其置于磁场中,然后使其在磁场中冷却。它是永磁体的静电等效物。在驻极体麦克风中,这种材料的一片用作电容器的电介质的一部分,其中麦克风的隔膜形成一个板。声压移动隔膜。板的运动根据声压改变电容。给定电介质的内置固定电荷,电容器两端的电压也会发生变化。驻极体电容器连接到内置 FET 放大器的输入端。驻极体麦克风体积小,灵敏度高,频响宽,成本普遍很低。

MAX9814 麦克风放大器

MAX9814 是一款麦克风放大器,具有自动增益控制 (AGC) 和低噪声麦克风偏置,并且有几个选项可以配置为突破口。

MAX9814 模块具有三种放大器设置(40dB、50dB、60dB)。默认为 60dB,但可以通过将 Gain 引脚跳接到 VCC 或接地来设置为 40dB 或 50dB。

内部低噪声麦克风偏置 1.25V,2Vpp。放大器的输出在 1.25V DC 偏置时最大约为 2Vpp,因此它可以轻松与任何高达 3.3V 输入的模数转换器一起使用。

攻击/释放比例也可以修改,从默认的1:4000到1:2000或1:500。

要直接连接到线路输入,您需要一个隔直电容/耦合电容来隔断直流分量。您可以使用 1uF 以上的串联阻塞电容器,这取决于您的系统,如果有疑问,请尝试从 33 uF 到 100uF。耦合电路允许交流信号从一个部分流到另一个部分,同时阻止直流分量。在音频电路中,这样做是为了防止直流分量使音频输出失真。耦合电容器的有效性取决于一系列广泛的频率相关参数,包括插入损耗、等效串联电阻和串联谐振频率。

电源:2.7V至5.5V

灵敏度

灵敏度 ,模拟输出电压或数字输出值与输入压力的比率,是任何麦克风的关键规格。在已知输入的情况下,将声学域中的单元映射到电域中的单元确定麦克风输出信号的幅度。

麦克风的灵敏度是其输出端对给定标准声学输入的电响应。麦克风灵敏度测量的标准参考输入信号是 94 dB 声压级 (SPL) 或 1 帕斯卡(Pa,压力测量值)的 1 kHz 正弦波。对于固定声学输入,具有较高灵敏度值的麦克风比具有较低灵敏度值的麦克风具有更高的电平输出。以分贝 (dB) 为单位的麦克风灵敏度通常为负数;因此,灵敏度越高,绝对值越小。

对于模拟麦克风,灵敏度通常以 dBV 为单位指定,即以 1.0 V rms 为参考的分贝。

参考电平和频率响应

麦克风的频率响应描述了它在整个频谱范围内的输出电平。高频和低频限制被描述为麦克风响应比 1 kHz 时的参考输出电平低 3 dB 的点。 1 kHz 的参考电平通常归一化为 0 dB。

0.91 英寸 OLED I2C 显示屏 128 x 32 像素

这是一个小显示器,只有大约 1" 对角线。它由 128x32 个独立的白色 OLED 像素组成,每个像素都由控制器芯片打开或关闭。不需要背光。这降低了运行 OLED 所需的功率。

我们在这里使用的模型只有四个引脚,并使用 I2C 通信协议与 Arduino 通信。此型号没有 RESET 引脚。您只需要连接到 Arduino Uno I2C 引脚:

  • Arduino Nano:SDA (A4); SCL (A5);

要控制 OLED 显示器,您需要 adafruit_SSD1306.h 和 adafruit_GFX.h 库。按照接下来的说明安装这些库。

我们正在使用 Adafruit 库。请记住,您可以从 Adafruit 购买一些东西来支持他们。

后续步骤

Arduino Nano 33 BLE 使用一个可以做得更好的模拟读取。下一版本我将使用针对 nrf52840 优化的 FFT 和模拟输入。

代码

  • 用于 Arduino Nano 33 BLE 的声谱可视化器
用于 Arduino Nano 33 BLE 的声谱可视化器Arduino
适用于 Arduino Nano 33 BLE 的声谱可视化器
使用 arduinoFFT https://github.com/kosme/arduinoFFT
使用 Adafruit_GFX https://github.com/adafruit/Adafruit-GFX-Library
使用 Adafruit_SSD1306 https://github.com/adafruit/Adafruit_SSD1306
/* Sound Spectrum Visualizer for Arduino Nano 33 BLE 基于 Arduino 的声音可视化器@author Enrique Albertos 硬件要求: - Arduino 或 Arduino 兼容板。 - ssd1306 oled I2C 128x32 显示器 - 带有 max9814 的驻极体麦克风放大器 - 可选:便携式电池(通过 USB 供电) 软件要求: - arduinoFFT https://github.com/kosme/arduinoFFT - Adafruit_GFX https://github.com /adafruit/Adafruit-GFX-Library - Adafruit_SSD1306 https://github.com/adafruit/Adafruit_SSD1306 连接: - 麦克风增益:* VCC 到麦克风增益为 40dB * GND 到麦克风增益为 50dB * 浮动麦克风增益为 60dB - 模拟引脚0 到麦克风放大器输出 - +3.3V、GND、SDA(或模拟 4)和 SCL(模拟 5)到 I2C SSD1306 @uses arduinoFFT https://github.com/kosme/arduinoFFT @uses Adafruit_GFX https://github。 com/adafruit/Adafruit-GFX-Library @uses Adafruit_SSD1306 https://github.com/adafruit/Adafruit_SSD1306 该程序是免费软件:您可以根据发布的 GNU 通用公共许可证的条款重新分发和/或修改它自由软件基金会,许可证的第 3 版,或(由您选择)任何更高版本。分发此程序是希望它有用,但不作任何保证;甚至没有对适销性或针对特定目的的适用性的暗示保证。有关更多详细信息,请参阅 GNU 通用公共许可证。*/#include "arduinoFFT.h"#include #include #define SAMPLES 1024 // 2 的幂#define SAMPLING_FREQ 24000 // 12 kHz Fmax =sampleF /2 #define AMPLITUDE 100 // 灵敏度#define FREQUENCY_BANDS 14#define SCREEN_WIDTH 128 // OLED 显示宽度,以像素为单位#define SCREEN_HEIGHT 32 // OLED 显示高度,以像素为单位#define BARWIDTH 11#define BARS 11#define ANALOG_PIN A0// 连接到 I2C 的 SSD1306 显示器的声明(SDA、SCL 引脚)#define OLED_RESET -1 // 重置引脚 #(或 -1 如果共享 Arduino 重置引脚)Adafruit_SSD1306 显示器(SCREEN_WIDTH、SCREEN_HEIGHT、&Wire、OLED_RESET); double vImag[SAMPLES];double vReal[SAMPLES];unsigned long sampling_period_us;arduinoFFT fft =arduinoFFT(vReal, vImag, SAMPLES, SAMPLING_FREQ);// 调整参考以去除背景噪声噪声浮动参考 =log10(50.0);double coutoffFrequencies[ FREQUENCY_BANDS];void setup() { // SSD1306_SWITCHCAPVCC =生成显示 v内部来自 3.3V 的电压 if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 地址 0x3C for 128x32 for (;;); // 不要继续,永远循环 } // 设置显示 display.clearDisplay();显示。显示(); display.setRotation(0); display.invertDisplay(false); sample_period_us =(1.0 / SAMPLING_FREQ ) * pow(10.0, 6); // 计算截止频率,建立对数尺度 basePOt double basePot =pow(SAMPLING_FREQ / 2.0, 1.0 / FREQUENCY_BANDS); coutoffFrequencies[0] =basePot; for (int i =1; i  max[index] ) { max[index] =vReal[i]; } if (hz> coutoffFrequencies[index]) {中值[index] =sum / count;总和 =0.0;计数 =0;指数++;最大值[索引] =0;中位数[索引] =0; } hz +=hzPerSample; } // 计算每个频段的中位数和最大值 if ( sum> 0.0) { medium[index] =sum / count;如果(中值 [索引]> maxinband){ maxinband =中值 [索引]; } } int bar =0; for (int i =FREQUENCY_BANDS - 1; i>=3; i--) { int newHeight =0; int newMax =0; // 计算实际分贝 if (median[i]> 0 &&max[i]> 0 ) { newHeight =20.0 * (log10(median[i] ) - reference); newMax =20.0 * (log10(max[i]) - 参考); } // 调整最小和最大级别 if (newHeight <0 || newMax <0) { newHeight =1;新最大 =1; } if (newHeight>=SCREEN_HEIGHT - 2) { newHeight =SCREEN_HEIGHT - 3; } if (newMax>=SCREEN_HEIGHT - 2) { newMax =SCREEN_HEIGHT - 3; } int barX =bar * BARWIDTH + 5; // 移除旧层中值 if (oldHeight[i]> newHeight) { display.fillRect(barX, newHeight + 1, 7, oldHeight[i], SSD1306_BLACK); } // 删除旧的最大级别 if ( oldMax[i]> newHeight) { for (int j =oldMax[i]; j> newHeight; j -=2) { display.drawFastHLine(barX , j, 7, SSD1306_BLACK); } } // 绘制新的最大级别 for (int j =newMax; j> newHeight; j -=2) { display.drawFastHLine(barX , j, 7, SSD1306_WHITE); } // 绘制新级别中值 display.fillRect(barX , 1, 7, newHeight, SSD1306_WHITE); oldMax[i] =newMax; oldHeight[i] =newHeight;酒吧++; } display.drawFastHLine(0 , SCREEN_HEIGHT - 1, SCREEN_WIDTH, SSD1306_WHITE); display.display();}

示意图

soundspectrumvisualizer_qLzRsVPVlc.fzz

制造工艺

  1. Arduino Pong Game - OLED 显示器
  2. 使用 K30 传感器监测二氧化碳
  3. 聋盲通信与 1Sheeld/Arduino
  4. 使用 Arduino 控制硬币接收器
  5. Arduino 带蓝牙控制 LED!
  6. Arduino Nano:使用操纵杆控制 2 个步进电机
  7. 用声音发送数据
  8. 带有 Arduino Nano 的手持盖革计数器
  9. 使用 Arduino 测量太阳辐射
  10. 用 Arduino Nano 制作吃饭机器人 |金螺丝
  11. 带有实时时钟的 Arduino OLED 温度显示
  12. 带 OLED 显示屏的可编程袖珍电源