Kiến thức âm thanh cơ bản

WiFi và Bluetooth cùng lúc trên ESP32: vì sao nhạc A2DP bị giật và cách giảm

Cimo 10 phút đọc

ESP32 chỉ có một radio 2,4 GHz dùng chung cho WiFi và Bluetooth, nên hai giao thức phải chia nhau theo thời gian bằng cơ chế coexistence của Espressif. Bài viết giải thích vì sao tiếng A2DP giật khi WiFi tải nặng và bốn cách giảm: giảm tải WiFi, tách tác vụ sang hai nhân, tăng buffer và ưu tiên chế độ STA.

WiFi và Bluetooth cùng lúc trên ESP32: vì sao nhạc A2DP bị giật và cách giảm
Mục lục
  1. Một radio duy nhất: WiFi và Bluetooth không thể nói chuyện cùng một lúc
  2. Ví dụ: một chu kỳ chia thời gian trông như thế nào
  3. Vì sao tiếng A2DP giật đúng lúc WiFi tải nặng
  4. Ví dụ: buffer 50 ms cạn nhanh đến mức nào
  5. Bốn cách giảm giật, xếp theo thứ tự nên thử
  6. 1. Giảm tải và băng thông WiFi trong lúc phát nhạc
  7. 2. Tách tác vụ WiFi và Bluetooth sang hai nhân CPU
  8. 3. Tăng buffer cho đường âm thanh
  9. 4. Ưu tiên chế độ STA và hạn chế quét mạng
  10. Ví dụ: một kịch bản kiểm tra trên bàn DIY
  11. Khi nào nên tách hẳn hai vai trò
  12. Câu hỏi thường gặp
  13. ESP32 có chạy WiFi và Bluetooth cùng lúc được không?
  14. Tăng buffer lên rất lớn có hết giật không?
  15. ESP32-S3 có bị vấn đề coexistence này không?
  16. Tắt WiFi khi nghe Bluetooth có phải giải pháp chấp nhận được?

ESP32 chạy được WiFi và Bluetooth cùng lúc, cấu hình rất hấp dẫn cho loa DIY: điện thoại phát nhạc qua A2DP (hồ sơ truyền âm thanh của Bluetooth Classic), còn WiFi lo điều khiển hoặc nhận stream từ mạng nhà. Nhưng tiếng hay bị giật đúng lúc WiFi bận. Nguyên nhân gốc không phải DAC hay dây I2S: ESP32 chỉ có một module radio 2,4 GHz duy nhất dùng chung cho cả WiFi lẫn Bluetooth, và hai giao thức phải thay phiên nhau dùng nó theo cơ chế coexistence (cơ chế cùng tồn tại — cách chia sẻ tài nguyên radio giữa các giao thức). Nền tảng luồng âm thanh của chip này đã có ở bài trụ cột ESP32 xử lý âm thanh số: kiến trúc và giới hạn thực tế.

Ban thu nghiem ESP32 phat nhac Bluetooth dong thoi ket noi WiFi voi laptop va loa DIY

Một radio duy nhất: WiFi và Bluetooth không thể nói chuyện cùng một lúc

Theo tài liệu RF Coexistence của ESP-IDF, ESP32 chỉ có một module RF thuộc băng tần ISM 2,4 GHz, được chia sẻ giữa Bluetooth (cả Classic lẫn BLE — Bluetooth năng lượng thấp) và WiFi. Hệ quả vật lý rất trực tiếp: khi WiFi đang thu hoặc phát, Bluetooth không thể thu phát, và ngược lại. Không có ăng-ten thứ hai hay đường truyền song song nào để lách qua giới hạn này, vì cả hai dùng chung một chuỗi thu phát và cùng một băng tần.

Để hai giao thức vẫn hoạt động được, Espressif dùng phương pháp phân chia theo thời gian (time-division multiplexing — cắt trục thời gian thành các lát, mỗi giao thức được dùng radio trong lát của mình). Một chu kỳ coexistence được chia thành các lát thời gian (time slice) theo thứ tự cho WiFi, Bluetooth Classic và BLE; trong lát của mình, giao thức đó được ưu tiên cao hơn khi xin radio từ module trọng tài. Độ dài chu kỳ và tỷ lệ từng lát thay đổi theo trạng thái WiFi: ở trạng thái đã kết nối (CONNECTED), chu kỳ bắt đầu tại thời điểm phát beacon mục tiêu (TBTT) và dài hơn 100 ms. Ưu tiên cũng là động: một sự kiện Bluetooth ưu tiên cao vẫn có thể chiếm radio ngay trong lát của WiFi.

Ví dụ: một chu kỳ chia thời gian trông như thế nào

Ví dụ: tài liệu ESP-IDF minh họa phương án (scheme) cho trường hợp WiFi CONNECTED và BLE CONNECTED, trong đó lát WiFi và lát BLE mỗi bên chiếm 50% chu kỳ. Với một chu kỳ lấy tròn 100 ms để dễ hình dung, điều đó nghĩa là cứ 100 ms thì mỗi giao thức chỉ có khoảng 50 ms thực sự được dùng radio, phần thời gian còn lại phải chờ. Đây là số minh họa của một phương án cụ thể trong tài liệu, không phải tỷ lệ cố định cho mọi trường hợp: khi chạy A2DP Classic thay vì BLE, tỷ lệ và chính sách ưu tiên do module coexistence quyết định theo trạng thái thực tế, và bài viết này không khẳng định một con số phần trăm cố định cho A2DP. Điểm cần nhớ là băng thông hiệu dụng của mỗi giao thức luôn thấp hơn khi chạy đơn độc, và thời gian chờ là có thật.

Vì sao tiếng A2DP giật đúng lúc WiFi tải nặng

Âm thanh là luồng dữ liệu theo thời gian thực: DAC phía sau tiêu thụ mẫu PCM (định dạng âm thanh số chưa nén) với tốc độ không đổi, không chờ đợi ai. Trong khi đó phía cấp dữ liệu lại bị ngắt quãng bởi ba cơ chế chồng lên nhau.

  • Radio bị chia sẻ: khi WiFi tải nặng (tải file, cập nhật OTA — cập nhật firmware qua mạng, đồng bộ dữ liệu), các lát WiFi bận liên tục và gói Bluetooth đến trễ hoặc phải truyền lại; dữ liệu PCM giải mã ra vì thế về không đều.
  • Buffer bị cạn (underrun): bộ đệm vòng (ring buffer — vùng nhớ xoay vòng nằm giữa bên ghi dữ liệu và bên đọc) chỉ chứa được một lượng âm thanh hữu hạn. Nếu khoảng ngắt dài hơn thời lượng âm thanh trong buffer, bên I2S đọc tới đáy và loa phát ra khoảng lặng hoặc tiếng lụp bụp — đó chính là hiện tượng giật mà tai nghe thấy.
  • CPU và tác vụ tranh nhau: ngoài radio, hai ngăn xếp giao thức còn dùng chung CPU. Tác vụ tải mạng nặng có thể làm chậm cả việc giải mã và ghi buffer, kể cả khi radio đã được nhường đúng lúc.

Tài liệu coexistence của Espressif cũng cho thấy mức độ ổn định phụ thuộc vào tổ hợp chế độ: WiFi ở chế độ trạm (STA — kết nối vào router có sẵn) kết hợp Bluetooth Classic đã kết nối được đánh dấu hỗ trợ và ổn định, trong khi WiFi ở chế độ điểm truy cập (SoftAP — ESP32 tự phát mạng) kết hợp Bluetooth Classic nằm ở nhóm hỗ trợ nhưng hiệu năng không ổn định. Đây là gợi ý thực tế quan trọng khi thiết kế sản phẩm: cùng một phần cứng, chọn chế độ WiFi khác nhau cho kết quả âm thanh khác nhau.

Ví dụ: buffer 50 ms cạn nhanh đến mức nào

Ví dụ: luồng A2DP sau giải mã ở 44,1 kHz, 16 bit, stereo tiêu thụ 44.100 × 16 × 2 / 8 = 176.400 byte mỗi giây ở phía PCM. Một ring buffer chứa 50 ms âm thanh chỉ có 176.400 × 0,05 = 8.820 byte. Nghĩa là chỉ cần chuỗi việc gồm một lát WiFi bận, một lần truyền lại gói và một nhịp tác vụ bị trễ cộng dồn vượt quá khoảng 50 ms mà không có dữ liệu mới được ghi vào, buffer sẽ chạm đáy và tiếng bị ngắt. Tăng buffer lên 200 ms thì dung lượng cần là 35.280 byte (khoảng 34,5 KiB) — đổi lại là thêm khoảng 150 ms độ trễ tiềm ẩn so với mức 50 ms, dễ nhận thấy khi bấm dừng hoặc chuyển bài. Đây là phép tính lý thuyết với giả định PCM chưa nén và tốc độ tiêu thụ đều; nó cho thấy tăng buffer là đánh đổi độ trễ lấy độ mượt, không phải phép màu.

Bốn cách giảm giật, xếp theo thứ tự nên thử

1. Giảm tải và băng thông WiFi trong lúc phát nhạc

Đây là cách tác động đúng vào nguồn tranh chấp. Khi đang phát A2DP, hãy hoãn các việc ngốn mạng như OTA, tải file lớn, đồng bộ log liên tục hoặc quét mạng lặp lại. Ở tầng cấu hình, tài liệu ESP-IDF liệt kê các tùy chọn giảm quy mô buffer và cửa sổ truyền của WiFi trong menuconfig (buffer thu/phát tĩnh và động, cửa sổ Block Ack) nhằm giảm tiêu thụ bộ nhớ khi chạy coexistence; đổi lại thông lượng WiFi tối đa thấp hơn. Chấp nhận WiFi chậm lại có kiểm soát còn tốt hơn để nó chiếm radio theo từng đợt bùng phát khó lường.

2. Tách tác vụ WiFi và Bluetooth sang hai nhân CPU

ESP32 gốc có hai nhân xử lý. Tài liệu coexistence khuyến nghị đặt tác vụ ngăn xếp WiFi ở một CPU và tác vụ bộ điều khiển cùng ngăn xếp Bluetooth ở CPU còn lại, qua các tùy chọn ghim nhân (CONFIG_ESP32_WIFI_TASK_CORE_ID cho WiFi, CONFIG_BTDM_CTRL_PINNED_TO_CORE_CHOICE và CONFIG_BT_BLUEDROID_PINNED_TO_CORE_CHOICE cho Bluetooth). Cách tách này giảm khả năng một tác vụ mạng bận làm nghẽn xử lý Bluetooth. Cũng đừng quên bật CONFIG_ESP32_WIFI_SW_COEXIST_ENABLE trong menuconfig, vì thiếu nó thì cơ chế chia sẻ không được kích hoạt như tài liệu mô tả.

3. Tăng buffer cho đường âm thanh

Như phép tính ở trên, tăng dung lượng ring buffer và số buffer DMA (Direct Memory Access — cơ chế phần cứng tự chuyển dữ liệu vào bộ nhớ, giảm việc cho CPU) của I2S giúp hệ thống chịu được các khoảng ngắt dài hơn. Cách làm chi tiết về DMA và triệu chứng buffer cạn đã có ở bài buffer DMA và lỗi âm thanh bị giật trên ESP32. Lưu ý tăng buffer chỉ che được ngắt quãng ngắn; nếu WiFi chiếm radio quá lâu và liên tục, buffer lớn đến đâu cũng cạn, đồng thời độ trễ điều khiển tăng theo.

4. Ưu tiên chế độ STA và hạn chế quét mạng

Dựa trên bảng hỗ trợ coexistence của Espressif, khi sản phẩm cho phép, hãy để WiFi chạy ở chế độ STA kết nối vào router thay vì bắt ESP32 làm SoftAP trong lúc phát nhạc. Đồng thời tránh các đợt quét WiFi (scan) lặp lại dày đặc trong lúc phát, vì trạng thái quét có lát WiFi dài hơn trạng thái kết nối ổn định theo tài liệu, dễ chen vào đường tiếng hơn.

Ví dụ: một kịch bản kiểm tra trên bàn DIY

Ví dụ: để biết hệ thống của mình giật vì coexistence hay vì nguyên nhân khác, hãy làm phép thử A/B trong 10 phút. Giai đoạn A: tắt WiFi, phát cùng một danh sách nhạc qua bộ thu A2DP (cách dựng bộ thu xem ở bài ESP32 làm bộ thu Bluetooth A2DP xuất I2S), ghi lại số lần ngắt tiếng nghe thấy. Giai đoạn B: bật WiFi ở chế độ STA và cho ESP32 tải lặp lại một file khoảng 20 MB từ máy tính trong cùng mạng nội bộ trong lúc phát nhạc, ghi lại số lần ngắt như cũ. Nếu số lần ngắt ở giai đoạn B tăng rõ rệt còn giai đoạn A gần như sạch, nguyên nhân nằm ở tranh chấp radio và CPU chứ không phải DAC. Sau đó bật lần lượt từng biện pháp ở trên và lặp lại giai đoạn B để thấy biện pháp nào thực sự có tác dụng trên đúng cấu hình của bạn; kết quả cụ thể phụ thuộc router, khoảng cách và tải mạng, nên bài viết không đưa sẵn một con số kỳ vọng.

Khi nào nên tách hẳn hai vai trò

Nếu sản phẩm vừa stream nhạc qua WiFi liên tục, vừa thu A2DP, vừa chạy hiệu ứng, một ESP32 duy nhất có thể không phải đáp án đúng dù đã tối ưu hết các mục trên. Phương án thực tế: dùng ESP32 chỉ cho phần thu Bluetooth Classic và một chip khác cho WiFi, hoặc dùng module thu Bluetooth chuyên dụng và để ESP32 lo phần mạng.

Câu hỏi thường gặp

ESP32 có chạy WiFi và Bluetooth cùng lúc được không?

Được. Espressif hỗ trợ coexistence chính thức, nhưng hai giao thức chia nhau một radio 2,4 GHz theo thời gian nên hiệu năng mỗi bên giảm và một số tổ hợp chế độ bị đánh dấu là không ổn định trong tài liệu.

Tăng buffer lên rất lớn có hết giật không?

Không hẳn. Buffer lớn giúp chịu được ngắt quãng dài hơn nhưng làm tăng độ trễ và vẫn cạn nếu WiFi chiếm radio liên tục. Cần kết hợp giảm tải WiFi và tách tác vụ sang hai nhân.

ESP32-S3 có bị vấn đề coexistence này không?

S3 cũng chỉ có một radio dùng chung cho WiFi và BLE nên vẫn có coexistence, nhưng S3 không có Bluetooth Classic nên không phát sinh trường hợp giật A2DP như bài này.

Tắt WiFi khi nghe Bluetooth có phải giải pháp chấp nhận được?

Có, nếu sản phẩm không cần mạng trong lúc nghe. Đây là cách loại bỏ hoàn toàn tranh chấp radio, thường dùng làm bước đối chứng khi chẩn đoán trước khi quyết định tối ưu sâu hơn.

Nếu bạn đang cân đối cấu hình cho một chiếc loa thông minh tự chế, tham khảo thêm linh kiện ESP32, module DAC và ampli tại Cimo.vn để chọn phương án phần cứng phù hợp với nhu cầu dùng đồng thời của mình.

#WiFi và Bluetooth cùng lúc trên ESP32
Chia sẻ bài viết
Facebook
Cimo
Cimo
Cimo - Mọi thứ bạn cần với mức giá tốt nhất

Bài viết liên quan

Tất cả danh mục
Flash Sale
Ưu đãi hôm nay
Đấu giá