この記事は デジタル創作サークル UniProject Advent Calendar 2025 16 日目の記事です。
前書き
とある塾(某有名義塾)ではなぜかスマホを禁止にされてしまうそうです。
私は自習中にはよくBluetoothイヤホンで音楽を流しながら勉強するので、どうにかスマホを使わずに音楽を再生させようとしたやつです。
音楽プレイヤー使えよとかいうド正論はやめてください。
そして私は無線・有線信者ではありませんのでご安心してください。
本編
用意するもの
- ESP32(本体)
- SDカード(音楽保管庫)
- SDストレージボード
- 接続するやつ(GPIOケーブルとか?)
SDストレージボード以外は家にあったものを使いました。
買ったものはこれです
https://www.amazon.co.jp/dp/B083DT3LQK
SDカード関連はすべてminiSDカードに統一しています
今回使ったライブラリはSDカード関連とAudioTootlsにしています
AudioTootlsはこちらを参照
ZIPファイルからインポートできます
https://github.com/pschatzmann/arduino-audio-tools
あと適当なmp3音楽を用意します。
私は成人男性三人組の音を用意しました。
https://recochoku.jp/album/A2005698110/album
暇だったら君達も沼に入りましょう(布教)
ソースコード
#include "SPI.h"
#include "SD.h"
#include "AudioTools.h"
#include "AudioTools/Communication/A2DPStream.h"
#include "AudioTools/Disk/AudioSourceSD.h"
#include "AudioTools/AudioCodecs/CodecMP3Helix.h"
const char* startFilePath = "/music";
const char* ext = "mp3";
SPIClass spiSD(HSPI);
AudioSourceSD source(startFilePath, ext);
A2DPStream out;
MP3DecoderHelix decoder;
AudioPlayer player(source, out, decoder);
void setup() {
Serial.begin(115200);
delay(1000);
if (!spiSD.begin(14, 33, 13, 15))) {
Serial.println("SD init failed");
while (true);
}
if (!SD.begin(15, spiSD)) {
Serial.println("SD init failed");
while (true);
}
Serial.println("Setup!");
auto cfg = out.defaultConfig(TX_MODE);
cfg.name = "Redmi Buds 6 Play";
cfg.auto_reconnect = true;
if (!out.begin(cfg)) {
Serial.println("A2DPStream begin failed");
while (true);
}
Serial.println("Connecting to headphones...");
while(!out.source().is_connected()){
delay(100);
Serial.print(".");
}
Serial.println("\nConnected!");
delay(500);
player.setVolume(1);
if (!player.begin()) {
Serial.println("Player failed");
while (true);
}
player.next();
Serial.println("Playing started!");
}
void loop() {
player.copy();
}
解説
変数
#includeは結構有名なので省きます
startFilePathに関しては収容しているフォルダーです。各自/musicだったところをルートにするなりなんなりしてみてください。
extは使用している音楽の拡張子です。もしほかの音楽でm4aとかを使いたい場合はAudioCodecsの中から探していい感じに数行変更すると、使えると思います。私はめんどくさかったのでffmpegでエンコしました。
SDカード関連
今回私はSDカードHSPI接続にしています。(なんかよくなるらしいです)
PINはこんな感じです
| SDカード側の表記 | PIN |
|---|---|
| CS | 15 |
| MOSI | 13 |
| MISO | 33 |
| SCK | 14 |
| GPIO | GPIO |
| VCC | VIN |
Bluetoothに接続して配信する部分
cfgでいい感じに定義します。
cfg.nameで接続する機器の正式なBluetooth名をお書きください。
cfg.auto_reconnectは接続が解除されたら、自動接続するかどうかです。なんか用事がなければ、trueでもいいでしょう。イヤホンを一回収納したらまた起動するまでは接続しないみたいな仕組みにしてもいいかと思います。各自ここは自分の用途に合わせて書き換えてみてください
音楽を再生する部分
player.setVolume(1);はボリュームです。0~1から設定してみてください。
player.next();で音楽を再生させます。
loopのところにあるplayer.copy();で音楽をずっと流します。
終わりに
このコード作るのに普通に丸々二~三日使ってるんですよね…
A2DP自体スピーカーにされることは想定されているっぽいんですけど、Bluetooth経由で音楽を流すことを想定されてないみたいでして…
サンプルコードがなく、私もC++自体ほぼ初めて書くのでAIを使って書いていたんですけど、AI自体もなれない分野だったのかしらないですけど、全然正しいコード再生してくれなくて、自分でもうコードを書き始めたたり、しました。
意外と私はみんながやってることからちょっとしか外れてないことをよくやるから、こういう経験はめったになく、ためになりました。
初心者のころのどうやってやるんだとかを思い出せて楽しかったです。
あとSDカードの部分とかは調べても出てきて、本当に先人のありがたみをしりました。
他にも発熱とかの問題が残っていて、それをどうにかしないとなって思ってます。
基本的にはこの二つが問題点です。
ESP32が結構熱くなります、あと障害物があるとBluetoothの接続がうまくいかないみたいです。
暇なときに続きの記事を書いてみようかと思ってたり、思ってなかったりしますね。
調べて出てこない分野をやるのはきついです…
なんか解説よりも長くなってしまった感が…
こんな長々しい文章をご閲覧いただきありがとうございます。