在决定使用INMP441作为麦克风的时候,我们对麦克风的相关知识并不是很了解,所以过程中出了很多问题。出现问题,那就针对debug的结果和自己的猜想一个个去查,去实验,最后终于解决了问题,不过这个过程真的蛮令人抓狂的。本项目的代码都有参考网上的代码,参考列表会给出。本项目是基于Arduino平台开发的,因为简单,但是Arduino调试比较麻烦。在做的过程中,我学会了查阅官方文档,esp32的和INMP441的。
INMP441的连接
INMP441麦克风有6个引脚,长这样:
INMP441是芯片,麦克风是基于这个芯片的。
和网上PCM编码的图片对比之后,发现应该是PCM编码的麦克风。
这是一个数字麦克风,这很重要。数字麦克风本身包含ADC,它传递进来的是数字量,如果要播放,或者是上传到语音识别API中,必须要经过一次DAC。将输入的数字信号转换成电压模拟信号输出。
官方文档里对其引脚有详尽的描述:
再结合esp32-wrover板子的技术规格文档里的引脚信息,本次项目我们给出的连接方案是
INMP441ESP32SCK2WS15SD13L/R无连接GNDGND (对所有元件都是一样的)VDD3V3
; INMP441录音
当你购买它时,商家会有几个样例代码。注:
[En]
The merchant will have several sample codes when you buy it. Note:
- INMP441不需要额外的库,只需要esp32本身的
- I2S的初始化可以参考esp32官方API指南,不再赘述。
在串口绘图仪中打印记录波形代码如下:[En]
Print the recording waveform code in the serial port plotter as follows:
#includeconst i2s_port_t I2S_PORT = I2S_NUM_0;void setup() { Serial.begin(115200); Serial.println("Configuring I2S..."); esp_err_t err; const i2s_config_t i2s_config = { .mode = i2s_mode_t(I2S_MODE_MASTER | I2S_MODE_RX), .sample_rate = 16000,.bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,.channel_format = I2S_CHANNEL_FMT_ONLY_LEFT, .communication_format = i2s_comm_format_t(I2S_COMM_FORMAT_I2S| I2S_COMM_FORMAT_I2S_MSB), .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1, .dma_buf_count = 4, .dma_buf_len = 8 }; const i2s_pin_config_t pin_config = { .bck_io_num = 2, .ws_io_num = 15, .data_out_num = -1, .data_in_num = 13 }; err = i2s_driver_install(I2S_PORT, &i2s_config, 0, NULL); if (err != ESP_OK) { Serial.printf("Failed installing driver: %d\n", err); while (true); } err = i2s_set_pin(I2S_PORT, &pin_config); if (err != ESP_OK) { Serial.printf("Failed setting pin: %d\n", err); while (true); } Serial.println("I2S driver installed.");}void loop() { int32_t sample = 0; int bytes_read = i2s_pop_sample(I2S_PORT, (char *)&sample, portMAX_DELAY); if (bytes_read > 0) { Serial.println(sample); } delay(100);}
运行结果:
串口打印的是采样的每一个样本,设置为32bit位深时,一个样本应该是4byte。
遇到的问题:
- 录音一直显示0…我起初以为是焊接的时候把麦克风焊坏了,所以又买了两个新的。。。。结果还是不行。。。几近崩溃。仔细观察自己的麦克风,我有了一个猜想:是不是因为焊的时候焊锡接触了外围的金属圈,然后我重新焊了一次,然后,就可以录音啦!!!!!
然而,有几个限制,我不知道为什么,可能是组件工艺问题:[En]
However, there are several limitations, I do not know why, may be component process problems:
(1)只能在24bit和32bit深度的时候工作(采样率是16khz,为了后续进行语音识别)
(2) 单通道,左通道(参考上图引脚描述),这个并没有出现右通道才能工作的问题。
Original: https://blog.csdn.net/Laura_Luo/article/details/117776909
Author: 枯叶酿茶
Title: ESP32+INMP441+DHT11+OLED+网页+Arduino——“智能”语音天气站(1):INMP441录音并显示
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/497870/
转载文章受原作者版权保护。转载请注明原作者出处!