M5Stack + NODEでイヤホンから音楽再生してみた

# 0. はじめに
M5Stackとは、ESP32というマイコンを搭載したIoT開発モジュールです。
https://www.switch-science.com/catalog/3647/

ESP32の他に、ディスプレイやボタン、SDカードスロットなどが付いていて、電子工作をしたことがない人でも簡単にIoTデバイスを作れるようになっています。
このM5Stackでは元々、内蔵スピーカーから音を出すことができるのですが、そのままでは「音割れがひどい」、「イヤホンを直接接続できない」などの問題がありました。

そこで今回は、M5Stackに音声入出力機能などを追加できるNODEモジュールを使用して、イヤホンから音楽を再生できるようにしてみたいと思います。

※ なお今回が初めてのQiita投稿であるため、記事の書き方などお見苦しい点があるかもしれませんが、ご了承ください。

# 1. 環境構築
## 1-0. 機材の準備
今回使用する機材は、以下の通りです。

* [M5Stack Basic](https://www.switch-science.com/catalog/3647/)
* [SMART NODE](https://ja.aliexpress.com/store/product/M5Stack-New-NODE-Samrt-Speaker-WM8978-Audio-Development-Board-I2S-Module-with-DHT12-Sensor-MIC-IR/3226069_32949773234.html)
* PC（Windows10 64bit）
* 有線イヤホン

写真のように、M5Stackの下半分を取り外してNODEモジュールを取り付けます。
![IMG_20190324_180047_resized_20190324_060450369.jpg](https://qiita-image-store.s3.amazonaws.com/0/358474/af29f383-eebf-2695-2276-94d27699a3cf.jpeg)
![IMG_20190324_180055_resized_20190324_060450655.jpg](https://qiita-image-store.s3.amazonaws.com/0/358474/5d9c7fb6-a9b5-9232-3b43-e487d2db545e.jpeg)

M5Stackには、上記のNODE以外にも様々な対応モジュールが存在し、用途に合わせて自由に付け替えられるようになっています。

M5StackとPCは、付属のUSBケーブルで接続します。
M5StackとNODEモジュールの両方にUSBの差込口がありますが、どちらに差しても特に違いはないようです（要確認）。


## 1-1. USBドライバのインストール
M5StackとPCの間でシリアル通信を行うために、[USB to UARTドライバ](https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers)をインストールします。
今回はWindows10 (64bit) を使用するため、上記ページの「Windows 10 Universal (v10.1.6)」をダウンロードし、展開したフォルダ内にある「CP210xVCPInstaller_x64.exe」を実行しました。


## 1-2. サンプルコードのダウンロード
M5Stackでの音声再生については、Espressif Systems社が公開している[esp-adf](https://github.com/m5stack/esp-adf)というフレームワークがあったので、これを使用します。

以下のようにして、GitHubからコードをダウンロードします。
```git clone https://github.com/m5stack/esp-adf.git
```

上記の「NODE_example」フォルダ以下に、NODEモジュール用のサンプルプログラムが入っています。
「get_started/play_mp3」と「player/pipeline_http_mp3」の2つがありますが、前者はアプリに内蔵された（コンパイル時にmainフォルダからコピーされた）MP3ファイルを再生するプログラムで、後者はHTTPで送信されたMP3ファイルを再生するプログラムのようです。
今回は、より単純な前者のプログラムを使用したいと思います。


## 1-3. MicroPython環境の構築
これまで、M5Stack用のプログラムはArduinoで開発していたのですが、上記のサンプルコードはMicroPythonで書かれているため、今回はMicroPythonを使用します。

<details>
<summary>MicroPythonとは</summary>MicroPythonは通常のPython（CPython）をマイコン用に特化させたもので、文法などはPythonと同様ですが、マイコンでの使用に適さないモジュールなどが除外されています。</details>

M5StackでMicroPythonを使用する方法としては、以下の2通りがあります。

* クラウド環境（M5Cloud）で開発し、Wi-Fi通信でプログラムを送信
* オフラインで開発し、USBシリアル通信でプログラムを送信

前者はWi-Fi接続を行う必要がありますが、一度接続すればPCに物理的に接続しなくても、オンラインエディタ上でプログラムを簡単に書き換えられるというメリットがあります。
また後者の場合、Tera Termなどを使用してプログラムをM5Stackに直接転送する必要があるため、初心者にはややハードルが高いかもしれません。
そのため、今回は前者のオンライン開発を採用したいと思います。

オンラインでのMicroPython開発環境の構築方法については、[M5Cloudの公式サイト](https://github.com/m5stack/M5Cloud)や、以下のQiitaのページを参考にさせていただきました。
・[Windows ではじめるM5Stack](https://qiita.com/xzr_tw/items/3363a500b4503e424d8b)
・[M5stackでMicroPythonを使えるようにする](https://qiita.com/inachi/items/d23b9e39551836cddb09)

手順としては、M5StackでMicroPythonを使用するためのファームウェアをPCにダウンロードし、ESP32専用の書き込みツールを使用してM5Stackに書き込みます。

**しかし、ここで問題が・・・**

上記の手順でファームウェアをM5Stackに書き込んだ後、M5Stackの画面に何も表示されなくなってしまいました。
参考までに、書き込み完了時のツールの画面を載せておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/358474/0ccfdb54-f81e-321e-a365-79193cdaa5bc.png)

Tera Termを使用してブート時のログを確認したところ、以下のようなメッセージが延々と表示されていました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/358474/0e9ab6a8-006f-c35a-c361-23d7484b7f70.png)

オフライン版のファームウェア(m5stack-xx)や、PSRAM付きモデル用のファームウェア（m5cloud-psram-xx）も試してみましたが、同様に画面表示されませんでした。
また、USB to UARTドライバのバージョンが原因ではないかと思い、Windows 7/8/8.1用のドライバを入れ直して再度試してみましたが、ダメでした。

Arduinoのプログラムを書き込んでみると、正常に画面表示されるようになるので、ハード的に壊れたわけではないと思うのですが・・

どなたか原因など分かる方がいましたら、コメントいただけると大変助かります。

# 2. まとめ
ということで、今回はM5StackとNODEモジュールを使用してイヤホンからの音楽再生を試みましたが、MicroPythonの環境構築がうまくいかず、行き詰ってしまいました。
引き続き、原因調査していきたいと思います。