- 29a Bùi Xuân Phái, P.Tây Thạnh, Quận Tân Phú, TPHCM
- linhkienduchuy2018@gmail.com
- TƯ VẤN, GIẢI ĐÁP, HƯỚNG DẪN, MUA HÀNG (ZALO): 0966515049 - 0942954739
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.
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…

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