반응형

아두이노나 ESP32에서 소리를 측정할 때는 보통 MAX4466, MAX9814 같은 아날로그 마이크 모듈을 ADC 핀에 연결하여 사용한다. 하지만 아날로그 방식은 보드의 전원 잡음과 ADC 잡음이 그대로 소리 데이터에 섞이고, ESP32의 ADC는 정밀도가 높지 않아 녹음 품질이 떨어지는 한계가 있었다.

INMP441은 마이크와 ADC가 하나의 칩에 들어 있는 MEMS 디지털 마이크로, 소리를 칩 안에서 24비트 디지털 값으로 바꾼 후 I2S 방식으로 보내기 때문에 잡음이 적고 깨끗한 소리를 얻을 수 있다. 이 글에서는 INMP441의 사양과 ESP32 연결 방법, 소리 크기(dB)를 측정하는 예제와 녹음 방법을 소개한다.

 


1. INMP441 소개

INMP441은 TDK InvenSense에서 만든 전방향(Omnidirectional) MEMS 마이크로, 마이크 소리 구멍이 기판 아래쪽에 있는 바텀 포트(Bottom Port) 구조이다. 판매되는 모듈은 이 칩을 작은 원형 기판에 올리고 6개의 핀을 뽑아 놓은 형태이며, 소리 구멍은 칩이 없는 반대쪽 면에 뚫려 있다.

I2S(Inter-IC Sound)는 디지털 오디오 데이터를 주고받기 위한 통신 방식으로, 비트 클럭(SCK), 좌우 채널 선택(WS), 데이터(SD) 3개의 선으로 소리 데이터를 계속 전송한다. ESP32, ESP32-S3, 라즈베리파이 피코 등은 I2S 주변장치를 갖추고 있어 INMP441을 바로 연결할 수 있다.

특징:

  • 디지털 출력: 칩 안에서 24비트로 변환하므로 보드의 전원 잡음과 ADC 성능에 영향을 적게 받는다.
  • 높은 신호 대 잡음비: SNR 61dBA로 작은 소리도 비교적 깨끗하게 측정할 수 있다.
  • 스테레오 구성: L/R 핀 설정을 다르게 한 INMP441 두 개를 같은 I2S 선에 연결하면 스테레오 녹음을 할 수 있다.
  • 저전력: 1.4mA 정도의 낮은 전류로 동작하여 배터리 장치에도 사용할 수 있다.

2. 주요 사양 및 아날로그 마이크와의 비교

많이 사용하는 아날로그 마이크 모듈 MAX9814와 INMP441의 차이는 다음과 같다.

항목 MAX9814 (아날로그) INMP441 (디지털)
출력 방식 아날로그 전압 I2S 디지털 (24-bit)
연결 핀 ADC 핀 1개 I2S 3개 (SCK, WS, SD)
해상도 보드 ADC에 따름 (ESP32 12-bit) 24-bit
신호 대 잡음비 보드 잡음에 따라 달라짐 61 dBA
감도 자동 이득 조절 (AGC) -26 dBFS (94dB SPL 기준)
주파수 응답 20Hz ~ 20kHz 60Hz ~ 15kHz
동작 전압 2.7 ~ 5.5V 1.8 ~ 3.3V
사용 가능 보드 아두이노 우노 등 대부분 I2S 지원 보드 (ESP32 등)

 

아두이노 우노처럼 I2S 기능이 없는 보드에서는 INMP441을 사용할 수 없으므로, 우노에서는 아날로그 마이크를 사용하고 ESP32 계열에서는 INMP441을 사용하는 것이 좋다.


3. PIN 배열 및 연결

1) INMP441 핀 기능

핀 기능
VDD 전원 (3.3V)
GND GND
SCK I2S 비트 클럭 (BCLK)
WS 좌우 채널 선택 (LRCLK)
SD 소리 데이터 출력
L/R 채널 선택 (GND: 왼쪽, VDD: 오른쪽)

 

2) ESP32 연결

ESP32 DevKitC 보드와 다음과 같이 연결한다. ESP32의 I2S 핀은 대부분의 GPIO로 바꿀 수 있지만, SD 신호는 입력 전용 핀(GPIO34~39)에도 연결할 수 있다.

INMP441 ESP32
VDD 3.3V
GND GND
SCK GPIO26
WS GPIO25
SD GPIO33
L/R GND

 

 

출처: 직접 제작


4. 개발환경 및 라이브러리

아두이노 IDE의 보드 매니저에서 esp32 by Espressif Systems 패키지 3.x 버전을 설치한다. 3.x 버전에는 I2S를 쉽게 사용할 수 있는 ESP_I2S 라이브러리가 포함되어 있으므로 따로 라이브러리를 설치할 필요가 없다. 보드는 [ESP32 Dev Module]을 선택한다.

2.x 버전에서 사용하던 driver/i2s.h 방식의 예제는 3.x 버전에서 동작하지 않거나 경고가 출력되므로, 인터넷의 예제를 사용할 때는 패키지 버전을 확인해야 한다.


5. 예제 코드

1) 소리 크기(dB) 측정

INMP441로 소리를 받아 대략적인 소리 크기를 dB로 계산하고, 70dB이 넘으면 보드의 내장 LED를 켜는 예제이다.

#include <ESP_I2S.h>

#define I2S_SCK 26   // INMP441 SCK
#define I2S_WS  25   // INMP441 WS
#define I2S_SD  33   // INMP441 SD
#define LED_PIN 2    // 보드 내장 LED

I2SClass i2s;
int32_t samples[256];

void setup() {
  Serial.begin(115200);
  pinMode(LED_PIN, OUTPUT);

  i2s.setPins(I2S_SCK, I2S_WS, -1, I2S_SD);
  if (!i2s.begin(I2S_MODE_STD, 16000, I2S_DATA_BIT_WIDTH_32BIT,
                 I2S_SLOT_MODE_MONO, I2S_STD_SLOT_LEFT)) {
    Serial.println("I2S 초기화 실패");
    while (true) delay(1000);
  }
}

void loop() {
  size_t bytes = i2s.readBytes((char *)samples, sizeof(samples));
  int count = bytes / 4;
  if (count == 0) return;

  double sum = 0;
  for (int i = 0; i < count; i++) {
    int32_t v = samples[i] >> 8;   // 상위 24비트가 소리 데이터
    sum += (double)v * v;
  }
  double rms = sqrt(sum / count);
  double db = 20.0 * log10(rms / 8388607.0 + 1e-9) + 120.0;
  Serial.println(db);

  digitalWrite(LED_PIN, db > 70 ? HIGH : LOW);
}

코드 설명:

  • 1 Line: ESP32 패키지에 포함된 I2S 라이브러리를 불러온다.
  • 3~6 Line: INMP441을 연결한 핀과 LED 핀을 정의한다. 보드에 따라 내장 LED가 없거나 다른 핀에 있을 수 있다.
  • 8~9 Line: I2S 객체와 소리 데이터 256개를 담을 배열을 만든다.
  • 15 Line: 비트 클럭, WS, 출력(사용 안 함 -1), 입력 핀 순서로 I2S 핀을 지정한다.
  • 16~20 Line: 표준 I2S 모드, 16kHz 샘플링, 32비트 데이터, 모노(왼쪽 채널)로 시작한다. INMP441은 24비트 데이터를 32비트 슬롯에 담아 보내므로 32비트로 설정해야 한다.
  • 24~26 Line: 소리 데이터를 읽고, 읽은 바이트 수를 4로 나누어 샘플 수를 구한다.
  • 28~33 Line: 각 샘플을 8비트 오른쪽으로 밀어 24비트 값으로 만든 후 제곱 평균의 제곱근(RMS)을 구한다.
  • 34 Line: RMS 값을 최대값(8388607)에 대한 dBFS로 바꾸고 120을 더해 대략적인 dB SPL 값으로 만든다. INMP441은 94dB 소리에서 -26dBFS가 나오므로 94 + 26 = 120을 더한다.
  • 35~37 Line: 계산한 값을 출력하고, 70dB이 넘으면 LED를 켠다.

업로드한 후 [툴] → [시리얼 플로터]를 열고 115200bps로 설정하면 소리 크기가 그래프로 표시된다. 조용한 방에서는 30~40dB 정도, 박수를 치면 80dB 이상으로 올라가는 것을 확인할 수 있다. 정확한 소음계가 아니므로 소음계 앱이나 측정기와 비교하여 120 값을 조금 조정해 사용하면 된다.

 

2) 녹음하여 WAV 파일로 저장

ESP_I2S 라이브러리는 정해진 시간 동안 녹음하여 WAV 데이터로 만들어 주는 recordWAV() 함수를 제공한다. [파일] → [예제] → [ESP_I2S] → [Record_to_WAV] 예제를 열어 I2S 핀 번호를 위의 연결에 맞게 바꾸고, microSD 카드 핀을 사용하는 보드에 맞게 설정하면 5초 동안 녹음한 소리를 test.wav 파일로 저장할 수 있다.

WAV 데이터는 16kHz, 16비트 모노 기준으로 1초에 약 32KB가 필요하므로, 길게 녹음하려면 PSRAM이 있는 ESP32-S3 보드를 사용하는 것이 좋다.


6. 주요 용도 및 주의사항

추천 주요 용도:

  • 소음 측정기: 교실, 사무실, 공사장의 소음을 측정하고 기준을 넘으면 경고 LED나 알림을 보낼 수 있다.
  • 음성 녹음기: microSD 카드에 녹음 파일을 저장하는 간단한 녹음기를 만들 수 있다.
  • 음성 인식: 녹음한 소리를 서버나 AI 음성 인식 서비스로 보내거나, ESP32-S3의 ESP-SR 라이브러리로 음성 명령을 인식할 수 있다.
  • 소리 반응 조명: 소리 크기나 박수 소리에 맞춰 LED가 반응하는 조명을 만들 수 있다.

사용 시 주의사항:

  • 3.3V 전용: VDD에 5V를 연결하면 칩이 손상될 수 있다.
  • L/R 핀 연결: L/R 핀을 비워 두면 채널이 정해지지 않아 데이터가 0으로 나오거나 불안정해지므로 반드시 GND 또는 VDD에 연결한다.
  • 소리 구멍 방향: 소리 구멍은 칩 반대쪽 면에 있으므로, 케이스에 넣을 때 구멍이 막히지 않도록 한다.
  • 선 길이: I2S 신호는 속도가 빠르므로 점퍼선은 20cm 이내로 짧게 연결하는 것이 좋다.
  • 처음 읽는 값: 시작 직후 수십 ms 동안은 값이 불안정하므로 처음 읽은 데이터는 버리고 사용하는 것이 좋다.

구매좌표:

 

 

 

INMP441 Omnidirectional Microphone Module I2S Interface High Sensitivity for ESP32 IoT Voice Development - AliExpress 18

Smarter Shopping, Better Living! Aliexpress.com

www.aliexpress.com

 

반응형

+ Recent posts