環境
- ボード: 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
上記を踏まえて試した対策(いずれも解決せず)
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);
}
環境
M5.getBoard()はboard_M5StackChanを返します)-std=gnu++17症状
M5.Speakerで音を出すと、常に強いノイズが乗ります。周波数を変えると音程は正しく変化するので信号自体は届いているのですが、
実際の音声(24kHz mono PCM)を再生すると、声がノイズに埋もれてほとんど聞き取れません。
音自体は出ているため、スピーカーの断線などではないと考えています。
切り分けとして試したこと(いずれも症状は変わりませんでした)
cfg.internal_mic = falseplayRaw/ 矩形波tone/ 実音声)stereotrue / falsedma_buf_len256×8 / 1024×16-DBOARD_HAS_PSRAMあり / なし振幅・波形・サンプルレート・バッファ構成のいずれにも依存せず、
再生中だけ一定量のノイズが乗る、という挙動です。
工場ファームとの差分
工場ファームのソース(m5stack/StackChan の
firmware/main/hal/board/)を見ると、音声まわりの設定は次のようになっていました。config.hcores3_audio_codec.cc一方、M5Unified 側で
M5.Speaker.config()をダンプすると次のようになります。BCLK / WS / DOUT は一致していますが、MCLK が出力されていません。
また
Speaker_Class.cppの該当箇所は次のようになっていました。上記を踏まえて試した対策(いずれも解決せず)
spk_cfg.pin_mck = GPIO_NUM_0を設定 → 変化なしmclk_multipleをI2S_MCLK_MULTIPLE_256に変更(ライブラリをローカルにコピーして改変)→ 「声がうっすら聞こえるがノイズに埋もれる」程度で、実用になりませんでした
stereo = true(工場ファームのログがchannel:2のため)→ 変化なしなお工場ファーム動作中のシリアルログには、出力側の構成が次のように出ていました。
おうかがいしたいこと
board_M5StackChanで内蔵スピーカーを正常に鳴らすための、正しい設定をご存じでしたら教えてください0x61)や、工場ファームでいうpa_gain/pa_voltageに相当する部分は、StackChan では CoreS3 と変えるべきなのでしょうか
再現コード