摘要:本文介紹如何使用INMP441模塊采集聲音
前邊介紹了第一個(gè)基于I2S通信協(xié)議的MAX98357A模塊,利用該模塊可以播放各種聲音文件。今天來介紹如何使用INMP441模塊實(shí)現(xiàn)聲音的采集功能,也就是如何將聲音轉(zhuǎn)變成數(shù)字信號(hào)。
INMP441是一款高性能,低功耗,數(shù)字輸出的全向MEMS(微型機(jī)電系統(tǒng))麥克風(fēng)。完整的INMP441由一個(gè)MEMS聲音傳感器,模數(shù)轉(zhuǎn)換器(ADC),抗混疊濾波器,電源管理和標(biāo)準(zhǔn)的24位I2S接口組成。I2S接口允許INMP441直接連接到數(shù)字處理器,如DSP和微控制器,而無需再使用音頻編解碼器,極大的降低了開發(fā)的難度。INMP441具有高信噪比,是一款出色的近場(chǎng)應(yīng)用。INMP441具有扁平寬帶頻率響應(yīng),使得采集聲音的清晰度很高。
INMP441模塊如下圖所示:
INMP441具有以下這些特性和規(guī)格參數(shù):
1?具有高精度24位數(shù)據(jù)的數(shù)字I2S接口
2?高信噪比為61dBA
3 高靈敏度-26dBFS
4?從60Hz到15kHz的穩(wěn)定頻率響應(yīng)
5?低功耗:低電流消耗1.4mA
6 電源電壓:1.62 V至3.63 V
7 高PSR:-75dBFS
8 尺寸:12mm*14mm
INMP441的接口定義如下所示:
序號(hào) |
標(biāo)識(shí) |
說明 |
1 |
SCK |
I2S接口的串行數(shù)據(jù)時(shí)鐘 |
2 |
WS |
用于I2S接口的串行數(shù)據(jù)字選擇 |
3 |
L/R |
左/右聲道選擇。設(shè)置為低電平時(shí),麥克風(fēng)在I2S幀的左聲道輸出信號(hào)。設(shè)置為高電平時(shí),麥克風(fēng)在右聲道輸出信號(hào) |
4 |
SD |
I2S接口的串行數(shù)據(jù)輸出。 |
5 |
VCC |
輸入電源,1.8V至3.3V. |
6 |
GND |
電源地 |
在這里需要注意的是L/R引腳是用來設(shè)置本模塊屬于哪個(gè)聲道的,也就決定了這個(gè)模塊在WS信號(hào)是高電平還是低電平的時(shí)候有輸出。一個(gè)雙聲道聲音采集系統(tǒng),如下圖所示:
在上圖中可以看到左聲道的441模塊L/R為接地,是低電平狀態(tài),右聲道的L/R為接電源正極,是高電平狀態(tài)。這樣微處理器在讀取數(shù)據(jù)時(shí),通過控制WS的狀態(tài),就可以分別讀取左右聲道的數(shù)據(jù)了。
前面的MAX98357A模塊的使用借助了第三方的庫函數(shù),可以說在開發(fā)中基本沒有涉及到I2S協(xié)議的底層操作。這次通過使用微處理器廠家提供的原生驅(qū)動(dòng)來實(shí)現(xiàn)INMP441聲音采集后由MAX98357A播放出來的程序。
使用微處理器廠家提供的原始庫函數(shù)來驅(qū)動(dòng)I2S設(shè)備工作,通常需要以下幾個(gè)步驟:
1.引入頭文件
#include?<driver/i2s.h>
2.I2S控制器初始化
ESP32處理器內(nèi)置了2個(gè)I2S控制器,因此可以同時(shí)與兩個(gè)音頻設(shè)備之間傳輸音頻數(shù)據(jù)。每個(gè)I2S控制器都具備以下功能,可由I2S驅(qū)動(dòng)進(jìn)行配置:
- 可用作系統(tǒng)主機(jī)或從機(jī)
- 可用作發(fā)射器或接收器
- DMA控制器支持流數(shù)據(jù)采樣,CPU無需單獨(dú)復(fù)制每個(gè)采樣數(shù)據(jù)
在Arduino中,對(duì)I2S控制器進(jìn)行初始化的方法為:i2s_driver_install()。該方法的主要參數(shù)為i2s_config_t類型的結(jié)構(gòu)實(shí)例,在該數(shù)據(jù)結(jié)構(gòu)中,定義了I2S通信的基本參數(shù),主要包括了以下這些屬性:
mode:I2S的工作模式。
sample_rate:I2S的采樣率
bits_per_sample:I2S的采樣位數(shù)
channel_format:設(shè)置左右聲道
communication_format:設(shè)置交流格式
dma_buf_count:設(shè)置DMA緩沖區(qū)的數(shù)量
dma_buf_len:設(shè)置每個(gè)DMA緩沖區(qū)的大小
use_apll:設(shè)置是否使用精確時(shí)鐘
intr_alloc_flags:設(shè)置如何分配中斷
3.設(shè)置I2S使用的引腳
使用i2s_set_pin()方法可以設(shè)置I2S通信所使用的引腳。該方法所使用的參數(shù)為i2s_pin_config_t類型的數(shù)據(jù)結(jié)構(gòu),在該結(jié)構(gòu)中定義的了I2S通信所使用的引腳。該結(jié)構(gòu)有如下屬性:
bck_io_num:設(shè)置串行時(shí)鐘引腳
ws_io_num:設(shè)置左右聲道的時(shí)鐘引腳
data_out_num:設(shè)置數(shù)據(jù)輸出引腳
data_in_num:設(shè)置數(shù)據(jù)輸入引腳
需要注意的是,在驅(qū)動(dòng)MAX98357A模塊的時(shí)候,使用的是數(shù)據(jù)輸出引腳,而在驅(qū)動(dòng)INMP441模塊的時(shí)候,則使用的是輸入引腳。不使用的引腳可以賦值-1。ESP32微處理器是支持輸入和輸出引腳同時(shí)使用的,也就是可以同時(shí)讀入音頻數(shù)據(jù)和輸出音頻數(shù)據(jù)。但前提條件是由于收發(fā)通道共用一個(gè)時(shí)鐘信號(hào),因此要求兩者的配置相同。
4.讀入或者輸出音頻數(shù)據(jù)。
在前面配置完成后,就可以使用i2s_read()方法讀入音頻數(shù)據(jù),i2s_write()方法輸出音頻數(shù)據(jù)了。這兩個(gè)方法的具體使用,請(qǐng)參照下面的例子。
接下來就看一下這個(gè)示例的源代碼吧,如下所示:
#include?"Arduino.h" #include?<driver/i2s.h> #define?INMP441_WS?22 #define?INMP441_SCK?21 #define?INMP441_SD?32 #define?MAX98357_LRC?27 #define?MAX98357_BCLK?26 #define?MAX98357_DIN?25 #define?SAMPLE_RATE?44100 i2s_config_t?i2sIn_config = { ? .mode = i2s_mode_t(I2S_MODE_MASTER | I2S_MODE_RX), ? .sample_rate = SAMPLE_RATE, ? .bits_per_sample = i2s_bits_per_sample_t(16), ? .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT, ? .communication_format = i2s_comm_format_t(I2S_COMM_FORMAT_STAND_I2S), ? .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1, ? .dma_buf_count = 8, ? .dma_buf_len = 1024 }; const?i2s_pin_config_t?i2sIn_pin_config = { ? .bck_io_num = INMP441_SCK, ? .ws_io_num = INMP441_WS, ? .data_out_num = -1, ? .data_in_num = INMP441_SD }; i2s_config_t?i2sOut_config = { ? .mode = i2s_mode_t(I2S_MODE_MASTER | I2S_MODE_TX), ? .sample_rate = SAMPLE_RATE, ? .bits_per_sample = i2s_bits_per_sample_t(16), ? .channel_format = I2S_CHANNEL_FMT_ONLY_RIGHT, ? .communication_format = i2s_comm_format_t(I2S_COMM_FORMAT_STAND_I2S), ? .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1, ? .dma_buf_count = 8, ? .dma_buf_len = 1024 }; const?i2s_pin_config_t?i2sOut_pin_config = { ? .bck_io_num = MAX98357_BCLK, ? .ws_io_num = MAX98357_LRC, ? .data_out_num = MAX98357_DIN, ? .data_in_num = -1 }; void?setup()?{ ? // put your setup code here, to run once: ? Serial.begin(115200); ? i2s_driver_install(I2S_NUM_0, &i2sIn_config, 0, NULL); ? i2s_set_pin(I2S_NUM_0, &i2sIn_pin_config); ? i2s_driver_install(I2S_NUM_1, &i2sOut_config, 0, NULL); ? i2s_set_pin(I2S_NUM_1, &i2sOut_pin_config); }文章來源:http://www.zghlxwxcb.cn/news/detail-840085.html void?loop()?{ ? // put your main code here, to run repeatedly: ? size_t?bytes_read; ? int16_t?data[512]; ? esp_err_t?result = i2s_read(I2S_NUM_0, &data, sizeof(data), &bytes_read, portMAX_DELAY); ? result = i2s_write(I2S_NUM_1, &data, sizeof(data), &bytes_read, portMAX_DELAY); } |
好了,I2S通信協(xié)議的使用方法就介紹到這里了。文章來源地址http://www.zghlxwxcb.cn/news/detail-840085.html
到了這里,關(guān)于一起玩兒物聯(lián)網(wǎng)人工智能小車(ESP32)——69 使用INMP441模塊采集聲音的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!