ESP32でBluetooth/AirPlayスピーカーを作る
この前、ちとNoteっぽくない事を書いてしまった(移動済み)ので、ちょっと口直しに別の事を書こうと思ったのですが、3Dプリンタは今、おやすみ中なので、最近ハマっていたESP32について少し。
はじめに
以前はやっていたラズパイ・オーディオ。僕もVolumioを持っていてメインに使っていました。しかし、この数年、海外のサイトを見てみると、どうもラズパイより小さいESP32で同じようなことをするのがはやっているようです。
ESP32は切手大のWIFI付CPUモジュールで、最近のIOTデバイス、例えばスマートプラグなどに使われている物です。この小さいESP32にストリーミング音楽サーバーのsqueezeliteを移植した squeezelite-esp32 が今回作った物です。
これは基本的にはLogitech Media Server という音楽ストリームを扱う物ですが、色々拡張されていて、現在ではBluetooth、AirPlay、Spotify Connectの接続もできるようになっています。今回私はBluetoothを少し試してみたぐらいで、ほとんどAirPlayで使っています。
ESP32には色々なヴァリエーションがありますが、Squeezelite-esp32ではちょっと大きめのRAMの容量が必要で、外部RAM(PSRAM)が4Mb以上なければいけないようです。たまたま手元に秋月電子のESP32-WROVER-Eピッチ変換キット (¥560)というものがあったのですが、それなら8MbのPSRAMが載っているので大丈夫そうです。
DACにVolumioと同じPCM5102Aを使用
その他にもDACも必要ですが、これはAliExpressで探した所、以前Volumioで使った、まあまあ音も良いと言われていた PCM5102A というDACの安いモジュールが、4〜500円ぐらいで手に入るので買ってみました。
このDACモジュール、ちょっと使う時に注意が必要で、買ってきたままだと使えません。前後にある5箇所のパッドをハンダでショートさせなければいけません。詳しくはこの Stack Overflow をみてもらえると分かると思います。簡単に言うと、表の1つはショート。裏の4つは、H3LだけH側にショートで、あとは全部L側です。(ちなみに回路図は、このmacsbug さんの記事に載っています)
そしてこのDACとESP32をI2Sで接続するのですが、これは適当なGPIOをDAC側の3入力に入れてあげます。RCK(ステレオ左右の選択)、DIN(データ)、BCK(クロック)の3つです。(SCK=システムクロックは表のパッドをショートさせたので必要ない)
もうこれだけで最低必要な配線は終わりです。(あっ、電源はESP32に3.3V、DACに5Vが必要です)
自分の場合には、これ以外に、アンプの電源も自動的にON/OFFしたかったので、別のGPIOからの線を手元にあったリレーのモジュールに繋げて、100V電源をON/OFFさせています。
ちなみに下の写真ではリレーではなく小さなディスプレイを繋いでいますが、これを付けると処理が遅くなるのか、音が時々途切れるようになったので外してしまいました。(もしかしたら設定を間違えた?かもしれない)
ファームウエアのコンパイル(必要なかった)
ファームウエア、Squeezelite-esp32のコンパイルは正攻法で、このgitリポジトリをcloneしてきて、ESP32の開発環境ESP-IDFでコンパイルしています。(git のsubmoduleを使っているので、clone時に--recursiveを付けるのをお忘れなく)
で、パソコンにUSBシリアルケーブルを繋いで、ESP32をプログラムします。リポジトリ内に flash_cmd.txt と言うファイルがあって、そこにコマンドが書いてありました。
しかし!後からこんな面倒な事をしなくても、もっと簡単にできる事に気づいてしまいました。なんと squeezelite-esp32-installer と言うWebページから、直接USBシリアルを介してコンパイル済みのSqueezelite-esp32をESP32にプログラムできるそうです。つまりUSBシリアルに繋いだESP32さえあれば、ブラウザだけでファームウエアを流し込めるのです。(Web-Serialと言うブラウザの機能を使っているらしい)電子工作の世界も進化しているようですね。
ファームウエアが焼けたらもう立ち上げて大丈夫です。電源をいれると(よくあるWIFI-IOTデバイスのように)仮のWIFIネットを立ち上げるので、パソコンからそれに繋いで、ドキュメントに書いてある192.168.4.1にブラウザでアクセスします。すると近くのWIFIの一覧が出てくるので自分のWIFIに接続すればWIFI設定は終わりです。(割り振られたIPアドレスを控えておくのをお忘れなく。)
もう一度リブートして自分のWIFIネットに繋がったら、またブラウザでアクセスします。ここで色々とSqueezelite-esp32の機能を設定できるのですが、DACとの接続GPIOの設定をしなければなりません。残念な事にこのDACとの接続は標準のページにはなく、NVS Editor(低レベル設定UI?)と言うページから設定しなければなりません。このページは最初は表示されておらず、Creditページから有効化します。
NVS Editorにはたくさんの項目がありますが、DACとのI2S接続は dac_config と言う設定をします。ちなみに私はこの設定をコンパイル時にしてしまったので、ここからしていないのですが、もしするならこんな感じになると思います。
bck : BCK(クロック)に繋いだGPIO番号
ws:RCK(ステレオ左右の選択)に繋いだGPIO番号
do:DIN(データ)に繋いだGPIO番号
ちなみに、アンプのON/OFFをするなら、以下のような設定をします。(GPIO26の場合)
あとは、DACの出力をアンプ・スピーカーに繋ぐだけです。これで、BluetoothやAirplayで音を鳴らせるようになりました。
終わりに
いやはや、切手大のIOTモジュールでWIFIスピーカーができるなんて素晴らしいですね。部品代も全部で2000円弱くらいでラズパイよりも格安でした。音もVolumioの時と遜色なく綺麗に鳴っています。
もうこのぐらいの価格(量産したら原価 数百円?)なら、AirPlayのマルチスピーカー対応機能で左右のスピーカー1つずつにつけても良いぐらいです。なんなら部屋のすべてのスピーカーを全部WIFIで鳴らしても良いかもしれません。
一つ将来的にやってみたいのは、Squeezelite-esp32以外にもある別のESP32音楽ストリーム再生クライアントで、Snapcast client for ESP32 と言うものがあるようです。これはSnapcastと言うマルチスピーカー対応ストリームサーバーのESP32クライアントです。Airplayなどは対応していないようですが、SnapcastはすでにVolumioに入っているので、うちもで使えそうです。
それにこれ、実はESP32をDSPに見立ててフィルタを実現できるのですが、READMEによると Bi-amp と言う種類が書いてあります。音楽スピーカーには大抵、低音ウーハーと高音ツイーターの2つのスピーカー・ユニットが付いていますが、高級なスピーカーはこの2つを別回路・別アンプ(Bi-amp)に繋いで互いの影響を避ける設計なのですよね。それがESP32で簡単・安価に実現できるなんて素晴らしいじゃないでしょうか?