AtomS3 に EchoBase を繋いでスピーカーが鳴らない問題を切り分けた記録です。
最終的に「ES8311 の初期化が抜けていた」ことが原因でした。
AtomS3R-AI Chatbot
こちらのキットに含まれているAtomic Echo Baseというモジュールを使ってみます。
- ATOMS3: メインマイコン
- Atomic Echo Base: マイクとスピーカーがついてる
という構成です。
公式のライブラリはこちら
Arduino向けのライブラリはこちらです。
まずはスピーカーを鳴らす
バイブコーディングで一気にマイクとスピーカーがなるかやってみたけどそんなにうまくいかないのでまずはスピーカーからにしました。
- EchoBase のスピーカーがちゃんと鳴るか確認したい
- マイク/スピーカーどちらが原因かを切り分けたい
マイクがうまく動いてるかよりはスピーカーは音がなればOKなのでまだ検証しやすいです。
最初の状態
- I2S でスピーカーを鳴らすテストコードを用意
- 画面ボタンを押している間だけ 1kHz トーンを鳴らす
- 結果: 音が鳴らない
切り分けの方針
- スピーカー単体テストにする(マイクを切り離す)
- I2C デバイスが見えているか確認する
- EchoBase のオーディオコーデック(ES8311)を初期化する
実際にやったこと
1. スピーカー単体テスト
- マイク処理を外して
M5.Speaker.tone(1000, 200)だけ鳴らす - 結果: 音が鳴らない
2. I2C スキャンで状況把握
- 起動時に I2C スキャンを実行して、見えるアドレスを表示
- 表示結果: 0x18 / 0x43
I2C は生きているので、配線や電源が完全に死んでいるわけではないと判断。
3. EchoBase のコーデック初期化を追加
EchoBase は ES8311 というコーデックを使っていて、
これを初期化しないとスピーカーは鳴らない。
-
M5Atomic-EchoBaseライブラリを GitHub から追加 -
echobase.init(...)で ES8311 を初期化 - スピーカー音量を設定
この時点で 音が鳴るようになった
変更点(抜粋)
platformio.ini
lib_deps =
m5stack/M5Unified @ ^0.2.0
https://github.com/m5stack/M5Atomic-EchoBase.git
src/main.cpp(重要部分)
#include <M5EchoBase.h>
M5EchoBase echobase(I2S_NUM_0);
Wire.begin(38, 39);
echobase.init(16000, 38, 39, 7, 6, 5, 8, Wire);
echobase.setSpeakerVolume(70);
コード全て
- src/main.cpp
#include <M5Unified.h>
#include <Wire.h>
#include <M5EchoBase.h>
// --- AtomS3 + EchoBase Pin Mapping ---
// AtomS3はESP32-S3ベースのため、従来のATOM Matrix/LiteとGPIO番号が異なります。
// EchoBaseの機能に割り当てられたピンをS3用にマッピングします。
static constexpr const uint8_t PIN_I2S_BCLK = 8; // Bit Clock
static constexpr const uint8_t PIN_I2S_WS = 6; // Word Select (LRCK)
static constexpr const uint8_t PIN_I2S_DOUT = 5; // Data Out (Speaker)
static constexpr const uint8_t PIN_I2S_DIN = 7; // Data In (Mic)
static constexpr const uint8_t PIN_I2C_SDA = 38;
static constexpr const uint8_t PIN_I2C_SCL = 39;
M5EchoBase echobase(I2S_NUM_0);
void setup() {
auto cfg = M5.config();
// AtomS3の内部スピーカーを使わないように設定(EchoBaseを使うため)
// ※M5Unifiedのバージョンによっては、外部I2S設定時に自動無効化されますが念のため。
cfg.internal_spk = false;
cfg.internal_mic = false;
M5.begin(cfg);
// EchoBaseのオーディオCODEC(ES8311)初期化用I2C
Wire.begin(PIN_I2C_SDA, PIN_I2C_SCL);
// EchoBaseのES8311を初期化(公式サンプル準拠)
echobase.init(16000, PIN_I2C_SDA, PIN_I2C_SCL, PIN_I2S_DIN, PIN_I2S_WS, PIN_I2S_DOUT, PIN_I2S_BCLK, Wire);
echobase.setSpeakerVolume(70);
// --- Speaker (EchoBase NS4168) Config ---
{
auto spk_cfg = M5.Speaker.config();
spk_cfg.pin_bck = PIN_I2S_BCLK;
spk_cfg.pin_ws = PIN_I2S_WS;
spk_cfg.pin_data_out = PIN_I2S_DOUT;
spk_cfg.i2s_port = I2S_NUM_0; // S3はI2S_NUM_0推奨
spk_cfg.sample_rate = 16000; // サンプリングレート
M5.Speaker.config(spk_cfg);
}
// スピーカーの初期化開始(マイクは使わない)
M5.Speaker.begin();
// 音量設定 (0-255) ハウリング注意!
M5.Speaker.setVolume(128);
}
void loop() {
M5.update();
// 画面(ボタン)を押している間だけトーンを鳴らす
if (M5.BtnA.isHolding() || M5.BtnA.isPressed()) {
M5.Speaker.tone(1000, 200); // 1kHz, 200ms
// M5.Display.fillCircle(64, 64, 10, GREEN); // 動作中表示
} else {
M5.Speaker.stop();
// M5.Display.fillCircle(64, 64, 10, BLACK); // 停止中
}
}
- platformio.ini
[env:m5stack-atoms3]
platform = espressif32
board = m5stack-atoms3
framework = arduino
monitor_speed = 115200
lib_deps =
m5stack/M5Unified @ ^0.2.0
https://github.com/m5stack/M5Atomic-EchoBase.git
まとめ
- I2C でデバイスが見えていても、ES8311 を初期化しないとスピーカーは鳴らない
- I2C スキャンは「配線/電源が生きているか」を確認するのに有効
- 音が鳴らない時は、まず スピーカー単体テスト → I2C スキャン → コーデック初期化 が早い
次の課題
- マイク単体テスト(入力レベル表示)
- 元の「押している間だけ中継」に戻して動作確認
デバイスの不具合を疑ってしまうのでまずは音がなってよかった...