Bluetooth レシーバの自作

Bluetooth レシーバを自作してみた。

自作と言っても、マイコンボード(ESP32-WROOM-32E)のプログラムを流し込んだのと、DAC基板を接続しただけ。

はじめに

自分はいわゆるBluetoothスピーカーを持っていない。

だからipod touch 256GBをスピーカーで鳴らしたい場合は、今まではイヤホン・ジャックにケーブルを接続するしかなかった。

(レコード生活のためのグッズFOSTEX アクティブ・サブウーハー PM-SUBmini2にあるように、自分はオーディオ・アンプの環境は整えてあるので、プリアンプにさえ接続できれば良い。)

それはそれで悪いことはないが、曲を替えたい時は椅子から立ち上がる必要があるのが少しばかり不便だ。 ということでBluetoothレシーバーが欲しくなってきた。

売り物はあるのだけれど、どうもピンと来るものが無い。 3000円以上のものはレビューを読むと購買意欲が減るものが多い。 (レビューを信用できるものばかりではないが、持ち上げているコメントよりはネガティブなコメントのほうが真実味が感じられる。)

じゃあ作るかとネットを調べると、どうやらESP32というマイコンが使えるらしい。 開発ボードも2,000円弱で買えるようなので、まあ試してみるかという軽い気持で始めた。

ハードウェア

動作を確認するために必要なのは以下のもの:

  • ESP32開発ボード

    自分は秋月電子通商のESP32-DevKitC-32E ESP32-WROOM-32E開発ボード 4MBを使った

    補足すると、ESP32にはI2Sインターフェース以外に8bit DACも搭載されており、外付けのDACがなくても音は出せる。だが8bitなのでオーディオ用には適切ではない。音を鳴らすテストぐらいなら良いだろう。

  • USBケーブル

    ESP32開発ボードとPCを通信させるために必要。ESP32開発ボード側はマイクロUSBなので、Androidスマホなどの充電に使うケーブルでも使えるかも知れない。

  • DAC

    自分は PCM5102のモジュール基板を使った

  • ブレッドボード

    ESP32開発ボードとDACモジュールを刺すのに使った。ESP32開発ボードの幅が広いため、普通のブレッドボードだとそのままでは片側のピンが接続できない。 ジャンパ線を駆使して使うか、幅広のブレッドボードを使う。

  • ブレッドボード用の配線

    ジャンプワイヤやジャンパー線、ピンヘッダなど

DACのPIN FUNCTION設定

今回のハマりポイントの一つ。

上記のDACモジュール基板は部品面の裏側にPIN FUNCTION設定をする必要があるらしい。 Web Radio of M5Stack PCM5102A I2S DAC | macsbugを参考にさせてもらった。

実際、これを設定しないと音が鳴らない。 上記のページにあるようにハンダづけして設定する。 この手の細かいハンダ付けは20W程度のコテ先が細いものを使うほうが良い。

PCM5102 DAC

ESP32のプログラム

今回のハマりポイントの一つ。

ESP32関係の開発環境としては、ESP-IDFArduino IDEがある。

ESP-IDFにはBluetooth audioのサンプル・プログラムがあって(ESP-IDF A2DP-SINK demo)、ESP32を使うBluetoothスピーカー関連のweb pageはこれを使った例が多い。 これらは古い記事が多く(2018年前後)、その後は見付からない。探し方が悪いせいかも知れないが。

実際、試してみると音は鳴るが、音が割れてしまっていた。直せるのだと思うが、ソースコードを追う気力はなかった。 もう一つ良さそうなものにA Simple Arduino Bluetooth Music Receiver for the ESP32があった。これもESP-IDF上でコンパイルして流しこむものだ。 しかし、最新のEPS-IDFではコンパイル時にエラーが出てしまう。

最終的に辿り着いたのがBluetooth Audio for Arduinoだ。 これはArduino IDE上のサンプルだ。

ここのminimalAudioの例で動いた。Arduino IDEではESP32 Dev Moduleを選ぶ。

(Arduino IDEのセットアップはESP32開発ボード Arduino IDE開発環境の構築 | Interface (CQ出版)を参考にした。これを書いている時点でバージョンは2.0.4。)

ただし、ipod側のボリュームを上げすぎると歪む。

サンプルではwsを27にしてあるが、a2dp-sinkの例と同じように22に変更している。

int bck = 26; 
int ws = 22;
int dout = 25;

DACとの配線

ESP32-DevKitC-32EとPCM5102モジュールの接続は以下のテーブルの通り。

SCKはGNDに接続しないと音が鳴らない。

ESP32-DevKitC-32EPCM5102 DAC module
GNDSCK
26BCK
25DIN
22LCK
GNDGND
5VVIN

(PCM5102 DACの給電は3.3Vと書いてあるページが多いが、Web Radio of M5Stack PCM5102A I2S DAC | macsbugで起こされた回路図によれば5V→3.3Vの降圧チップが搭載されており、5Vで給電するのが正しいと思われる。ただし、3.3Vで給電しても音は出るし違いは分からなかった。)

PCM5102 DACのジャックにヘッドフォンを刺せば音が出る。

ipodのボリュームは効くし、ボリュームを適切に調節すれば歪むことはない。

5V給電

実用に向けては、5VをACアダプタから給電したい。

USB端子からでも良いが、頻繁な抜き差しでUSBポートと基板の接続が疲労するのも心配だ。

電源スイッチも付けたいから、なおさらACアダプタからの給電が望ましい。

試しに5VのACアダプタから給電してみた。 DCジャックからESP32-DevKitC-32Eボードの5V端子とGND端子に接続してみただけだが、これで動くことが確認できた。

おわりに

あとは適当なケースに格納すれば良い。この記事では、ひとまず動く段階でやった内容をまとめておいた。

というわけで、スマホ 充電器の自作のように、また高専などの卒論ネタを提供してしまった。自分は数回は卒業できると思う。

学校の先生は卒論やレポートの内容がどこかのパクりかどうかはチェックすることをおすすめする。