ATOM Liteで内蔵DACとSPIFFS領域のMP3再生してみる #リテールテックハッカソン


[リテールテックハッカソン](https://protoout.connpass.com/event/280991/)中に触っていてこんな感じでできたのでメモ的に記事残しておきます。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">M5AtomのDACから直接スピーカーにMP3音源流せた！音小さい！<br><br> <a href="https://twitter.com/hashtag/m5atom?src=hash&amp;ref_src=twsrc%5Etfw">#m5atom</a> <a href="https://twitter.com/hashtag/m5stack?src=hash&amp;ref_src=twsrc%5Etfw">#m5stack</a> <a href="https://twitter.com/hashtag/%E5%91%BC%E3%81%B3%E8%BE%BC%E3%81%BF%E5%90%9B?src=hash&amp;ref_src=twsrc%5Etfw">#呼び込み君</a> <a href="https://twitter.com/hashtag/%E3%83%AA%E3%83%86%E3%83%BC%E3%83%AB%E3%83%86%E3%83%83%E3%82%AF%E3%83%8F%E3%83%83%E3%82%AB%E3%82%BD%E3%83%B3?src=hash&amp;ref_src=twsrc%5Etfw">#リテールテックハッカソン</a> <a href="https://t.co/nJW0cuXIkK">pic.twitter.com/nJW0cuXIkK</a></p>&mdash; 菅原のびすけ （プロトアウト9期募集中) (@n0bisuke) <a href="https://twitter.com/n0bisuke/status/1667365681279680513?ref_src=twsrc%5Etfw">June 10, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ぽぽぽぽぽー

## ATOM Liteとスピーカーを繋げる

M5Atom LiteのG25をスピーカーの+に接続するだけでいけました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">小さめスピーカー <a href="https://twitter.com/hashtag/%E3%83%AA%E3%83%86%E3%83%BC%E3%83%AB%E3%83%86%E3%83%83%E3%82%AF%E3%83%8F%E3%83%83%E3%82%AB%E3%82%BD%E3%83%B3?src=hash&amp;ref_src=twsrc%5Etfw">#リテールテックハッカソン</a> <a href="https://t.co/SkW0aVBVxa">pic.twitter.com/SkW0aVBVxa</a></p>&mdash; 菅原のびすけ （プロトアウト9期募集中) (@n0bisuke) <a href="https://twitter.com/n0bisuke/status/1667366571877240832?ref_src=twsrc%5Etfw">June 10, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

参考: https://rika-programming.amebaownd.com/posts/8792131/

## SPIFFS領域からMP3を読み込んで再生

ESP8266Audioのライブラリをインストールしつつ、コードは[こちらの記事](https://wak-tech.com/archives/923)のコードをまるっとそのまま使わせてもらいました。

PlatformIOで実装しています。

```main.cpp
// using libraries from https://github.com/earlephilhower/ESP8266Audio

#include <Arduino.h>
#ifdef ESP32
  #include <WiFi.h>
  #include "SPIFFS.h"
#else
  #include <ESP8266WiFi.h>
#endif
#include "AudioFileSourceSPIFFS.h"
#include "AudioFileSourceID3.h"
#include "AudioGeneratorMP3.h"
#include "AudioOutputI2SNoDAC.h"

AudioGeneratorMP3 *mp3;
AudioFileSourceSPIFFS *file;
AudioOutputI2S *out;
AudioFileSourceID3 *id3;

// Called when a metadata event occurs (i.e. an ID3 tag, an ICY block, etc.
void MDCallback(void *cbData, const char *type, bool isUnicode, const char *string)
{
  (void)cbData;
  Serial.printf("ID3 callback for: %s = '", type);

  if (isUnicode) {
    string += 2;
  }
  
  while (*string) {
    char a = *(string++);
    if (isUnicode) {
      string++;
    }
    Serial.printf("%c", a);
  }
  Serial.printf("'\n");
  Serial.flush();
}

void mp3begin(){
  file = new AudioFileSourceSPIFFS("/popopo.mp3");
  id3 = new AudioFileSourceID3(file);
  id3->RegisterMetadataCB(MDCallback, (void*)"ID3TAG");
  //out = new AudioOutputI2SNoDAC();
  out = new AudioOutputI2S(0,AudioOutputI2S::INTERNAL_DAC);
  mp3 = new AudioGeneratorMP3();
  mp3->begin(id3, out);
}

void setup(){
  WiFi.mode(WIFI_OFF); 
  Serial.begin(115200);
  delay(1000);
  SPIFFS.begin();
  Serial.printf("Sample MP3 playback begins...\n");
  mp3begin();
}

void loop(){
  if (mp3->isRunning()) {
    if (!mp3->loop()) mp3->stop();
  } else {
    Serial.printf("MP3 done\n");
    delay(1000);
    mp3begin();
  }
}
```

参考までにplatform.iniも載せておきます。

```platform.ini
[env:m5stack-atom]
platform = espressif32
board = m5stack-atom
framework = arduino
lib_deps = earlephilhower/ESP8266Audio@^1.9.7
```

## ちなみにM5Stamp Pico Mateでもいけた

M5Stamp Pico MateはDACが使えるみたいで同様にG25にスピーカーを繋ぐことで音が出ました。

PlatformIOではボードでpico32を指定してます。

ボード指定とかはありますが、先ほどのATOM Liteと同じコードで動いてくれました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/m5stamp?src=hash&amp;ref_src=twsrc%5Etfw">#m5stamp</a> からもDACで音流せた。<br><br>M5Stamp picoはいけるけどc3やs3はDACが使えない…？<a href="https://twitter.com/hashtag/%E5%91%BC%E3%81%B3%E8%BE%BC%E3%81%BF%E5%90%9B?src=hash&amp;ref_src=twsrc%5Etfw">#呼び込み君</a> <a href="https://twitter.com/hashtag/%E3%83%AA%E3%83%86%E3%83%BC%E3%83%AB%E3%83%86%E3%83%83%E3%82%AF%E3%83%8F%E3%83%83%E3%82%AB%E3%82%BD%E3%83%B3?src=hash&amp;ref_src=twsrc%5Etfw">#リテールテックハッカソン</a> <a href="https://t.co/p93oXrshQU">pic.twitter.com/p93oXrshQU</a></p>&mdash; 菅原のびすけ （プロトアウト9期募集中) (@n0bisuke) <a href="https://twitter.com/n0bisuke/status/1667393205376270337?ref_src=twsrc%5Etfw">June 10, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


```platformio.ini
[env:pico32]
platform = espressif32
board = pico32
framework = arduino
lib_deps = earlephilhower/ESP8266Audio@^1.9.7
```