Skip to content

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

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_multipleI2S_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);
}

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