Project 29.2 DACを使用したMP3プレーヤー/SDMMC Music

前回は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接続を試してみましょう!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

金重総合研究所の主席研究員。
子供の頃から研究者を目指し、ライフワークとして日々様々な研究をしています。
経営・マネジメント・金融・DXあたりが本職です。
私を採用したい人、私と一緒に働きたい人、一緒に知識を肥やしていきたい人はぜひお声がけ下さい。

コメント

コメントする

目次