Repository navigation
M5StackChan (CoreS3系) で内蔵スピーカーの出力が常にノイズになる #303
Copy link
Copy link
Open
Description
環境
- ボード: M5Stack StackChan AI Desktop Robot(
M5.getBoard()はboard_M5StackChanを返します) - M5Unified 0.2.18 / M5GFX 0.2.26
- PlatformIO(pioarduino platform-espressif32)、Arduino framework、
-std=gnu++17 - StackChan-BSP 1.1.0(※BSPを一切使わない最小構成でも同じ症状です)
症状
M5.Speaker で音を出すと、常に強いノイズが乗ります。
周波数を変えると音程は正しく変化するので信号自体は届いているのですが、
実際の音声(24kHz mono PCM)を再生すると、声がノイズに埋もれてほとんど聞き取れません。
音自体は出ているため、スピーカーの断線などではないと考えています。
切り分けとして試したこと(いずれも症状は変わりませんでした)
| 条件 | 結果 |
|---|---|
| StackChan-BSP の初期化あり / なし | 変化なし(BSPを使わなくても同症状) |
cfg.internal_mic = false |
変化なし |
| サンプルレート 8000〜96000(8種) | 音程は変わるがノイズ量は一定 |
| 音量 8〜255(6段階) | 変化なし(最小音量でも同じ質のノイズ) |
波形(正弦波 playRaw / 矩形波 tone / 実音声) |
すべて同じ |
stereo true / false |
変化なし |
dma_buf_len 256×8 / 1024×16 |
変化なし |
-DBOARD_HAS_PSRAM あり / なし |
変化なし |
| 無音時 | ノイズは出ない(再生中のみ) |
振幅・波形・サンプルレート・バッファ構成のいずれにも依存せず、
再生中だけ一定量のノイズが乗る、という挙動です。
工場ファームとの差分
工場ファームのソース(m5stack/StackChan の
firmware/main/hal/board/)を見ると、音声まわりの設定は次のようになっていました。
config.h
#define AUDIO_OUTPUT_SAMPLE_RATE 24000
#define AUDIO_I2S_GPIO_MCLK GPIO_NUM_0
#define AUDIO_I2S_GPIO_WS GPIO_NUM_33
#define AUDIO_I2S_GPIO_BCLK GPIO_NUM_34
#define AUDIO_I2S_GPIO_DOUT GPIO_NUM_13cores3_audio_codec.cc
.mclk_multiple = I2S_MCLK_MULTIPLE_256
...
aw88298_cfg.hw_gain.pa_voltage = 5.0;
aw88298_cfg.hw_gain.codec_dac_voltage = 3.3;
aw88298_cfg.hw_gain.pa_gain = 1;一方、M5Unified 側で M5.Speaker.config() をダンプすると次のようになります。
pin bck=34 ws=33 dout=13 mck=-1 i2s_port=1 rate=48000 magnification=4
BCLK / WS / DOUT は一致していますが、MCLK が出力されていません。
また Speaker_Class.cpp の該当箇所は次のようになっていました。
// Speaker_Class.cpp
i2s_config.clk_cfg.mclk_multiple = i2s_mclk_multiple_t::I2S_MCLK_MULTIPLE_128; // dummy setting上記を踏まえて試した対策(いずれも解決せず)
spk_cfg.pin_mck = GPIO_NUM_0を設定 → 変化なし- さらに
mclk_multipleをI2S_MCLK_MULTIPLE_256に変更(ライブラリをローカルに
コピーして改変)→ 「声がうっすら聞こえるがノイズに埋もれる」程度で、実用になりませんでした - 上記に加えて
stereo = true(工場ファームのログがchannel:2のため)→ 変化なし
なお工場ファーム動作中のシリアルログには、出力側の構成が次のように出ていました。
I2S_IF: STD Mode 1 bits:16/16 channel:2 sample_rate:24000 mask:3
おうかがいしたいこと
board_M5StackChanで内蔵スピーカーを正常に鳴らすための、正しい設定をご存じでしたら教えてください- AW88298 の boost 設定(
0x61)や、工場ファームでいうpa_gain/pa_voltageに相当する部分は、
StackChan では CoreS3 と変えるべきなのでしょうか
再現コード
#include <M5Unified.h>
void setup() {
auto cfg = M5.config();
cfg.internal_spk = true;
cfg.internal_mic = false;
M5.begin(cfg);
auto c = M5.Speaker.config();
c.sample_rate = 24000;
M5.Speaker.config(c);
M5.Speaker.begin();
M5.Speaker.setVolume(128);
}
void loop() {
M5.Speaker.tone(880, 500); // 強いノイズが乗る
delay(1500);
}Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels
Activity
Fix 16-bit PCM sample pair order for I2S HW v2 targets (m5stack#303)
Fix 16-bit PCM sample pair order for I2S HW v2 targets (m5stack#303)
Fix 16-bit PCM sample pair order for I2S HW v2 targets (m5stack#303)
ainyan03 commentedon Aug 17, 2026
お待たせしました。先ほど本件の修正を含むアップデート 0.2.20 がリリースされました。更新してご確認いただけますか。
直接の原因は 16bit PCM のサンプルペア順序が I2S HW v2 系 (CoreS3 等) で逆になっていたことで、常にノイズ化する症状と一致します (#308)。あわせて I2S 周りの堅牢化 (#310, #311) も入っています。
mu-ko36 commentedon Aug 17, 2026
0.2.20 での修正、ありがとうございます。更新して確認しました。
ノイズは大幅に改善しました。 以前は全体が砂嵐のようなノイズに埋もれていましたが、音声らしく聞こえる状態になりました。
ただ、断続的な途切れ(プツプツと切れる感じ)が残っており、音声としてはまだ聞き取れない状態です。
以下を試しましたが、いずれも変化がありませんでした。
dma_buf_len256×8 / 1024×16magnification1 / 4 / 8task_priority2 / 5サンプルレートについては、
Speaker_Classが AW88298 に書く値が{4,5,6,8,10,11,15,20,22,44} × 2205Hzの表から選ばれるため、24000Hz を指定するとアンプ側は 24255Hz として動作し、I2S の実出力と約1%ずれることを疑いました。
そこで表と一致する 24255 / 22050 / 44100 でも試しましたが、いずれも同様でした。
再生条件は mono 16bit PCM(約2.2秒)を
playRaw()で再生しています。環境: M5Unified 0.2.20 /
board_M5StackChan/ PlatformIO (pioarduino) / Arduino frameworkもしハードウェア個体側の問題である可能性もあるようでしたら、切り分けの方法をご教示いただけると助かります。
lovyan03 commentedon Aug 17, 2026
そうしましたら、 M5Unifiedの中で、examples の中で音が出る系統のサンプルを試していただけますでしょうか。
/examples/Basic/Speaker
/examples/Advanced/Speaker_SD_wav_file
ところで、 M5.Speaker自体はサンプリングレートの変換機能を持っています。
M5.Speaker.config で指定するレートとデータのレートは一致していなくて構いません。
playRawの引数でデータ側のサンプルレートを指定すれば、レート変換して再生されますので、
コンフィグ側では44.1kHzや48kHzを設定しても大丈夫です。
mu-ko36 commentedon Sep 3, 2026
ご助言ありがとうございます。ご指示のサンプルを試し、切り分けを進めましたので結果を報告します。
結論:ハードウェア起因の可能性が高いと考えています。
試したことと結果:
なお 4 の過程で、arduino-esp32 v3系(pioarduino)環境で legacy driver/i2s.h を使うと CONFLICT! The new i2s driver can't work along with the legacy i2s driver でクラッシュしたため、新API(driver/i2s_std.h)で実装し直しています。こちらは正常に初期化でき(戻り値すべて0)、音は出ますが歪みは変わりませんでした。
ソフトウェア側の処理を完全にバイパスした純粋なサイン波でも、また最小音量でも歪むことから、スピーカーユニットまたはその周辺の物理的な問題を疑っています。
環境:M5StackChan(CoreS3)/ PlatformIO + pioarduino(arduino-esp32 v3系)/ M5Unified 0.2.19 / M5GFX / StackChan-BSP 1.1.0