手持ちのスピーカーを格安でアクティブスピーカーにする

FB友の投稿で、　WeActStudio の I2SSpeakerModuleV1 と、ESP32 の組み合わせで、格安なのに高音質なBluetooth 対応アクティブスピーカーにできるということを知ったので、制作の備忘録としてメモに残しておく。
## I2SSpeakerModuleV1 について
WeAct Studioが github で公開している I2S Speaker Module V1 という基板で、I2S 接続で入力されるデジタル音声データをステレオアナログ信号に変換するDAC（デジタルオーディオコンバータ）と、4Ω・2.8W のステレオアンプが一つになったもの。DAC＋AMPが100円玉程度の大きさに収まっているのが素晴らしい。
![IMG_1016.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16491/98a9bedf-9c81-4719-997e-d462f1e5da63.jpeg)
100円玉と比べると小さいことが判る。
　しかも、 Aliexpress では150円程度と格安で買える。
以前に登場してよく使われている I2SのDAC + AMP としては、MAX98357A搭載 I2Sオーディオモジュールというものがある（モノラルで4Ω、3.2W）。
WeAct Studio のものに使用されている PCM5100A デュアル PA は MAX98357A よりも高い音質を備えていて、価格が安いのも魅力。
## ESP32と組み合わせる
開発元の、 WeAct Studio が公開している github のサイト
https://github.com/WeActStudio/WeActStudio.I2SSpeakerModuleV1
には、Arduino 用のサンプルコード（スケッチ）が公開されている。
このため、Bluetooth が使える ESP32 WROOM02 系ならどれでも使えるようだ。手元に WeMOS D1 mini ESP32 が有ったので、それを使うことにした。
D1 mini などのESP32は、国内のネット通販では結構な値段がしますが、アリエクスプレスなどでは500円くらいで購入できるので、両方購入しても千円以内でできる。
### 配線
I2S Speaker Module（Ampと略） とESP32 との接続は、次のとおり5本だけ。

| AMP | ESP32 |
|---|:-:|
| VCC | VCC |
| GND | GND |
| BCK | IO16 |
| DIN | IO17 |
| WS | IO21 |

### 配線への注意
* ESP32側は、ピン番号ではなくて信号ピン番号なので注意
* github 内のサンプルコードとは違うピン番号を使用している
（D1 mini 側の配線がまとまる位置にしているため）
* SDとMCは配線しない
* スピーカー端子への配線は左右（L,R）、プラス、マイナスに注意

## ソースコード
配線を上記のようにしたので、github のサンプルコードを次のように変えて使用する。

```cpp:MyBTspeaker.io
#include "AudioTools.h"
#include "BluetoothA2DPSinkQueued.h"
#include "A2DPVolumeControl.h"

I2SStream i2s;
BluetoothA2DPSinkQueued a2dp_sink(i2s);

void setup() {
    auto cfg = i2s.defaultConfig();
    cfg.pin_bck = 16;
    cfg.pin_ws = 21;
    cfg.pin_data = 17;
    // cfg.pin_mck = 0;
    i2s.begin(cfg);
    a2dp_sink.set_volume(20);
    a2dp_sink.start("MyMusic");
}

void loop() {
}
```
## 開発環境
ESP32の開発環境は Arduino IDE が一般的だが、最近は VSC (Visual Studio Code) を macOS で利用した。（Aruduino IDEではライブラリーが無いエラーに悩まされた）
VSCに PlatformIO プラグインをインストールして使う。
上記のソースをコンパイルするのに必要な PlatformIO の定義ファイル
”platformis.ini" は次のとおり。必要なライブラリへのURLを記載。
```Ini
[platformio]
description = A2DP Example
default_envs = esp32dev
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
lib_deps = https://github.com/pschatzmann/ESP32-A2DP
 https://github.com/pschatzmann/arduino-audio-tools.git
build_flags = -DCORE_DEBUG_LEVEL=2
monitor_speed = 115200
monitor_filters = esp32_exception_decoder
```
## 完成したもの
手持ちのスピーカー端子が大きかったので、それに合わせてケースを 3Dプリンターで作成。それぞれの基盤は平らな部分を両面テープで固定。
（この画像は2個作ったうち、コネクターを設置して上記と異なる配線をしたもの。その後、上記の配線を直付けしてみたので、その配線をおすすめする。）

![IMG_1017.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16491/56609478-b957-4415-a49a-74702f6d21d8.jpeg)

## おまけ
だいぶ前に同様の目的で購入した Bluetooth Amp. と並べてみる。

![IMG_1018.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16491/c8140380-3e29-4edc-8a4e-91192b088577.jpeg)

右側のものは、リチウムイオン電池が付いていて、充電回路（USB端子）も付いていて良いのだが、技適マークが付いていないため、実験後は使用していない。また、Bluetooth 接続時にけたたましい音量で中国語を叫ぶのも嫌！（多分、「接続したよ！」と言っているのだろうが、音量が大きすぎ）
　左側が今回作成したもの。
 リチウムポリマー電池と制御ボードもあり、組み込むことも考えたが、USBの電源アダプターをスイッチボットのプラグミニ経由でコンセントに繋ぐと、電源のオン・オフもリモートでできるのが便利だと思った。

 ## 作ってみたくなった方へ
参考までに購入先情報を。（私が購入したもの）
* **I2S Speaker Module**　（アリエクスプレス）
https://ja.aliexpress.com/item/1005008144198547.html?gps-id=pcStoreJustForYou&scm=1007.23125.137358.0&scm_id=1007.23125.137358.0&scm-url=1007.23125.137358.0&pvid=00573d8a-52cb-425b-b905-2f77d8920b2b&_t=gps-id%3ApcStoreJustForYou%2Cscm-url%3A1007.23125.137358.0%2Cpvid%3A00573d8a-52cb-425b-b905-2f77d8920b2b%2Ctpp_buckets%3A668%232846%238111%231996&pdp_ext_f=%7B%22order%22%3A%22613%22%2C%22eval%22%3A%221%22%2C%22sceneId%22%3A%2213125%22%7D&pdp_npi=4%40dis%21JPY%21169%21152%21%21%218.50%217.65%21%40212e509017448811261888530e25dc%2112000043978266637%21rec%21JP%21700232461%21XZ&spm=a2g0o.store_pc_home.smartJustForYou_2009465800180.1005008144198547&gatewayAdapt=glo2jpn


* **WeMOS D1 mini ESP32**　（アリエクスプレス）
https://ja.aliexpress.com/item/1005006414001036.html?spm=a2g0o.order_list.order_list_main.5.5aa7585aDnomXL&gatewayAdapt=glo2jpn