前回はSDカードの保存されたMP3ファイルを再生してみました。
今回はオーディオコンバーターとアンプを使用したMP3プレーヤーを試してみましょう。
使用するオーディオコンバーターについて
外観と回路記号はこのような感じです。
まずは表面
次に裏面
回路図記号
各ピンの詳細はこちら
スピーカーインターフェース: 左チャンネルスピーカーと右チャンネルスピーカーを接続します。
- Group L (L+ / L-): 左チャンネルのスピーカーを接続します。
- Group R (R+ / R-): 右チャンネルのスピーカーを接続します。
スピーカーは、Group L または Group R のいずれかのインターフェースに接続できます。ただし、片方のインターフェースを Group L に接続したら、もう片方を Group R に接続することはできません。誤った接続を行うと、モジュールが故障する可能性があります。
ヘッドホンインターフェース: ヘッドホンを接続するためのインターフェースです。
I2S入力インターフェース: I2S対応デバイスに接続します。I2Sで伝送された音声データを、DAC(デジタル-アナログコンバーター)が扱える音声信号に変換します。
外部オーディオ入力インターフェース: 外部オーディオ機器に接続します。外部から入力された音声信号を増幅します。
電源インターフェース: 外部電源を接続します。対応する電源電圧は 3.3V~5.0Vです。
回路図
接続図
ライブラリのインストール
以下の通りにZIPファイルのライブラリをインストールしましょう。
Open arduino->Sketch->Include library-> Add .ZIP Library
インストールするライブラリは以下の通りです。
Freenove_Ultimate_Starter_Kit_for_ESP32_S3\C\Libraries\ESP32-audioI2S.zip
コード
/**********************************************************************
Filename : SDMMC Music
Description : Play music from the sd card.
Auther : www.freenove.com
Modification: 2022/10/29
**********************************************************************/
#include "Arduino.h"
#include "Audio.h"
#include "FS.h"
#include "SD_MMC.h"
#define SD_MMC_CMD 38
#define SD_MMC_CLK 39
#define SD_MMC_D0 40
#define I2S_BCLK 14
#define I2S_DOUT 13
#define I2S_LRC 12
Audio audio;
void setup() {
Serial.begin(115200);
SD_MMC.setPins(SD_MMC_CLK, SD_MMC_CMD, SD_MMC_D0);
if (!SD_MMC.begin("/sdcard", true, true, SDMMC_FREQ_DEFAULT, 5)) {
Serial.println("Card Mount Failed");
return;
}
uint8_t cardType = SD_MMC.cardType();
if (cardType == CARD_NONE) {
Serial.println("No SD_MMC card attached");
return;
}
if (cardType == CARD_MMC) {
Serial.println("MMC");
} else if (cardType == CARD_SD) {
Serial.println("SDSC");
} else if (cardType == CARD_SDHC) {
Serial.println("SDHC");
} else {
Serial.println("UNKNOWN");
}
uint64_t cardSize = SD_MMC.cardSize() / (1024 * 1024);
Serial.printf("SD_MMC Card Size: %lluMB\n", cardSize);
audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT);
audio.setVolume(12); // 0...21
audio.connecttoFS(SD_MMC, "/music/Jingle Bells.mp3");
}
void loop() {
audio.loop();
if (Serial.available()) { // put streamURL in serial monitor
audio.stopSong();
String r = Serial.readString();
r.trim();
if (r.length() > 5) audio.connecttoFS(SD_MMC, r.c_str());
log_i("free heap=%i", ESP.getFreeHeap());
}
}
// 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);
}
今回のプログラムもライブラリの使い方という感じであまりプログラミング要素はありませんね。
56行目でシリアルから文字列を読み取っていますね。シリアルモニターを使用してファイル名を送信すれば、そのファイルをコネクトして再生する、という動作ですね。
次回はいよいよIoTっぽい感じのWiFi接続を試してみましょう!
コメント