ESP-WROOM-32(ESP32)でWebラジオ


# はじめに

* 昨年、ESP32を購入したての時に[ESP32 Web Radio](https://github.com/MrBuddyCasino/ESP32_MP3_Decoder)を作って毎日使っている。
* AM/FMと違ってノイズが無く、PCやスマホが無くても手軽に使えてとても良い。 
* 当時、Qiitaを初めてなかったので記事が無いため、最新環境で作り直してみた。

![IMG_2878D.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/648295fb-c0c7-6db4-ea6b-257e33c3332f.jpeg)


# 用意するもの
* ESP32
* I2S ハードウェアDACボード
* アンプとスピーカ
* (5V電源)

## ESP32-WROOM-32 開発ボード
* 前回は秋月で購入できるもので組んだので、今回は別バージョン[2個セットで1600円の新型](https://www.amazon.co.jp/gp/product/B07R87Z178)を新たに購入。
 * 今回使うのは右のボード。中国語が書いてあって渋い。
 * 真ん中は昨年秋月で購入したもの。左はESP8266。
 * それぞれピンの位置や幅が異なるので、販売元の資料を見てピン配置を確認して対応すればOK。
 * （最近買った右のボードにはアンプに食わせる5V出力が無かったりする。。。）

![IMG_2503D.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/aca5c3c9-7d33-9455-3802-4e69d9b2adc5.jpeg)

## I2S ハードウェアDACボード 
* [I2S 入力DAC PCM5101A搭載32bit 384kHz DAC完成基板](https://www.amazon.co.jp/入力DAC-PCM5101A搭載32bit-384kHz-DAC完成基板-Raspberry/dp/B0779RCC2N) (Amazonで1000円くらい)
 * 入力がI2SであればOK（自分はラズパイでハイレゾ音源再生にも使えそうなのでこれにした）
* [3.5ｍｍステレオミニプラグ](http://akizukidenshi.com/catalog/g/gC-08853/) 
 * このボードからアンプに接続するためにプラグを2本線に変換する。

![IMG_2500D.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/7491495b-9686-f884-ea41-d44542e5ea31.jpeg)

(追記)

* 最近購入した左側の小さいDACボードでもいけました。Amazonで約800円。
 * [I2S PCM5102 DAC デコーダ](https://www.amazon.co.jp/gp/product/B07M96L8ZN)
* こっちの方が小さくて良さげ。
* 基板の左側のピンに接続するだけで使えます。
 * SCKはGNDに接続しておく必要があります。

![IMG_3084D.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/14538eb3-5d15-ed4d-4779-d3c7930ce216.jpeg)




## アンプとスピーカ
* 今回、アンプは上の自作した奴を使用したけど、手前の安いアンプでも何でも良い。
* 右の方がボリュームも付いてて使いやすいかも。

![IMG_2505D.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/0c2ff4c8-735d-1438-5349-b5d28246bbd5.jpeg)


# ハードウェアの接続

![IMG_2496D.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/87857ef2-ecb7-fbc0-2fd8-c44c41a78782.jpeg)

* 今回購入したESP32開発ボードには5V出力が無かったので、電源を別途確保する。
 * (秋月で買えるESP32開発ボードは5V出力があるため、DACボードの電源はそこから取れる。) 

| ESP32 | I2S DACボード | 5V電源 |
|:---------:|:-------:|:-------:|
|GPIO 22| DATA | |
|GPIO 25| LRCK | |
|GPIO 26| BICK | |
|       | MCLK | GND |
|  GND  | GND  | GND |
|       | VCC  | 5V OUT |

* 今回は実験なのでスピーカはL側だけ接続。
 * (こっちも、ESP32開発ボードに5V出力があれば、アンプの電源はそこから取れる。) 

| I2S DACボード | 5V電源 | アンプ | スピーカ |
|:------:|:-------:|:-------:|:-------:|
| L OUT |        | R IN | |
| R OUT |        | L IN | |
|       |        |  L +    | + |
|       |        |  L -    | - |
|  GND  | GND    | GND | |
|  VCC  | 5V OUT | VCC | |



* 接続例その２
 * アンプ付きのスピーカを持ってるなら、お手軽にこんな感じで接続してもOK。
 
![IMG_3082D.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/6f454209-7cee-e1a4-9ba0-994bbafd9c7b.jpeg)


# ソフトウェア環境構築

- Espressif の資料「Get Started」に沿って環境を構築する。
 - https://docs.espressif.com/projects/esp-idf/en/stable/get-started/index.html
- ざっくりこんな感じの手順。
 1. ToolChainのセットアップ
 2. GitHubからESP-IDFを入手
 3. プロジェクトのコンフィグレーションをする
 4. プロジェクトのコンパイル＆リンク
 5. ESP32にプロジェクトをアップロード(Flash)
 6. アプリの実行(モニタリング、デバッグ)

## toolchainのセットアップ
- 自分の環境はmacなのでMacOS用手引に従う。
 - https://docs.espressif.com/projects/esp-idf/en/stable/get-started/macos-setup.html
- toolchain
 - https://dl.espressif.com/dl/xtensa-esp32-elf-osx-1.22.0-80-g6c4433a-5.2.0.tar.gz
 - 上記Mac用のtoolchainを~/esp にダウンロード、解凍し、パスを張っておく。
 - 執筆時点で、ESP32 Web Radioの動作には version 5.2.0 が必要とのこと。

```
> mkdir -p ~/esp
> cd ~/esp
> tar -xzf ~/Downloads/xtensa-esp32-elf-osx-1.22.0-80-g6c4433a-5.2.0.tar.gz
> export PATH=$HOME/esp/xtensa-esp32-elf/bin:$PATH
```

## ESP-IDF のセットアップ

- GitHubからESP-IDFをゲットし、パスを張る。
 
```
> pwd
/Users/nabeshin/esp
> git clone https://github.com/espressif/esp-idf.git
> cd esp-idf/
> git submodule update --init --recursive
> ./tools/set-submodules-to-github.sh
> export IDF_PATH=/Users/nabeshin/esp/esp-idf
```

- ファームウェアの書込み等に使用するPythonパッケージを入手。

```
> python -m pip install --user -r $IDF_PATH/requirements.txt
```

# ESP32_MP3_Decoder

## GitHubからコードを入手
- ESP32 Web Radio( https://github.com/MrBuddyCasino/ESP32_MP3_Decoder )

```
> pwd
/Users/nabeshin/esp
> git clone https://github.com/MrBuddyCasino/ESP32_MP3_Decoder.git
> cd ESP32_MP3_Decoder/
> git submodule init && git submodule update
```

## ESP32_MP3_Decoderプロジェクトのコンフィグレーション

```
> pwd
/Users/nabeshin/esp/ESP32_MP3_Decoder
> make menuconfig
```

- 上記コマンドを打つと以下のコンフィグレーション画面が出てくる。

![スクリーンショット 2019-12-06 20.55.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/1a21540c-0882-908b-893b-d01b61463103.png)

ここで以下の設定を編集。


- Serial flasher config
 - ここは自分の環境に合わせる。いつもArduino IDEで接続する時のポートを指定する。
 - 自分の場合、/dev/cu.SLAB_USBtoUART に変更
 - 後段の make flash が失敗する場合、大抵この設定が間違ってる。

![スクリーンショット 2019-12-06 21.44.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/1a9a6e99-d492-b0b2-632e-b65c001b9e2f.png)


- Web Radio / Bluetooth Speaker
 - wifi configrations: 自分の環境のSSID/Passwordを入力
 - audio output: I2S DACボードを使うのでそのまま(Generic I2S) 

![スクリーンショット 2019-12-06 21.01.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/5375a987-6155-ffb9-1325-f1c685f2f585.png)

### Webラジオ局のリストファイルを編集

- /main/playlist.pls
 - Webラジオ局のリストファイルを編集したい場合はこれを編集。とりあえずそのまま。
 - お気に入りのWebラジオ局のストリーミングURLは自力で特定する必要がある。
 - (どっかにまとまった情報がないかしら・・・) 

## プロジェクトのコンパイル＆リンク

- コンパイル＆ビルド

```
> git submodule init && git submodule update
> make
```

## ESP32にプロジェクトをアップロード(Flash)
- ESP32 への書き込み

```
> make flash
```

### ESP32を書込みモードにする

```
App "mp3_decoder" version: 9f3e28f
Flashing binaries to serial port /dev/cu.SLAB_USBtoUART (app at offset 0x10000)...
esptool.py v2.9-dev
Serial port /dev/cu.SLAB_USBtoUART
Connecting........_____....._____....._____....._____.....___
```
- 上記表示から先に進まずにタイムアウトする場合、ESP32側のボタンを押して書き込みモードにさせる必要がある。
 - BOOT ボタンを押しっぱなしにした状態で、EN ボタンを１回押す。

# アプリの実行(モニタリング、デバッグ)

- シリアルモニターの立ち上げ
 - make monitor でESP-IDFのコンソールモニタを起動する。
 - 終了する場合は、 ctrl + ] 。

```
> make monitor

....(省略)

MONITOR
--- idf_monitor on /dev/cu.SLAB_USBtoUART 115200 ---
--- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
```

- Wifiに繋がり、うまくストリーミングを受信出来るとこんなログが出続ける。

```
I (25208) audio_player: Buffer fill 94%, 30230 bytes
I (26148) audio_player: Buffer fill 97%, 31257 bytes
I (27238) audio_player: Buffer fill 92%, 29728 bytes
I (28188) audio_player: Buffer fill 96%, 30786 bytes
I (29128) audio_player: Buffer fill 99%, 31815 bytes
I (30218) audio_player: Buffer fill 94%, 30360 bytes
I (31198) audio_player: Buffer fill 97%, 31283 bytes
I (32258) audio_player: Buffer fill 93%, 29798 bytes
I (33198) audio_player: Buffer fill 96%, 30879 bytes
I (34148) audio_player: Buffer fill 99%, 31914 bytes
I (35238) audio_player: Buffer fill 94%, 30392 bytes
I (36178) audio_player: Buffer fill 98%, 31472 bytes
I (37278) audio_player: Buffer fill 93%, 30046 bytes
```


<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Qiitaで記事投稿のリクエストを頂いたので、かなり前にやったESP32 Web Radio を環境構築含め、新たに入手した別の開発ボードでイチから組んでみた。<br>で、今回はあっさり完了。<br>やっぱリファレンスがあると違うわ。 <a href="https://t.co/2Dwy4Fni9d">pic.twitter.com/2Dwy4Fni9d</a></p>&mdash; Nabeshin (@desmoquattro996) <a href="https://twitter.com/desmoquattro996/status/1202979348162048002?ref_src=twsrc%5Etfw">December 6, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# 失敗例

- esptools(pythonパッケージ)がインストールできてない。

```
iMac-nabeshin:ESP32_MP3_Decoder nabeshin$ make menuconfig
mconf-idf is not required on this platform
mconf-idf is not required on this platform
The following Python requirements are not satisfied:
setuptools>=21
click>=5.0
future>=0.15.2
cryptography>=2.1.4
pyparsing>=2.0.3,<2.4.0
pyelftools>=0.22
esp-windows-curses; sys_platform == 'win32'
Please follow the instructions found in the "Set up the tools" section of ESP-IDF Getting Started Guide
```

- Wifi のパスワードを間違えた

```
I (910) wifi: received wifi event 2
I (910) wifi: connected successfully
I (1870) wifi: new:<8,0>, old:<1,0>, ap:<255,255>, sta:<8,0>, prof:1
I (1880) wifi: state: init -> auth (b0)
I (1890) wifi: state: auth -> assoc (0)
I (1910) wifi: state: assoc -> run (10)
I (5000) wifi: state: run -> init (fc0)
I (5000) wifi: new:<8,0>, old:<8,0>, ap:<255,255>, sta:<8,0>, prof:1
I (5000) wifi: new:<8,0>, old:<8,0>, ap:<255,255>, sta:<8,0>, prof:1
I (5010) wifi: received wifi event 5
I (7060) wifi: received wifi event 5
I (7190) wifi: new:<8,0>, old:<8,0>, ap:<255,255>, sta:<8,0>, prof:1
I (7190) wifi: state: init -> auth (b0)
I (7200) wifi: state: auth -> assoc (0)
I (7220) wifi: state: assoc -> run (10)
I (10320) wifi: state: run -> init (fc0)
I (10320) wifi: new:<8,0>, old:<8,0>, ap:<255,255>, sta:<8,0>, prof:1
I (10320) wifi: new:<8,0>, old:<8,0>, ap:<255,255>, sta:<8,0>, prof:1
I (10320) wifi: received wifi event 5
I (12380) wifi: received wifi event 5
```

# 基板に実装してコンパクトにしてみる。
* 見た目、まんま試作品なので、ESP32とアンプ回路を１つの基板に実装し、ボリュームを付けてみた。
* DACボードにもピンヘッダのまま挿せるようにしたので配線もスッキリした。

![IMG_2879D.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/af9d564e-4477-c6a5-1561-42d14e4fffee.jpeg)

* これをダイソーで売ってる箱にスピーカの穴をくりぬいて作ったスピーカボックスに収納。
* これで部屋の中、いつでも良い音でラジオが聞ける。

![IMG_2880D.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/517bf414-7f04-69a7-0135-4d6b2f4ccc9c.jpeg)

# 今後やりたい事
* Bluetoothスピーカモードにもなるようなので、試したい。
* これまでハードウェアDACしか成功した事がないが、ソフトウェアDACができるなら試したい。
 * 音質が下がるなら却下だが・・・
* 秋葉原で良さげなスピーカをゲットしたので、これで組んでみる。
 
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">今日秋月で買った東京コーンの8Ω10cmスピーカー。２つで500円。<br>F77G98-6の再来！？デカイけど。<br>店頭限定商品なので、重くて持って帰るのが大変だった。。。<br>後で音質テストしてみよ。 <a href="https://t.co/CxVDkG5FIH">pic.twitter.com/CxVDkG5FIH</a></p>&mdash; Nabeshin (@desmoquattro996) <a href="https://twitter.com/desmoquattro996/status/1173177666897203200?ref_src=twsrc%5Etfw">September 15, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>