はじめに
メリークリスマス!!!!!!
こちらの記事は私が所属している研究室のアドベントカレンダーの12月25日(最終日)の記事になります。今日は12月25日のはず……(^_^;)
何を作って書こうか迷ったのですが、折角なので、今年自分が作ろうと思っていたものを作ろうと思い、ESP32マイコンを使ったBluetooth Audioレシーバーを作成しました。誰しも一度は作ろうと思ったことがあるはずです。市販のものを使えば良いじゃんという意見は受け付けません。
ということで、クリスマスですし(?)、素敵なプレゼントとして書いていこうと思います!!!!
出来上がったもの
出来上がったものの動画になります。
私が持っているEDIFIER MR4に挿してBluetooth経由で使用する事もできました。
参考記事
参考にした記事です。もうほぼここに書いてあることをするのですが、プログラムが少し違います。
用意するもの
秋月電子通商と千石電商でそれぞれ購入します。
※以下の物はもし、お持ちで無ければになります。
- ユニバーサル基板
- ピンソケット
- 3.5mmオーディオケーブル
- スピーカー
- アンプ(アンプ内蔵のスピーカーであれば、アンプは別途必要ありません)
回路図
必要なライブラリ
以下の2つのライブラリが必要となります。
両方、zip形式でダウンロードし、ライブラリをインクルードしてください。
Arduino IDEでのzip形式でライブラリをインクルードする方法はこちらを参考にしてください。
プログラム
#include "AudioTools.h"
#include "BluetoothA2DPSink.h"
I2SStream i2s;
BluetoothA2DPSink a2dp_sink(i2s);
void setup() {
auto cfg = i2s.defaultConfig(TX_MODE);
cfg.pin_bck = 26;
cfg.pin_ws = 25;
cfg.pin_data = 22;
cfg.sample_rate = 44100;
cfg.bits_per_sample = 16;
cfg.channels = 2;
i2s.begin(cfg); // I2Sを初期化
a2dp_sink.set_auto_reconnect(true);
a2dp_sink.start("BT_Audio");//BluetoothAudio名
}
void loop() {
// put your main code here, to run repeatedly:
}
こちらをボードの選択をESP32 Dev Moduleを選択して書き込みます。
そうすると、
a2dp_sink.start("BT_Audio");//BluetoothAudio名
で指定した、機器名でBluetooth Audioとして接続できる状態になります。
解説
ソースコードとハードウェアについて解説していきます。
コード
これは ESP32 用の Bluetooth A2DP オーディオレシーバー のArduinoスケッチです。
概要
スマートフォンなどからBluetoothでオーディオを受信し、I2S DACに出力するプログラムです。
使用ライブラリ
- AudioTools.h - オーディオ処理用ライブラリ
- BluetoothA2DPSink.h - A2DP(Advanced Audio Distribution Profile)受信用
コード解説
グローバル変数(4-5行目)
I2SStream i2s; // I2S出力ストリーム
BluetoothA2DPSink a2dp_sink(i2s); // Bluetoothシンク(受信側)
setup()関数(7-18行目)
| 設定項目 | 値 | 説明 |
|---|---|---|
| pin_bck | GPIO 26 | ビットクロック |
| pin_ws | GPIO 25 | ワードセレクト(LRCK) |
| pin_data | GPIO 22 | データ出力 |
| sample_rate | 44100 Hz | CD品質のサンプリングレート |
| bits_per_sample | 16bit | ビット深度 |
| channels | 2 | ステレオ |
Bluetooth設定
- set_auto_reconnect(true) - 自動再接続を有効化
- start("BT_Audio") - デバイス名「BT_Audio」でBluetooth待受開始
動作
- ESP32が「BT_Audio」という名前でBluetoothデバイスとして認識される
- スマホ等からペアリング・接続
- 音楽を再生するとI2S DAC経由でアナログ音声が出力される
接続先
PCM5102やMAX98357などのI2S DACモジュールを接続して使用します。
コード変更理由
参考にした記事で用いられているコードを私の環境で実行しようとした際に、コンパイルが通らず以下のエラーが発生しました。
error: 'i2s_pin_config_t' was not declared in this scope; did you
mean 'gpio_config_t'?
どうやら、ESP32-A2DPライブラリ v1.8.8 は、ESP-IDF v5.x に対応するためにAPIが変更されたらしく、以下の古いAPIが使えないそうです。
- i2s_pin_config_t
- i2s_config_t
- set_pin_config()
- set_i2s_config()
なので、ライブラリの作者が推奨する arduino-audio-tools ライブラリを使用する新しい書き方に変更しました。
なぜ、ESP-IDF?思った方もいると思いますが、Arduino IDEを用いてESP32のボードを開発する際は、arduino-esp32ライブラリを用いて開発しているのです。このarduino-esp32ライブラリはリリースノートを見るとわかるように、ESP-IDFをベースに作られています。
なので、このESP-IDFのバージョンの変更に伴い、古いAPIが使用できなくなっています。
I2S(Inter-IC Sound)
デジタルオーディオをIC間で転送するためのシリアル通信規格です。1986年にPhilips(現NXP)が開発しました。
3本の信号線
| 信号名 | 別名 | 役割 |
|---|---|---|
| BCK (Bit Clock) | BCLK, SCK | ビット同期用クロック |
| WS (Word Select) | LRCK, FS | 左右チャンネルの切替(L=Low, R=High) |
| SD (Serial Data) | DOUT/DIN | 実際の音声データ |
タイミング図(簡略)
BCK: __|‾|__|‾|__|‾|__|‾|__|‾|__|‾|__|‾|__|‾|__|‾|__|‾|...
WS: ________|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾|__________________|‾‾‾...
Left Channel Right Channel
SD: --<D15><D14><D13>...<D1><D0><D15><D14>...<D1><D0>--
特徴
- 同期式 - クロックに同期してデータ転送
- 低遅延 - リアルタイムオーディオ向き
- ノイズ耐性 - デジタル転送なので劣化しない
- 柔軟性 - 16/24/32bit、様々なサンプルレートに対応
ESP32での使用例
cfg.pin_bck = 26; // GPIO26 → DACのBCK端子へ
cfg.pin_ws = 25; // GPIO25 → DACのLRCK端子へ
cfg.pin_data = 22; // GPIO22 → DACのDIN端子へ
接続図
┌─────────┐ ┌─────────────┐
│ ESP32 │ │ I2S DAC │
│ │ BCK │ (PCM5102等)│
│ GPIO26 ├────────→│ BCK │
│ GPIO25 ├────────→│ LRCK │───→ アナログ
│ GPIO22 ├────────→│ DIN │ 音声出力
└─────────┘ └─────────────┘
I2Sを使う理由
| 方式 | 品質 | 用途 |
|---|---|---|
| PWM/DAC内蔵 | 低〜中 | 簡易的な音声出力 |
| I2S + 外部DAC | 高 | 高音質オーディオ |
ESP32内蔵DACは8bitですが、I2Sで外部DACを使えば16/24bit高音質を実現できます。
ESP32-DevKitC-32E採用理由
まず、最初にBluetoothで、音声等のデータを扱う場合、Bluetooth Classicに対応している必要があります。私は普段SeedStudioのXIAO ESP32シリーズのマイコンを使用しているので、ESP32S3等でやろうかなと考えていたのですが、どうやら、Bletooth Classicには非対応とのこと。色々調べていると、ESP32-DevKitC-32Eが良いとの結論になり、今回使用しました。技適も通っているので、安心して使用できますね。
おわりに
今回はESP32-DevKitC-32EとADA-6250 Adafruit PCM5102 I2S DAC(ラインレベル出力付き)を用いてBluetooth Audio レシーバーを作成しました。プログラムは、ほぼライブラリで完結するし、ハードウェア部分もADA-6250 Adafruit PCM5102 I2S DAC(ラインレベル出力付き)が便利すぎて、はんだ付けも少なく楽に作ることができました。
皆さんも是非作ってみてね。
アドベントカレンダーも本当はAWSのS3 Vectorsを使った記事を書こうと思っていたりしたのですが、作りたいもの、欲しい物を優先しちゃった(´>∀<`)ゝ
少々遅れてしまいましたが、これにて2025年のアドベントカレンダーを締めくくらせていただきます。
それでは皆様、良いお年を!!!


