Skip to content

M5StackChan (CoreS3系) で内蔵スピーカーの出力が常にノイズになる #303

Open

Description

@mu-ko36

環境

  • ボード: 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_13

cores3_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

上記を踏まえて試した対策(いずれも解決せず)

  1. spk_cfg.pin_mck = GPIO_NUM_0 を設定 → 変化なし
  2. さらに mclk_multiple を I2S_MCLK_MULTIPLE_256 に変更(ライブラリをローカルに
    コピーして改変)→ 「声がうっすら聞こえるがノイズに埋もれる」程度で、実用になりませんでした
  3. 上記に加えて stereo = true(工場ファームのログが channel:2 のため)→ 変化なし

なお工場ファーム動作中のシリアルログには、出力側の構成が次のように出ていました。

I2S_IF: STD Mode 1 bits:16/16 channel:2 sample_rate:24000 mask:3

おうかがいしたいこと

  1. board_M5StackChan で内蔵スピーカーを正常に鳴らすための、正しい設定をご存じでしたら教えてください
  2. 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);
}

Activity

  1. ainyan03 commented on Aug 17, 2026

    @ainyan03
    Contributor

    お待たせしました。先ほど本件の修正を含むアップデート 0.2.20 がリリースされました。更新してご確認いただけますか。

    直接の原因は 16bit PCM のサンプルペア順序が I2S HW v2 系 (CoreS3 等) で逆になっていたことで、常にノイズ化する症状と一致します (#308)。あわせて I2S 周りの堅牢化 (#310, #311) も入っています。

  2. mu-ko36 commented on Aug 17, 2026

    @mu-ko36
    Author

    0.2.20 での修正、ありがとうございます。更新して確認しました。

    ノイズは大幅に改善しました。 以前は全体が砂嵐のようなノイズに埋もれていましたが、音声らしく聞こえる状態になりました。

    ただ、断続的な途切れ(プツプツと切れる感じ)が残っており、音声としてはまだ聞き取れない状態です。

    以下を試しましたが、いずれも変化がありませんでした。

    条件 結果
    音声データをフラッシュから直読み / 一度RAMにコピーしてから再生 変化なし
    dma_buf_len 256×8 / 1024×16 変化なし
    magnification 1 / 4 / 8 変化なし
    task_priority 2 / 5 変化なし
    サンプルレート 24000 / 24255 / 22050 / 44100 変化なし

    サンプルレートについては、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

    もしハードウェア個体側の問題である可能性もあるようでしたら、切り分けの方法をご教示いただけると助かります。

  3. lovyan03 commented on Aug 17, 2026

    @lovyan03
    Collaborator

    そうしましたら、 M5Unifiedの中で、examples の中で音が出る系統のサンプルを試していただけますでしょうか。

    /examples/Basic/Speaker
    /examples/Advanced/Speaker_SD_wav_file

    ところで、 M5.Speaker自体はサンプリングレートの変換機能を持っています。
    M5.Speaker.config で指定するレートとデータのレートは一致していなくて構いません。
    playRawの引数でデータ側のサンプルレートを指定すれば、レート変換して再生されますので、
    コンフィグ側では44.1kHzや48kHzを設定しても大丈夫です。

  4. mu-ko36 commented on Sep 3, 2026

    @mu-ko36
    Author

    ご助言ありがとうございます。ご指示のサンプルを試し、切り分けを進めましたので結果を報告します。

    結論:ハードウェア起因の可能性が高いと考えています。

    試したことと結果:

    • examples/Basic/Speaker → 音は出るが激しく歪む(ガサガサ)
    • M5Unified経由で magnification=1、sample_rate=48000、DMAバッファ・タスク優先度を調整 → 改善せず
    • M5.Speaker.tone()(矩形波)/自前生成のsin波/VOICEVOX音声のplayRaw(データ24kHz・コンフィグ48kHzでレート変換)→ いずれも同様に歪む
    • M5Unifiedを介さず、ESP-IDFのI2Sを直接叩いて440Hzサイン波を出力(AW88298をI2Cで手動初期化、AW9523でアンプ電源投入)→ 同様に歪む
    • さらにAW88298のボリュームレジスタ(0x0C)を下げ、信号振幅も1/3に落として最小音量で出力 → それでも歪む

    なお 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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions