ESP-WROOM-02(ESP8266)でWebラジオ

![IMG_1298.JPG](https://qiita-image-store.s3.amazonaws.com/0/283854/5fc6d4fd-092b-71aa-f96b-c1bf6f822ba6.jpeg)
#はじめに

- 先日、ESP32を使ったWeb Radio (ESP32_MP3_DECODER)の動作に成功。
- 電源ONでサッと聴ける手軽さと、想像以上の高音質が気に入って毎日使っているが、それだとESP32で他の開発が出来ない。
- そんな時、ちょうどAmazonでESP8266の開発ボードが499円で入手出来たので、ESP8266でも同じことが出来るか試してみた。
 - https://www.amazon.co.jp/gp/product/B018ECQX6U/ref=oh_aui_detailpage_o07_s00?ie=UTF8&psc=1

#結論
- 結果的にラジオは再生できたが、後述する最小構成(SRAM追加なし/I2S DACなし)では満足出来る音質が得られなかった。
 - RAM容量の大きいESP32ではI2S DACとの組み合わせでとても良い音質が得られている。
 - 今回ESP8266ポン付けで試したが、ESP32&I2S DACに比べるとかなりノイズが酷い。
 - ESP8266でラジオをクリアなサウンドで聴きたいなら、やはりSRAMを追加し、I2S出力でハードウェアDACが必要だと思う。


#環境
- 開発環境
 - iMac
- 入手コード ESP8266_MP3_DECODER (GitHub)
 - https://github.com/espressif/ESP8266_MP3_DECODER
- ESP8266の開発環境
 - 既にESP32の環境を構築済みだったので、以下にESP8266の環境を別途構築。

```
>mkdir /Users/nabeshin/esp/esp8266local
```

- ESP8266開発環境として以下があるようだが、後述のやり方でtoolchainを取得したため、SDKは不要でesptoolのみ取得。 
 - ~~eps-open-sdk~~
 - ~~ESP_RTOS_SDK~~
 - esptool

#esptoolを入手
- ファームウェアの書込み等に使用するツールを入手します。

```
>sudo pip install esptool
```

#toolchainを入手
- ESP8266_MP3_DECODERのビルド環境は、Arduino IDEでは無いので、別途ESP8266用のtoolchainをインストール。
 - 以下のやり方を参考にMac用のtoolchainをお手軽に入手。
  - http://www.nurs.or.jp/~ogochan/essay/archives/4484
  - arduino IDEから以下を読み取ってダウンロード、展開

```
    "host":"x86_64-apple-darwin",
    "url":"http://arduino.esp8266.com/osx-xtensa-lx106-elf-gb404fb9-2.tar.gz",
    "archiveFileName":"osx-xtensa-lx106-elf-gb404fb9-2.tar.gz",
    "checksum":"SHA-256:0cf150193997bd1355e0f49d3d49711730035257bc1aee1eaaad619e56b9e4e6",
    "size":"35385382"
```

- toolchainにパスを通す。

```
>cd /Users/nabeshin/esp/esp8266local
>tar -xvf ./osx-xtensa-lx106-elf-gb404fb9-2.tar
>export PATH="/Users/nabeshin/esp/esp8266local/xtensa-lx106-elf/bin:$PATH"
```

# ESP8266_MP3_DECODER入手
- 以下のパスにgit clone

```
 /Users/nabeshin/esp/esp8266local/ESP8266_MP3_DECODER-master
```


#ESP8266_MP3_DECODERのコンフィグレーション
https://github.com/espressif/ESP8266_MP3_DECODER/blob/master/README.md
によると、

- ESP8266からI2SでDACボードに出力し、high-qualityなサウンドを出すにはRAMの追加が必要。
- 作者の推奨は、Microchip 23LC1024(SPI 1MB SRAM)を追加した上で、I2S出力すると良いとある。
- そうしない場合は、音質は下がるが、以下のコンフィグでSPI/I2SをOFFにし、GPIO3/RX0を直接アンプに出せ、となっている。
 - Running without the SPI RAM part
 - Running without the I2S DAC

手持ちのSRAM ICなんて無いので、今回は、とりあえずSPI/I2S両方OFFで行く。
この構成であれば、ESP8266から出力するピンはアンプにつなぐGPIO3とGNDの2本で済む。

- ビルドに成功すると、以下の*.binファイルでファームウェアができる。
 - これをesptool.pyの引数に指定して実行し、ESP8266に焼く。 

```
iMac-nabeshin:mp3 nabeshin$ ls -l esp8266local/ESP8266_MP3_DECODER-master/mp3/bin
total 14872
-rwxr-xr-x@ 1 nabeshin  staff     4096  8 25  2016 blank.bin
-rwxr-xr-x@ 1 nabeshin  staff     2544  8 25  2016 boot_v1.3(b3).bin
-rw-r--r--  1 nabeshin  staff  4762193  8 25 08:36 eagle.S
-rw-r--r--  1 nabeshin  staff  2532768  8 25 08:36 eagle.dump
-rw-r--r--  1 nabeshin  staff    40304  8 25 08:36 eagle.flash.bin
-rwxr-xr-x  1 nabeshin  staff   260256  8 25 08:36 eagle.irom0text.bin
-rwxr-xr-x@ 1 nabeshin  staff      128  8 25  2016 esp_init_data_default.bin
iMac-nabeshin:mp3 nabeshin$ 
```

- ビルドメッセージにesptool.pyの引数に指定するアドレスが表示されても間違ってるので無視するようにとのこと。
 - 実際は、"eagle.irom0text.bin---->0xA0000"が正解。

```
Generate eagle.flash.bin and eagle.irom0text.bin successully in folder bin.
eagle.flash.bin-------->0x00000
eagle.irom0text.bin---->0x40000
```

## 配線
- アンプの電源(Vcc 5V)は別途確保した。
 
| ESP8266 Pin | アンプ Pin |
|:---------:|:-------:|
|GPIO3/RX0|Left|
|GND|GND|



##libhal.aの追加
- 何故かリンク時にlibhal.aが無いってエラーが出るので以下から入手。
 - https://github.com/esp8266/esp8266-wiki/tree/master/libs
- ファイルは以下に配置。
 - /Users/nabeshin/esp/esp8266local/ESP8266_MP3_DECODER-master/lib

##ヘッダ修正
- 上記コンフィグレーションに従って、ユーザ定義のヘッダファイルの以下の行を書き換える。

 - NAME, PASSは自宅のWifi環境に合わせて読み替え。
 - WebラジオのストリームはAFN。
 - SPI SRAMなし --> FAKE_SPI_BUFF
 - I2S なし --> PWM_HACK
 - SPI/I2Sなし時の音質最適化 --> DELTA_SIGMA_HACK
 
> /esp8266local/ESP8266_MP3_DECODER-master/mp3/user/playerconfig.h

```


#define AP_NAME "NAME"
#define AP_PASS "PASS"

#define PLAY_SERVER "16693.live.streamtheworld.com"
#define PLAY_PATH "/AFNP_TKO.mp3"
#define PLAY_PORT 80

#define PWM_HACK
#define DELTA_SIGMA_HACK
#define FAKE_SPI_BUFF
```

# ビルド
- アプリケーションビルドディレクトリに移動

```
>cd /Users/nabeshin/esp/esp8266local/ESP8266_MP3_DECODER-master/mp3
```

- Makefileオプション修正

>vi make.sh
　・以下の行に差し替え
　・シリアルポート(/dev/cu.wchusbserialfd130)は、別途arduino IDEの設定を参照して転記。
　・esptool.pyでファーム書込みまで実行してくれる。

```
#!/bin/bash -e
make COMPILE=gcc BOOT=none APP=0 SPI_SPEED=40 SPI_MODE=QIO SPI_SIZE=1024
#${ESPTOOL} --port ${ESPPORT} --baud ${ESPBAUD} write_flash 0x00000 ../bin/eagle.flash.bin 0xA0000 ../bin/eagle.irom0text.bin
esptool.py -p /dev/cu.wchusbserialfd130 -b 115200 write_flash 0x00000 eagle.flash.bin 0xA0000 eagle.irom0text.bin
```

- コンパイル、ファームウェアの書込み
 - シリアルポートがBUSYでないこと。


```
iMac-nabeshin:mp3 nabeshin$ sh make.sh 
DEPEND: xtensa-lx106-elf-gcc -M -Os -g -Os -Wpointer-arith -Wundef -Werror -Wl,-EL -fno-inline-functions -nostdlib -mlongcalls -mtext-section-literals -DICACHE_FLASH -I include -I ../include -I ../../include -I ../../extra_include -I ../../include/lwip -I ../../include/lwip/ipv4 -I ../../include/lwip/ipv6 -I ../../include/espressif user_main.c
DEPEND: xtensa-lx106-elf-gcc -M -Os -g -Os -Wpointer-arith -Wundef -Werror -Wl,-EL -fno-inline-functions -nostdlib -mlongcalls -mtext-section-literals -DICACHE_FLASH -I include -I ../include -I ../../include -I ../../extra_include -I ../../include/lwip -I ../../include/lwip/ipv4 -I ../../include/lwip/ipv6 -I ../../include/espressif spiram_fifo.c
xtensa-lx106-elf-gcc -Os -g -Os -Wpointer-arith -Wundef -Werror -Wl,-EL -fno-inline-functions -nostdlib -mlongcalls -mtext-section-literals  -DICACHE_FLASH   -I include -I ../include -I ../../include -I ../../extra_include -I ../../include/lwip -I ../../include/lwip/ipv4 -I ../../include/lwip/ipv6 -I ../../include/espressif  -o .output/eagle/debug/obj/spiram_fifo.o -c spiram_fifo.c
xtensa-lx106-elf-gcc -Os -g -Os -Wpointer-arith -Wundef -Werror -Wl,-EL -fno-inline-functions -nostdlib -mlongcalls -mtext-section-literals  -DICACHE_FLASH   -I include -I ../include -I ../../include -I ../../extra_include -I ../../include/lwip -I ../../include/lwip/ipv4 -I ../../include/lwip/ipv6 -I ../../include/espressif  -o .output/eagle/debug/obj/user_main.o -c user_main.c
xtensa-lx106-elf-ar ru .output/eagle/debug/lib/libuser.a .output/eagle/debug/obj/spiram_fifo.o .output/eagle/debug/obj/user_main.o 
xtensa-lx106-elf-gcc  -L../lib -nostdlib -T../ld/eagle.app.v6.ld -Wl,--no-check-sections -Wl,--Map=mapfile -u call_user_start -Wl,-static -Wl,--start-group -fdata-sections -ffast-math -fmerge-all-constants -fomit-frame-pointer -funroll-loops -lgcc -lhal -lphy -lpp -lnet80211 -lwpa -lmain -lfreertos -llwip -ludhcp user/.output/eagle/debug/lib/libuser.a mad/.output/eagle/debug/lib/libmad.a driver/.output/eagle/debug/lib/libdriver.a -Wl,--end-group -o .output/eagle/debug/image/eagle.app.v6.out 

!!!
No boot needed.
Generate eagle.flash.bin and eagle.irom0text.bin successully in folder bin.
eagle.flash.bin-------->0x00000
eagle.irom0text.bin---->0x40000
!!!
esptool.py v2.5.0
Serial port /dev/cu.wchusbserialfd130
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266EX
Features: WiFi
MAC: 80:7d:3a:44:64:c1
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Auto-detected Flash size: 4MB
Flash params set to 0x0040
Compressed 40304 bytes to 28224...
Wrote 40304 bytes (28224 compressed) at 0x00000000 in 2.5 seconds (effective 127.6 kbit/s)...
Hash of data verified.
Compressed 260256 bytes to 195993...
Wrote 260256 bytes (195993 compressed) at 0x000a0000 in 17.5 seconds (effective 119.0 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...
iMac-nabeshin:mp3 nabeshin$ 
```


#視聴、所感
- ちゃんと音は聞こえる。
- が、ESP32&I2S DACのハイクオリティな音質を知ってしまうとノイズが酷い。素人でも分かるレベル。
- ESP8266はESP32に比べて使えるRAM容量が少ないので、やはり外付けSRAM(1MB)追加のI2S DACはマストっぽい。
- 以下のスペック比較によると、なるほどって感じ。
 - https://socialcompare.com/en/comparison/espresif-esp8266-vs-esp32-vs-realtek-rtl8710

|       | ESP8266 | ESP32 |
|:-----:|:---------:|:-------:|
| CPU |Tensilica LX106/ 160 MHz|Tensilica Xtensa Dual-Core LX6|
|Typical Freq|80/160Mhz|160/240Mhz|
| SRAM |36KB available to user|520 KB|


- ちなみに23LC1024(SPI 1MB SRAM)は400円くらい。
- パーツが余ってない限り、やっぱESP32かなぁ。。。