3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ESP32-DevKitC-32EでBluetooth オーディオレシーバーを作ってみた

3
Posted at

はじめに

メリークリスマス!!!!!!

こちらの記事は私が所属している研究室のアドベントカレンダーの12月25日(最終日)の記事になります。今日は12月25日のはず……(^_^;)

何を作って書こうか迷ったのですが、折角なので、今年自分が作ろうと思っていたものを作ろうと思い、ESP32マイコンを使ったBluetooth Audioレシーバーを作成しました。誰しも一度は作ろうと思ったことがあるはずです。市販のものを使えば良いじゃんという意見は受け付けません。

ということで、クリスマスですし(?)、素敵なプレゼントとして書いていこうと思います!!!!

出来上がったもの

出来上がったものの動画になります。

私が持っているEDIFIER MR4に挿してBluetooth経由で使用する事もできました。

image.png

参考記事

参考にした記事です。もうほぼここに書いてあることをするのですが、プログラムが少し違います。

用意するもの

秋月電子通商と千石電商でそれぞれ購入します。

※以下の物はもし、お持ちで無ければになります。

  • ユニバーサル基板
  • ピンソケット
  • 3.5mmオーディオケーブル
  • スピーカー
  • アンプ(アンプ内蔵のスピーカーであれば、アンプは別途必要ありません)

回路図

2つのモジュールの接続方法を回路図で書きました。
bluetoothAudio.png

必要なライブラリ

以下の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を選択して書き込みます。

ESP32DevModule.png

そうすると、

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待受開始

動作

  1. ESP32が「BT_Audio」という名前でBluetoothデバイスとして認識される
  2. スマホ等からペアリング・接続
  3. 音楽を再生すると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-32EADA-6250 Adafruit PCM5102 I2S DAC(ラインレベル出力付き)を用いてBluetooth Audio レシーバーを作成しました。プログラムは、ほぼライブラリで完結するし、ハードウェア部分もADA-6250 Adafruit PCM5102 I2S DAC(ラインレベル出力付き)が便利すぎて、はんだ付けも少なく楽に作ることができました。
皆さんも是非作ってみてね。

アドベントカレンダーも本当はAWSのS3 Vectorsを使った記事を書こうと思っていたりしたのですが、作りたいもの、欲しい物を優先しちゃった(´>∀<`)ゝ

少々遅れてしまいましたが、これにて2025年のアドベントカレンダーを締めくくらせていただきます。

それでは皆様、良いお年を!!!

3
2
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
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?