ATOM EchoのSPIFFSを使ってMP3を再生させる（PlatformIO）


## Atom Echo

Atom Echoは3年ほど前に出たM5Atom系のスピーカーやマイク付きのモデルです。

https://www.switch-science.com/products/6347

出た当時結構トラブルが多くてあまり情報が出てない印象です。

## Atom EchoでMP3再生してみたい

SPIFFSという領域にMP3などのバイナリデータを書き込む方式があり、これを使ってMP3を再生してみようと思いました。これだと別途SDカードなどを用意せずにできそうです。

https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/storage/spiffs.html

## arduino-esp32fs-plugin

SPIFFSを使ってMP3を再生してみるコードを調べると

```SPIFFS_Test.ino
#include "FS.h"
#include "SPIFFS.h"

/* You only need to format SPIFFS the first time you run a
   test or else use the SPIFFS plugin to create a partition
   https://github.com/me-no-dev/arduino-esp32fs-plugin */
#define FORMAT_SPIFFS_IF_FAILED true

・・・省略
```

と言った感じでこちらのプラグインを使うように公式サンプルが紹介されています。

https://github.com/me-no-dev/arduino-esp32fs-plugin

## arduino-esp32fs-pluginのインストールを試してみるが

Arduino IDE v2系ではまだ使えない模様でした。

インストール手順を進めてみましたが、Arduino IDE 2系ではツールを追加できませんでした。

> https://github.com/me-no-dev/arduino-esp32fs-plugin/issues/44
> ![スクリーンショット 2023-04-27 16.40.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/012fe86a-0faf-d828-eb04-7ff872cce047.png "スクリーンショット 2023-04-27 16.40.34.png")

みんな待ち望んでいる......

このためだけにArduino IDE 1系を今更インストールするのもちょっとなぁと思ったので調べるとPlatformIOだとそのまま書き込みできる模様でした。

## PlatformIOの利用

こちらのサイトを参考にVS Codeにインストールしていきます。

https://logikara.blog/install_platform/

C++のファイルに記述してビルドする環境となっています。
多少使ったことはあったのですがVS Codeで記述できるのは本当に楽ですね。

### PlatFormIOでのプロジェクト書き込み準備

こちらはM5StampS3の記事ですが、同じような手順でプロジェクト作成からコード書き込みまでができます。

https://logikara.blog/stamps3-init/#toc10

Atom Echoに書き込みする場合は、ボードマネージャーを以下に設定してライブラリをインストールします。

- ボードマネージャー: M5Stack-ATOM

> ![スクリーンショット 2023-04-27 16.47.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/e878d6a6-be35-ecd7-f29e-b3f970c46c28.png "スクリーンショット 2023-04-27 16.47.23.png")

- ライブラリ: 
	- M5Atom
	- FastLED
	- ESP8266Audio

> ![スクリーンショット 2023-04-27 16.49.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/23f404db-9278-ca8d-ee8d-844376643117.png "スクリーンショット 2023-04-27 16.49.00.png")

`platformi.ini`というファイルに設定ファイルができてるので、成功したときの設定を載せておきます。あるあるですが、バージョンが違うと動かないこともあるので注意。

```platformi.ini
[env:m5stack-atom]
platform = espressif32
board = m5stack-atom
framework = arduino
lib_deps = 
	m5stack/M5Atom@^0.1.0
	fastled/FastLED@^3.5.0
	earlephilhower/ESP8266Audio@^1.9.7
```

### PlatformIOでのSPIFFS

プロジェクト作成などができたらSPIFFSでMP3の書き込みですが、
**特に追加プラグインなどなしでできました。便利！**

https://randomnerdtutorials.com/esp32-vs-code-platformio-spiffs/

> 参考: https://labo.mycabin.net/electronics/arduino-esp32/1268/

- 1. プロジェクトのルートにdataフォルダを作ってその中にファイルを入れる

> ![スクリーンショット 2023-04-27 16.53.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/01ea4667-40c0-27e6-ae64-b7b7945bc7f7.png "スクリーンショット 2023-04-27 16.53.43.png")

- 2. `PIOの蟻アイコン`を選択し、`Upload Filesystem Image`をクリック

> ![スクリーンショット 2023-04-27 16.55.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/49453615-c52c-de6b-197c-7db038ae6038.png "スクリーンショット 2023-04-27 16.55.36.png")

この2ステップでできちゃいます。

Atom Echo（ESP32）の内部に書き込むので、もちろんPCとAtom EchoはUSBシリアルで接続済みの必要があります。

一度この領域に書き込みをしてしまえばあとはArduino IDEなど別のツールでプログラムの書き込みをしても問題ないのでSPIFFSの書き込み部分だけPlatformIOを使うのでも良いかもしれません。

## 再生するプログラム

お馴染みLang-Shipさんのブログに同様のサンプルコードがあるのでこちらを使わせてもらいました。

https://lang-ship.com/blog/work/m5stack-atom-echo-spiffs-mp3/#toc4

popopo.mp3というのが再生させるMP3ファイル名です。

PlatformIOの場合はinoファイルではなくsrcフォルダ内のmain.cppに記載する形となります。

`out->SetGain();`の箇所で音の調整ができますが、あまり大きい音を出すとスピーカーが壊れる事象がSNSで騒がれていたので大きい音は要注意です。後発の生産ロットは改善されたのかもしれないですがいまいち把握してないです。

```main.cpp
#include <M5Atom.h>
#include "SPIFFS.h"
#include "AudioFileSourceSPIFFS.h"
#include "AudioFileSourceID3.h"
#include "AudioGeneratorMP3.h"
#include "AudioOutputI2S.h"
AudioGeneratorMP3 *mp3;
AudioFileSourceSPIFFS *file;
AudioOutputI2S *out;
AudioFileSourceID3 *id3;
#define CONFIG_I2S_BCK_PIN      19
#define CONFIG_I2S_LRCK_PIN     33
#define CONFIG_I2S_DATA_PIN     22
#define FILENAME "/popopo.mp3"

void setup(){
  M5.begin(true, false, true);
  delay(50);
  Serial.println();
  SPIFFS.begin();
  Serial.printf("MP3 playback begins...\n");
  audioLogger = &Serial;
  file = new AudioFileSourceSPIFFS(FILENAME);
  id3 = new AudioFileSourceID3(file);
  out = new AudioOutputI2S();
  out->SetPinout(CONFIG_I2S_BCK_PIN, CONFIG_I2S_LRCK_PIN, CONFIG_I2S_DATA_PIN);
  out->SetChannels(1);
  out->SetGain(0.2);
  mp3 = new AudioGeneratorMP3();
}

void loop(){
  M5.update();
  if (M5.Btn.isPressed())
  {
    if (!mp3->isRunning()) {
      Serial.println("Play");
      mp3->begin(id3, out);
    }
  }
  if (mp3->isRunning()) {
    if (!mp3->loop()){
      mp3->stop();
    }
  }
  delay(1);
}
```

ビルドと書き込みは右下の→マークです。

> ![スクリーンショット 2023-04-27 17.04.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/63e16fce-2671-c9ca-45e7-de2859c1d284.png "スクリーンショット 2023-04-27 17.04.52.png")

書き込み速度は確かにArduino IDEより速いような印象でした。

## 動作の様子

あとでツイートいれこみます。

## 所感

SPIFFSやATOM Echo、終わってみるとこんなもんかとなるのですが、情報が古いものばかりでなかなか苦労しました。。。

Atom Echo 音鳴らすだけだと味気ないので他の機能も試したいですね。