1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AtomS3 に EchoBase を繋いでスピーカーが鳴らない問題を切り分けた記録です。

最終的に「ES8311 の初期化が抜けていた」ことが原因でした。

AtomS3R-AI Chatbot

こちらのキットに含まれているAtomic Echo Baseというモジュールを使ってみます。

  • ATOMS3: メインマイコン
  • Atomic Echo Base: マイクとスピーカーがついてる

という構成です。

公式のライブラリはこちら

Arduino向けのライブラリはこちらです。

まずはスピーカーを鳴らす

バイブコーディングで一気にマイクとスピーカーがなるかやってみたけどそんなにうまくいかないのでまずはスピーカーからにしました。

  • EchoBase のスピーカーがちゃんと鳴るか確認したい
  • マイク/スピーカーどちらが原因かを切り分けたい

マイクがうまく動いてるかよりはスピーカーは音がなればOKなのでまだ検証しやすいです。

最初の状態

  • I2S でスピーカーを鳴らすテストコードを用意
  • 画面ボタンを押している間だけ 1kHz トーンを鳴らす
  • 結果: 音が鳴らない

切り分けの方針

  1. スピーカー単体テストにする(マイクを切り離す)
  2. I2C デバイスが見えているか確認する
  3. 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 スキャン → コーデック初期化 が早い

次の課題

  • マイク単体テスト(入力レベル表示)
  • 元の「押している間だけ中継」に戻して動作確認

デバイスの不具合を疑ってしまうのでまずは音がなってよかった...

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?