Khác

INMP441 MẠCH CẢM BIẾN ÂM THANH MICRO I2S ( CHIP TỐT )

Mã sản phẩm: K3_147
Module micro có thể thu âm thanh từ mọi hướng với độ chính xác cao, tiêu thụ điện năng thấp, giao tiếp I2S với vi điều khiển, sản phẩm này đi kèm hướng dẫn sử dụng với ESP32.Sản phẩm này thích hợp trong các ứng dụng nhận dạng phân loại...
82,000₫
Hàng còn: 17
Số lượng
 
1
 
Thêm vào giỏ Mua ngay

Dịch vụ & Khuyến mãi

Giao miễn phí chuyển phát nhanh trong nội thành TPHCM đối với đơn hàng trên 1 triệu đồng

Giảm 5k cho đơn hàng trên 300k đồng

Giảm 10k cho đơn hàng trên 500k đồng

Giảm 15k hoặc freeship chuyển phát nhanh cho đơn hàng trên 1tr đồng

Giảm 25.000đ hoặc freeship cho đơn hàng trên 2tr đồng.

Chi tiết sản phẩm

Module micro có thể thu âm thanh từ mọi hướng với độ chính xác cao, tiêu thụ điện năng thấp, giao tiếp I2S với vi điều khiển, sản phẩm này đi kèm hướng dẫn sử dụng với ESP32.

Sản phẩm này thích hợp trong các ứng dụng nhận dạng phân loại giọng nói, điều khiển thiết bị bằng giọng nói…

THÔNG SỐ KỸ THUẬT

  • Cảm biến: INMP441
  • Giao tiếp: I2S
  • Điện áp cấp: 3.3V
  • Khoảng cách chân cắm: 2.54mm
  • Giao diện I²S kỹ thuật số với độ chính xác 24-bit
  • Tỷ lệ tín hiệu trên nhiễu cao (SNR): 61 dBA
  • Độ nhạy cao (SNR): -26 dBFS
  • Đáp tuyến tần số ổn định từ 60 Hz đến 15 kHz
  • Tiêu thụ điện năng thấp: dòng điện tiêu thụ thấp 1.4 mA
  • Tỷ lệ loại bỏ nguồn điện cao (PSR): -75 dBFS

 

CODE TEST INMP441 VỚI ESP32

 

// Test INMP441 + ESP32 → Serial Plotter

// ESP32 Arduino core (IDF) – dùng driver I2S gốc

#include <Arduino.h>

#include "driver/i2s.h"

// ==== Chọn chân theo phần đấu dây ở trên ====

#define I2S_WS      25   // LRCLK / WS

#define I2S_SCK     32   // BCLK / SCK

#define I2S_SD      33   // DOUT từ INMP441 sang ESP32

#define I2S_PORT    I2S_NUM_0

// ==== Tham số thu ====

#define SAMPLE_RATE       16000      // 16 kHz đủ xem voice, nhẹ CPU

#define SAMPLES_PER_READ  256        // Mỗi lần đọc 256 mẫu (32-bit)

// Bộ đệm đọc

int32_t i2sBuffer[SAMPLES_PER_READ];

void i2s_install() {

  // INMP441 xuất 24-bit MSB trong khung 32-bit; chọn 32-bit để nhận đủ

  i2s_config_t cfg = {

    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),

    .sample_rate = SAMPLE_RATE,

    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,

    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT, // L/R pin = GND → LEFT

    .communication_format = I2S_COMM_FORMAT_I2S, // Chuẩn I2S

    .intr_alloc_flags = 0,

    .dma_buf_count = 8,

    .dma_buf_len = SAMPLES_PER_READ,

    .use_apll = false,

    .tx_desc_auto_clear = false,

    .fixed_mclk = 0

  };

  i2s_pin_config_t pins = {

    .bck_io_num = I2S_SCK,

    .ws_io_num = I2S_WS,

    .data_out_num = I2S_PIN_NO_CHANGE, // không dùng TX

    .data_in_num = I2S_SD

  };

  // Khởi tạo I2S

  i2s_driver_install(I2S_PORT, &cfg, 0, NULL);

  i2s_set_pin(I2S_PORT, &pins);

  // Tùy mic, có thể cần đảo pha LRCLK; nếu méo, thử bật dòng dưới:

  // i2s_set_clk(I2S_PORT, SAMPLE_RATE, I2S_BITS_PER_SAMPLE_32BIT, I2S_CHANNEL_MONO);

  i2s_zero_dma_buffer(I2S_PORT);

}

void setup() {

  Serial.begin(115200);

  delay(200);

  i2s_install();

  // In header để Serial Plotter hiểu 2 cột dữ liệu

  Serial.println("wave\trms");

}

// Bộ lọc khử DC một cực (HPF đơn giản)

float hpf_prev_in = 0.0f;

float hpf_prev_out = 0.0f;

const float HPF_ALPHA = 0.995f; // tăng lên (0.997…0.999) nếu muốn khử DC mạnh hơn

void loop() {

  size_t bytesRead = 0;

  // Đọc SAMPLES_PER_READ mẫu (mỗi mẫu 4 byte)

  i2s_read(I2S_PORT, (void*)i2sBuffer, sizeof(i2sBuffer), &bytesRead, portMAX_DELAY);

  int n = bytesRead / sizeof(int32_t);

  if (n <= 0) return;

  // Tính RMS theo block để vẽ thêm đường "rms"

  double sumsq = 0.0;

  // In lần lượt từng mẫu để vẽ "wave".

  // Lưu ý: INMP441 là 24-bit đóng gói 32-bit, cần dịch 8 bit để lấy đúng biên độ.

  for (int i = 0; i < n; i++) {

    // Lấy mẫu 24-bit có dấu (đặt trong 32-bit, MSB trước)

    int32_t s = i2sBuffer[i] >> 8;     // đưa về 24-bit canh phải

    // Chuyển sang float để lọc

    float x = (float)s;

    // HPF: y[n] = alpha*y[n-1] + x[n] - x[n-1]

    float y = HPF_ALPHA * hpf_prev_out + (x - hpf_prev_in);

    hpf_prev_in = x;

    hpf_prev_out = y;

    // Scale nhẹ (giảm biên để Plotter không bị tràn). 24-bit → ~±8.3e6

    float y_plot = y * (1.0f / 1024.0f); // tùy chỉnh nếu nhỏ/quá lớn

    sumsq += (double)y_plot * (double)y_plot;

    // In 2 cột: wave \t rms (rms tạm thời in 0, sẽ cập nhật sau cùng block)

    // Để Serial Plotter không bị “răng cưa”, ta sẽ in rms cuối block.

    Serial.print(y_plot);

    Serial.print('\t');

    Serial.println(0); // placeholder, không ảnh hưởng hiển thị chính

  }

  // Tính RMS cho block và in thêm 1 dòng đánh dấu mức RMS (giúp bạn thấy đường thứ 2 ổn định)

  double rms = sqrt(sumsq / n);

  // In một dòng “điểm” rms (wave=0 để không kéo đường wave)

  Serial.print(0);

  Serial.print('\t');

  Serial.println(rms);

  delay(100);

}

    Bình luận

    Không có sản phẩm nào trong giỏ hàng của bạn

    Không có sản phẩm nào trong giỏ hàng của bạn

    LINH KIỆN ĐIỆN TỬ ĐỨC HUY (29A BÙI XUÂN PHÁI)
    Hotline 0942954739
    LINH KIỆN ĐIỆN TỬ ĐỨC HUY (29A BÙI XUÂN PHÁI)