外部DAC(PCM5102A)とスピーカーで音楽再生
はじめに
ESP32に評判の良い外部DAC(PCM5102A)を接続して音楽を再生してみます。
内蔵DACに比べると雑音が減少して聞きやすくなります。
PCM5102A は、アンプ機能がないためスピーカー側にアンプ機能が必要になります。
外部DACを使用せず、内蔵DACでの音楽再生した内容についてはこちら👇
開発環境
OS : Windows 11 Pro
ESP32:ESP-WROOM-32
統合開発環境 : Arduino IDE 2.3.2
Arduino core for the ESP32:2.0.17
使用ライブラリ:ESP32-audioI2S(3.0.12)
使用パーツ
ESP32開発ボード(38Pin)
電子工作ステーション https://electronicwork.shop/items/64134541d91711003035a5a6
PCM5102A
ダイソー300円ミニスピーカー
ジャンパーワイヤー(オスーオス)
電子工作ステーション https://electronicwork.shop/items/637f92415988dc5175f8a9ec
作業内容
機能ピン設定
購入時に機能ピンが設定されていない場合は、半田ごてで設定する必要があります。
中央と左右どちらかを半田ごてを使用して接続させて機能ピンを設定します。
下表と逆になりますが、左がHigh/右がLow になります。
通常は左図のようにしておけば良いと思います。
H3Lのみ逆になります。
NAME | TERMINAL NAME | DESCRIPTION | (Low) / (High) |
H1L | FLT | Filter select | Normal latency (Low) / Low latency (High) |
H2L | DEMP | De-emphasis control for 44.1kHz sampling rate | Off (Low) / On (High) |
H3L | XMST | Soft mute control | Soft mute (Low) / soft un-mute (High) |
H4L | FMT | Audio format selection | I2S (Low) / Left justified (High) |
基盤表面のSCKピンの下にも機能ピンがあります。
ここを接続すると、SCKとGNDが接続されます。
配線でSCKとGNDを接続する場合と同じです。
配線図
PCM5102A とは GPIO 25 GPIO 26 GPIO 27 を使用して接続します。
配線図にはないですが、ダイソー300円ミニスピーカーがあったので、ステレオミニプラグで接続しています。
給電用のUSB付いているスピーカーの場合は、給電用USBもPC等に接続してください。
PCM5102A | ESP32開発ボード(38Pin) |
SCK | ー |
BCK | GPIO 27 |
DIN | GPIO 25 |
LCK | GPIO 26 |
GND | GND |
VIN | 5V |
ライブラリインストール
ESP32-audioI2S
こちらは Arduino IDE のライブラリマネージャーに対応していないため、GitHubからダウンロードして、所定の場所へ配置します。
ダウンロードしたファイルを解凍してライブラリフォルダに格納します。
スケッチ作成
#include <Audio.h>
#include <SPIFFS.h>
#define I2S_DOUT 25
#define I2S_BCLK 27
#define I2S_LRC 26
Audio audio;
void setup() {
Serial.begin(115200);
SPIFFS.begin();
audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT);
audio.setVolume(21); // default 0...21
audio.connecttoFS(SPIFFS, "/kanpai.mp3");
}
void loop()
{
audio.loop();
}
// optional
void audio_info(const char *info){
Serial.print("info "); Serial.println(info);
}
void audio_id3data(const char *info){ //id3 metadata
Serial.print("id3data ");Serial.println(info);
}
void audio_eof_mp3(const char *info){ //end of file
Serial.print("eof_mp3 ");Serial.println(info);
}
void audio_showstation(const char *info){
Serial.print("station ");Serial.println(info);
}
void audio_showstreamtitle(const char *info){
Serial.print("streamtitle ");Serial.println(info);
}
void audio_bitrate(const char *info){
Serial.print("bitrate ");Serial.println(info);
}
void audio_commercial(const char *info){ //duration in sec
Serial.print("commercial ");Serial.println(info);
}
void audio_icyurl(const char *info){ //homepage
Serial.print("icyurl ");Serial.println(info);
}
void audio_lasthost(const char *info){ //stream URL played
Serial.print("lasthost ");Serial.println(info);
}
void audio_eof_speech(const char *info){
Serial.print("eof_speech ");Serial.println(info);
}
コード説明
使用するライブラリをインクルードします。
#include <Audio.h>
#include <SPIFFS.h>
I2Sで接続するピンを決定します。
#define I2S_DOUT 25
#define I2S_BCLK 27
#define I2S_LRC 26
先ほどのピンを設定し、音量を設定しています。
audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT);
audio.setVolume(21); // default 0...21
音楽ファイル名を指定して登録しています。
audio.connecttoFS(SPIFFS, "/kanpai.mp3");
loop() の中でループ関数を呼び出すことにより、再生しています。
audio.loop();
以降の関数は、各種状態を表示するためのものです。
音楽ファイル用意
再生する音楽ファイル以下のサイトから入手しました。
https://www.ne.jp/asahi/music/myuu/wave/wave.htm
ここにある「ヴェルディ「乾杯の歌」(kanpai.mp3)」です。
このファイルを SPIFFS へアップロードしておきます。
SPIFFS へアップロードについてこちらを参考にしてください👇
動作確認
起動時に1回再生されると思います。ステレオで再生されており、音も綺麗だと思います。
おわりに
内部DACで再生させた時と比べると、雑音が少なくなりかなり聞きやすくなりました。
コメント