ESP32-S3 + PCM5102A で MP3 再生|I2S 配線 + Arduino コード完全ガイド

ESP32-S3 と PCM5102A DAC モジュールを I2S で接続し、ESP32-audioI2S ライブラリで Wi-Fi 経由の MP3 ストリーミング再生を実現。配線 10 本以内、コード 50 行以内で初心者でも簡単に導入できます。

ESP32-S3 + PCM5102A で MP3 を再生する完全チュートリアル(I2S 配線 + Arduino コード)

一言まとめ: ESP32-S3 開発ボードと PCM5102A DAC モジュールを I2S で接続し、ESP32-audioI2S ライブラリを使って Wi-Fi 経由で MP3 をストリーミング再生。配線は 10 本以内、コードは 50 行以内で、初心者でもすぐに始められます。


TL;DR(クイックスタート)

長い説明はいらない方はこちらだけ:

  1. ESP32-S3 の GPIO17(BCK)、GPIO16(LCK)、GPIO15(DIN)をそれぞれ PCM5102A の BCK、LCK、DIN に接続
  2. PCM5102A の XMT ピンを 3.3V に接続(または GPIO7 でコードから HIGH に設定)。それ以外の制御ピン(FMT/SCL/DMP/FLT)はすべて GND へ
  3. Arduino ライブラリをインストール:ESP32-audioI2S(by schreibfaul1)
  4. 下記のコードをコピーして、Wi-Fi の SSID とパスワードを書き換え、書き込めば完了

ESP32-S3 + PCM5102A は、DIY オーディオプロジェクトの中でもコストパフォーマンスに優れた組み合わせの一つです。ESP32-S3 が Wi-Fi 接続、MP3 取得、オーディオストリームのデコードを担当し、PCM5102A がデジタル信号をアナログオーディオに変換します(注意:純粋な DAC 出力でアンプは内蔵していません。スピーカーを接続するには外部アンプモジュールが必要です)。全体で数百円程度のコストながら、同価格帯の製品を大きく上回る音質が得られます。

本記事の配線とコードはすべて実機テスト済みです。手順通りに進めれば、同じ結果が得られます。


最終効果

ESP32-S3 の電源を入れると、自動的に Wi-Fi に接続し、ネットワークから MP3 オーディオストリームを取得して PCM5102A でデコード・出力します。イヤホンや外部アンプ+スピーカーから音が流れます。タッチパネルもボタンも不要、電源を入れるだけで再生が始まります。



PCM5102A オーディオモジュール紹介

PCM5102A とは?

PCM5102A は、Texas Instruments 製の高性能ステレオ DAC チップ(デジタル-アナログ変換器)です。

ESP32-S3 が出力するのは デジタルオーディオ信号(I2S フォーマットの 0 と 1)ですが、アンプやイヤホンなどのオーディオ機器はデジタル信号を理解できません。理解できるのは アナログ電圧信号(時間とともに変化する波形)だけです。PCM5102A はこの両者の間の「通訳」として機能し、デジタル信号をリアルタイムでオーディオ機器が理解できるアナログ信号に変換します。

PCM5102A 主なスペック

パラメータ仕様
インターフェースI2S(ESP32 とネイティブ互換)
対応サンプルレート8kHz ~ 384kHz
ダイナミックレンジ112dB(繊細な音質、極めて低いノイズフロア)
動作電圧3.3V 単一電源(ESP32 と完全マッチ)
MCLK内蔵 PLL、外部マスタクロック不要
出力差動ラインレベル出力(アンプなし、スピーカーを直接駆動できません)

なぜ PCM5102A を選ぶのか? 安い、使いやすい、3.3V で直接駆動、外部クロック不要、ダイナミックレンジ 112dB はマイコンオーディオとしては非常に優秀 — ESP32 プロジェクトで最も一般的な I2S DAC パートナーです。

⚠️ 重要:PCM5102A は純粋な DAC モジュールで、アンプは内蔵されていません!

PCM5102A はデジタル信号をアナログ信号(Line Level)に変換するだけです。増幅機能は一切ありません。

  • スピーカーを直接接続しないでください:スピーカーのインピーダンスは低く(通常 4Ω~8Ω)、PCM5102A の出力電流では駆動できず、直接接続するとモジュールが焼損します。
  • イヤホンの接続にもリスクがあります:多くのイヤホンのインピーダンスは低く(16Ω~32Ω)、PCM5102A のラインレベル出力はイヤホン駆動用に設計されていないため、長時間使用するとモジュールが損傷する可能性があります。高インピーダンスイヤホン(≥250Ω)はリスクが低いですが、推奨されません。
  • 正しい方法:スピーカーを接続する場合は、PCM5102A とスピーカーの間にアンプモジュール(PAM8403、MAX98357、TPA2016 など)を追加してください。テスト目的の場合は高インピーダンスイヤホンを使用し、音量を低く抑えてください。

PCM5102A ピン機能説明

ピンラベル機能ESP32-S3 接続備考
3.3Vロジック電源(3.3V)ESP32 3.3V に接続必須
GNDグラウンドESP32 GND に接続必須 — グラウンド共有が重要
BCKI2S ビットクロックGPIO17 に接続コア I2S 信号
LCKI2S 左右チャンネルクロック(LRCK/WS)GPIO16 に接続コア I2S 信号
DINI2S オーディオデータ入力GPIO15 に接続コア I2S 信号
XMTソフトミュート制御(HIGH = 通常出力)3.3V または GPIO7必ず HIGH にすること。そうしないと音が出ません
FMTオーディオフォーマット選択(LOW = I2S)GND に接続GND に落とすだけで OK
SCLシステムマスタクロック(内蔵 PLL で代替可能)GND に接続GND に落とすだけで OK
DMPディエンファシス制御GND に接続GND に落とすだけで OK
FLTデジタルフィルターモードGND に接続GND に落とすだけで OK

覚えておくべきルール: FMT、SCL、DMP、FLT の4つの制御ピンはすべて GND に接続。シンプル、安定、間違いなし。


必要部品(BOM)

部品数量備考
ESP32-S3 開発ボード× 1任意の ESP32-S3 DevKit で可
PCM5102A オーディオモジュール× 1オンラインで購入可能、約 200~300 円
ジャンパーワイヤー(Dupont ワイヤー)適量オス-オス / オス-メス 開発ボードに応じて
高インピーダンスイヤホン× 1テスト用、≥64Ω 推奨;低インピーダンスイヤホンやスピーカーには外部アンプモジュール(PAM8403 など)が必要

ESP32-S3 と PCM5102A の配線

配線はこの実験で最も間違いやすい部分です。配線が終わったら、表と一つずつ照合することをお勧めします — トラブルシューティングの時間を 80% 削減できます。

ESP32-S3 GPIOPCM5102A ピン機能説明
3.3V3.3Vロジック電源
GNDGNDグラウンド(必ず共通に!)
GPIO 17BCKI2S ビットクロック
GPIO 16LCKI2S 左右チャンネルクロック(LRCK/WS)
GPIO 15DINI2S オーディオデータ入力
GPIO 7XMTソフトミュート制御(コードで HIGH に設定。または 3.3V に直接接続)
GNDFMT / SCL / DMP / FLTフォーマットおよび制御ピン(すべて GND へ)

必要な Arduino ライブラリ

Arduino IDE のライブラリマネージャーで検索してインストール:

ESP32-audioI2S(作者:schreibfaul1)

見つからない場合は、GitHub から ZIP をダウンロードして手動インストール:https://github.com/schreibfaul1/ESP32-audioI2S


完全な Arduino コード(テスト済み)

以下のコードは ESP32-S3 + PCM5102A でテスト済みです。コピーして、Wi-Fi 情報を書き換え、アップロードするだけ:

// 他の実験は www.lingflux.com をご覧ください

#include <Arduino.h>
#include <WiFi.h>
#include <Audio.h>

// ── Wi-Fi 設定(ご自身の環境に変更してください)──────────────
const char* ssid     = "あなたのWiFiSSID";
const char* password = "あなたのWiFiパスワード";

// ── I2S ピン定義 ─────────────────────────────────────────
#define I2S_BCLK  17   // BCK:ビットクロック
#define I2S_LRCK  16   // LCK:左右チャンネルクロック
#define I2S_DOUT  15   // DIN:オーディオデータ
#define XMT        7   // XMT:ソフトミュート制御(HIGH = 通常出力)

Audio audio;

void setup() {
  Serial.begin(115200);

  // 手順1:XMT を HIGH にして PCM5102A のミュートを解除
  pinMode(XMT, OUTPUT);
  digitalWrite(XMT, HIGH);

  // 手順2:Wi-Fi に接続
  WiFi.begin(ssid, password);
  Serial.print("Wi-Fi に接続中");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWi-Fi 接続成功!");

  // 手順3:I2S ピンと音量を設定
  audio.setPinout(I2S_BCLK, I2S_LRCK, I2S_DOUT);
  audio.setVolume(12);  // 音量範囲 0~21、10 程度から徐々に上げることを推奨。イヤホンやモジュールの損傷を防ぐため

  // 手順4:オンライン MP3 を再生
  audio.connecttohost("https://pixabay.com/music/download/id-219731.mp3");
  Serial.println("オーディオ再生を開始...");
}

void loop() {
  // 継続的に呼び出して、オーディオデコードと再生を維持(省略不可!)
  audio.loop();
}

// デバッグコールバック:ライブラリの動作状況を出力(トラブルシューティングに便利)
void audio_info(const char *info) {
  Serial.print("Audio Info: ");
  Serial.println(info);
}

コードの説明:

  • audio.setVolume(12):音量範囲は 0~21。10 程度から徐々に上げることを推奨します。音量を上げすぎると PCM5102A の出力電流が増加し、イヤホン接続時にモジュールが損傷するリスクがあります。
  • connecttohost():HTTP/HTTPS の直接 MP3 リンクに対応。URL が期限切れになったら別のものに差し替えるだけ。
  • audio.loop()loop() 内で継続的に呼び出す必要があります。オーディオストリームのデコードと出力を維持します。削除しないでください。また、重い処理を追加すると音切れの原因になります。

よくある質問とトラブルシューティング(FAQ)

Q:配線して電源を入れたのに音が全く出ない。どう排查すればいい?

初心者が最もよく遭遇する問題です。以下の順序で確認すれば、90% のケースで解決します:

① グラウンドの共有を確認 ESP32-S3 と PCM5102A の GND は必ずジャンパーワイヤーで接続してください。グラウンドが共有されていないと、信号の回路が完成せず、一切の音が出ません。これが初心者が最も見落としやすいポイントです。

② I2S ピンの配線ミスを確認 BCK、LCK、DIN の 3 本の線は、1 本でも間違えると完全に無音または継続的なノイズになります。以下の表で再確認してください:

ESP32-S3 GPIOPCM5102A ピン
GPIO 17BCK
GPIO 16LCK
GPIO 15DIN

③ XMT が HIGH になっているか確認 XMT は PCM5102A のソフトミュート制御ピンです。LOW = ミュート、HIGH = 通常再生。HIGH にするのを忘れると、チップはずっとミュート状態になります。解決方法:コードに digitalWrite(7, HIGH) を追加するか、XMT を直接 3.3V に接続してください。


Q:再生中に「カチカチ」や「ポンポン」というノイズが聞こえる。原因は?

これは ESP32 オーディオプロジェクトで最も議論される問題の一つです。複数の原因が考えられるため、一つずつ排查する必要があります。可能性が高い順に並べています:

原因1:I2S バッファアンダーラン(最も可能性が高い)

ESP32 が MP3 をデコードしたり、ネットワーク/SD カードからデータを読み取る際、CPU 負荷が急増したり、バッファが小さすぎたり、デコード速度が I2S 出力レートに追いつかないと、一時的なデータ途切れが発生します。PCM5102A が連続したクロックを受信しているのにデータラインが一時的にゼロになると、再現性のあるノイズが発生します。ノイズが常に曲の同じ位置で出る場合、ほぼこの原因と断定できます。

解決方法:i2s_configdma_buf_count(8~16 を推奨)と dma_buf_len(256~1024 を推奨)を増やしてください。xTaskCreate を使っている場合は、オーディオタスクの優先度を Wi-Fi や他のバックグラウンドタスクより高く設定してください。ESP32-audioI2S ライブラリを使用する場合は、ライブラリ内のバッファサイズ設定を確認して大きくしてください。

原因2:サンプルレートまたはビット深度の不一致

オーディオファイルのサンプルレート(44.1kHz / 48kHz)が ESP32 の I2S 設定と一致していない場合、または 24bit と 16bit が混在している場合に発生しやすいです。

解決方法:すべてのオーディオファイルを 44.1kHz、16bit、ステレオに統一変換してください(ffmpeg で一括処理可能)。I2S 設定で bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT を明示的に設定してください。PCM5102A モジュールの SCK/FLT/DEMP/FMT ピンがすべて GND に接続されていることを確認し、内部 PLL モードを有効にしてください。

原因3:ハードウェア信号の完全性の問題

I2S 配線が長すぎたり、直列ダンピング抵抗がない場合、信号のエッジにリンギングが発生し、カチッというノイズの原因になります。ESP32 の Wi-Fi/CPU アクティビティが共有の 3.3V 電源を通じてノイズを注入することもあります。

解決方法:BCK、LCK、DIN の 3 本の信号ラインにそれぞれ 33~100Ω の直列抵抗を追加してください(ESP32 側の近くに配置)。PCM5102A に専用の 10μF + 0.1μF デカップリングコンデンサを追加するか、独立した LDO で給電してください。配線はできるだけ短くし、ESP32 の Wi-Fi アンテナ領域から離してください。

原因4:PCM5102A 内部オートミュートのトリガー

DIN データが一時的にゼロまたは Low レベルになると、チップ内部のスマートミュートロジックがトリガーされ、微かなポップノイズが発生します。無音部分や低音量部分で特に顕著です。

解決方法:再生開始/終了時やバッファが空のときに、ソフトウェアでフェードイン/フェードアウトのトランジションを挿入してください。I2S に純粋なゼロデータを送信するのを避け、極小振幅のサイレントフレームを代わりに送信してください。

クイック診断手順: まず標準 WAV ファイル(44.1kHz 16bit)でテストし、MP3 デコードをバイパスしてください。同じ位置でノイズが出る場合は、バッファ関連の可能性が高いです。その後、MP3 デコードとネットワークストリーミングを段階的に追加して、問題の範囲を絞り込んでください。


Q:オンライン再生が途切れたり中断される。どうすればいい?

オンライン再生はネットワーク品質に依存します。電波が弱い、または帯域が不安定な場合に途切れやすくなります。まず別の高速な MP3 ダイレクトリンクで試してください。ネットワーク自体に問題がない場合は、SD カードや SPIFFS からローカルオーディオファイルを読み取るように変更することで、ネットワーク要因を完全に排除できます。


Q:ESP32-S3 の I2S ピンを別の GPIO に変更できる?

はい。ESP32-S3 の I2S ペリフェラルは任意の GPIO へのマッピングをサポートしています。コード内の #define I2S_BCLKI2S_LRCKI2S_DOUT の値を変更するだけで済みます。固定ピンに縛られることはありません。


Q:PCM5102A はどのサンプルレートに対応している?

PCM5102A は 8kHz、16kHz、32kHz、44.1kHz、48kHz、96kHz、192kHz、384kHz に対応しており、日常的な MP3(通常 44.1kHz)の再生ニーズを完全にカバーしています。


Q:PCM5102A は 5V で駆動できる?

オンボード LDO 搭載の一部 PCM5102A モジュールは 5V 入力に対応しており、内部で 3.3V に降圧されます。モジュールに 3.3V ピンしかない(5V ピンがない)場合は、3.3V で駆動してください。安定性と ESP32-S3 とのロジックレベル互換性の観点から、3.3V 給電をお勧めします。


Q:ESP32-S3 で MP3 を再生する際、CPU 使用率は高い?

ESP32-audioI2S ライブラリは ESP32-S3 のデュアルコアアーキテクチャを活用し、オーディオデコードタスクを独立したコアで実行するため、メインループへの影響は最小限です。通常の使用では CPU 使用率は 10%~30% の範囲で、他の並行タスクに影響を与えることはありません。


Q:オーディオ再生と TFT ディスプレイの駆動を同時に行える?

はい。ESP32-S3 のパフォーマンスは I2S オーディオ出力と SPI TFT 表示の同時処理に十分です。ただし、loop() 内で長時間ブロックする操作を行わないように注意してください。audio.loop() の呼び出し頻度に影響し、音切れやノイズの原因になります。


Q:PCM5102A の出力にスピーカーやイヤホンを直接接続できますか?

スピーカーは直接接続しないでください。イヤホンの接続にも注意が必要です。 PCM5102A は純粋な DAC モジュールで、出力はラインレベル(Line Level)であり、増幅機能がありません。スピーカー(4Ω~8Ω)を直接接続すると、過電流によりモジュールが焼損します。低インピーダンスイヤホン(16Ω~32Ω)も長時間使用すると損傷のリスクがあります。

スピーカーを接続する場合は、PCM5102A の出力にアンプモジュールを追加してください。推奨:PAM8403(3W×2、安価で使いやすい)、MAX98357(I2S 直接入力、内蔵 DAC で PCM5102A の代替可能)、TPA2016(2W×2、AGC 搭載)。テスト時は高インピーダンスイヤホン(≥64Ω)を使用し、音量を低く抑えてください。


Q:ESP32-S3 と通常の ESP32 の I2S オーディオにおける違いは?

ESP32-S3 の動作周波数(240MHz デュアルコア)は初期の ESP32 よりも高く、MP3 などのフォーマットのデコードがよりスムーズで、ドロップフレームやノイズの発生確率が低くなります。また、GPIO リソースも豊富で、オーディオ、ディスプレイ、ネットワークを同時に扱う複合プロジェクトに適しています。


参考資料


他の ESP32 実験やチュートリアルは www.lingflux.com をご覧ください