Bỏ qua, đến nội dung chính
Nastrotek
Bài viếtFirmware

Thiết kế audio hai chiều trên ESP32-S3: Microphone I2S và loa I2S

Giải thích các tín hiệu BCLK, WS, DIN, DOUT, full-duplex, sample rate và buffer khi thiết kế audio hai chiều trên ESP32-S3.

Chia sẻ

LinkedInFacebookX
Original open robot prototype showing its controller, speaker, battery and display hardware

Khi một thiết bị nhỏ cần vừa nghe vừa phát âm thanh, I2S thường gọn hơn nhiều so với đường analog tự chế. Với ESP32-S3, bạn có thể dùng microphone MEMS I2S như INMP441 để thu âm, đồng thời dùng amplifier I2S như MAX98357A để phát ra loa nhỏ.

Điểm cần hiểu trước không phải là tên module, mà là các đường tín hiệu: BCLK, WS, DIN, DOUT, sample rate và buffer. Nếu các phần này rõ, việc chọn GPIO và debug audio sẽ đỡ mơ hồ hơn.

I2S dùng để làm gì

I2S là giao thức serial đồng bộ, thường dùng để truyền dữ liệu âm thanh số giữa hai chip. Trên ESP32-S3, peripheral I2S có thể nhận mẫu âm thanh vào hoặc xuất mẫu âm thanh ra thông qua driver của ESP-IDF.

Với một robot nhỏ, mạch cơ bản có thể hình dung như sau:

  • Microphone I2S: gửi audio data vào ESP32-S3.
  • ESP32-S3: đọc buffer thu âm, xử lý hoặc stream dữ liệu.
  • Amplifier I2S: nhận audio data từ ESP32-S3.
  • Loa: phát âm thanh đã khuếch đại.

BCLK, WS, DIN và DOUT

Trong standard I2S, các đường quan trọng thường là:

  • BCLK: bit clock. Mỗi nhịp clock tương ứng với một bit dữ liệu trên đường data.
  • WS: word select, còn gọi là LRCK. Nó cho biết frame hiện tại thuộc slot trái hay phải. Với non-PDM mode, tần số WS thường bằng sample rate.
  • DIN: data đi vào ESP32-S3, ví dụ từ microphone I2S.
  • DOUT: data đi ra khỏi ESP32-S3, ví dụ sang amplifier I2S.
  • MCLK: master clock, không phải module nào cũng cần. Nhiều module phổ biến như INMP441 hoặc MAX98357A thường chỉ cần BCLK, WS và data.

Tên DIN/DOUT khá dễ gây nhầm vì còn tùy mình đang nhìn từ phía nào. Trong bài này, hãy nhìn từ ESP32-S3: DIN là dữ liệu đi vào chip, còn DOUT là dữ liệu chip phát ra.

Thu với INMP441 hoặc microphone MEMS I2S

Một microphone I2S như INMP441 thường có các chân:

  • SCK hoặc BCLK: nhận bit clock.
  • WS: nhận word select.
  • SD: gửi dữ liệu audio về ESP32-S3.
  • L/R: chọn slot trái hoặc phải.
  • VDDGND: nguồn.

Với ESP32-S3 làm master, chip tạo BCLKWS, microphone dùng hai clock này để đẩy dữ liệu ra chân SD. Chân SD nối về một GPIO được cấu hình làm data input của RX channel.

Phát với MAX98357A và loa

MAX98357A là một amplifier I2S phổ biến cho loa nhỏ. Ở mức kiến trúc, nó nhận:

  • BCLK.
  • WS hoặc LRCLK.
  • DIN, tức dữ liệu audio đi vào amplifier.
  • Nguồn cấp phù hợp cho amplifier và loa.

Từ góc nhìn ESP32-S3, dữ liệu phát nằm trên DOUT. Đường này nối đến DIN của MAX98357A. Sau đó amplifier khuếch đại tín hiệu để kéo loa 4 ohm hoặc 8 ohm tùy module và thiết kế nguồn.

Full-duplex nghĩa là gì

Full-duplex nghĩa là hệ thống có thể thu và phát cùng lúc. Ví dụ: robot đang phát âm phản hồi nhưng vẫn tiếp tục nghe môi trường hoặc nghe lệnh dừng.

Trên ESP32-S3, mỗi I2S controller có RX channel và TX channel riêng. Tài liệu ESP-IDF cũng ghi rõ RX và TX có thể làm việc với cấu hình clock, slot và GPIO riêng. Trong thiết kế thực tế, nếu muốn thu/phát đồng bộ hơn, bạn nên dùng cùng sample rate và cùng format dữ liệu cho hai hướng, trừ khi có lý do rõ ràng để tách.

Một cấu hình dễ bắt đầu:

  • RX: microphone I2S, mono, 16 kHz hoặc 32 kHz.
  • TX: amplifier I2S, mono/stereo tùy module, 16 kHz hoặc 32 kHz.
  • Sample width: thường bắt đầu với 16-bit hoặc 32-bit theo module microphone.

Sample rate nên chọn bao nhiêu

Sample rate là số mẫu âm thanh trong một giây cho mỗi slot. Với voice UI, không phải lúc nào cũng cần 44.1 kHz hoặc 48 kHz.

Gợi ý thực tế:

  • 16 kHz: đủ tốt cho nhận giọng nói, wake word, voice command cơ bản.
  • 32 kHz: cân bằng hơn nếu muốn âm thanh nghe tự nhiên hơn.
  • 44.1 kHz hoặc 48 kHz: hợp hơn cho nhạc hoặc phát audio chất lượng cao, nhưng tốn buffer và băng thông hơn.

Nếu mục tiêu là robot nhỏ có phản hồi giọng nói ngắn, 16 kHz hoặc 32 kHz thường dễ debug hơn.

Buffer và DMA

I2S không nên để CPU copy từng sample một. ESP-IDF dùng DMA để vận chuyển dữ liệu theo buffer. Theo tài liệu Espressif, kích thước DMA buffer phụ thuộc vào số frame, số slot và độ rộng bit của slot.

Cách hiểu đơn giản:

  • Buffer quá nhỏ: latency thấp hơn, nhưng dễ underrun/overrun nếu task xử lý chậm.
  • Buffer quá lớn: ổn định hơn, nhưng tăng độ trễ.
  • Với audio hai chiều, RX và TX đều cần buffer riêng, nên RAM phải được tính từ đầu.

Khi mới prototype, hãy chọn buffer vừa phải, đo log underrun/timeout, rồi mới tối ưu. Đừng bắt đầu bằng cấu hình “càng nhỏ càng realtime” nếu firmware còn nhiều task khác như UI, Wi-Fi hoặc animation.

Kiến trúc đề xuất

Một kiến trúc gọn cho ESP32-S3 + INMP441 + MAX98357A:

  • ESP32-S3 là I2S master.
  • Microphone I2S nhận BCLKWS, gửi data về DIN của ESP32-S3.
  • MAX98357A nhận BCLK, WS và data từ DOUT của ESP32-S3.
  • RX task đọc microphone vào ring buffer.
  • Audio processing task xử lý hoặc chuyển tiếp dữ liệu.
  • TX task lấy dữ liệu phát ra amplifier.

Nếu cần echo cancellation hoặc xử lý giọng nói nghiêm túc, kiến trúc sẽ phức tạp hơn. Nhưng với robot nhỏ hoặc thiết bị tương tác đơn giản, mô hình ba task này đủ để bắt đầu.

Lưu ý khi chọn GPIO

  • Ưu tiên chọn các chân I2S trước, sau đó mới tới LED, nút bấm hoặc interrupt phụ.
  • Giữ đường microphone xa amplifier, loa và nguồn switching.
  • Tránh dùng chân liên quan boot strap, flash, PSRAM hoặc USB nếu module ESP32-S3 của bạn đã dùng chúng.
  • Ghi rõ chiều dữ liệu trong schematic: ESP32-S3 DOUT -> MAX98357A DIN, INMP441 SD -> ESP32-S3 DIN.
  • Nếu dùng chung BCLKWS cho cả mic và amp, hãy đảm bảo sample rate và slot format phù hợp cho cả hai.

Kết luận

Audio hai chiều trên ESP32-S3 không quá khó nếu tách rõ input, output và buffer. Với INMP441 hoặc microphone MEMS I2S, MAX98357A và một loa nhỏ, bạn có thể tạo một kiến trúc đủ tốt cho robot để bàn, voice UI hoặc thiết bị nhúng có phản hồi âm thanh. Hãy bắt đầu từ sample rate vừa phải, buffer đủ ổn định và sơ đồ GPIO rõ ràng trước khi tối ưu latency.

Tham khảo

Đọc thêm liên quan

Chia sẻ

LinkedInFacebookX

Tiếp tục khám phá

Đọc tiếp

Bài viết liên quan

Xem thêm trong Bài viết

Nastrotek sử dụng cookie để phân tích truy cập và cá nhân hóa quảng cáo, giúp hiểu cách website được sử dụng. Bạn có thể chấp nhận hoặc từ chối các cookie không thiết yếu.