ESP-WROOM-02 Wifi シールドのfirmwareを書き換える


mbedでwifiが使ってみたいと思います。
mbedデバイスとしては[FRDM-K64F](https://www.switch-science.com/catalog/1689/)を、wifiとしては[ESP-WROOM-02 Wi-Fi シールド](https://www.switch-science.com/catalog/2619/)を使います。
ESP-WROOM-02 Shieldのfirmwareを上書きして、mbedデバイスで利用できるようにします。

# ESP-WROOM-02 Wi-Fi シールドのfirmwareを書き換え

下記記事を参考に書き換えしました。
[ESP-WROOM-02 WiFi シールドのファームウェア書き換え方法](https://developer.mbed.org/users/MACRUM/notebook/wroom-02-shield-firmware/)

## ハマりポイント

上記記事に`ESP-WROOM-02 Shield の JP1 コネクタに FTDI USBシリアル変換アダプターを接続します。`とありますが、`FTDI USBシリアル変換アダプター`として、[Arduino ミニ3.3V 5.5V FTDI232用の FT232RL FTDI USB-TTLシリアル アダプタ モジュール ](http://amzn.asia/09NnHK6)を使った場合、esptool.pyでfirmwareをflashに書き込む際に、timeoutする事象が発生しました。

```
Reset with flash mode (IO0 = Low). Press [Enter] key to continue.
esptool.py v1.2.1
Connecting...
Auto-detected Flash size: 32m
Running Cesanta flasher stub...
Writing 225280 @ 0x1000... 35840 (15 %)
A fatal error occurred: Timed out waiting for packet header
```

調べた結果、使用した`FTDI USBシリアル変換アダプター`のHWに依存する問題のようです。(この変換アダプタは、他のデバイスでは普通に使えていたのですが、今回のWifi Shieldのfirmware書き換えには適さないようです)
[esptool-ck, esp8266, and FTDI Bug Hunting](https://vilimpoc.org/blog/2016/05/03/esptool-ck-esp8266-and-ftdi-bug-hunting/)

## 対応

実績のある`FTDI USBシリアル変換アダプター`を使うことにしましたが、記事で紹介されている[FTDI USBシリアル変換アダプター Rev.2](https://www.switch-science.com/catalog/2782/)は、現在在庫がなかったので、代わりに[FTDI USBシリアル変換アダプター](https://www.switch-science.com/catalog/1032/)を使うことにしました。
[ESP-WROOM-02 Wi-Fi シールド](https://www.switch-science.com/catalog/2619/)に、当該変換アダプターについて記載があったので、利用実績ありと判断しました。

### 接続

ということで、[FTDI USBシリアル変換アダプター](https://www.switch-science.com/catalog/1032/)を、[ESP-WROOM-02 Wi-Fi シールド](https://www.switch-science.com/catalog/2619/)に接続しました。

![IMG_6273.jpg](https://qiita-image-store.s3.amazonaws.com/0/4779/1c597fbe-1023-d5d0-55e4-f1b4db4eaad8.jpeg "IMG_6273.jpg")

![IMG_6275.jpg](https://qiita-image-store.s3.amazonaws.com/0/4779/31924492-ff11-441c-5718-f497375f9abc.jpeg "IMG_6275.jpg")

### fireware書き換え

上述の記事のサンプルコードを参考にスクリプトを用意しました。device fileは実際に自分の環境で認識されたものを使います。

```fw_update.sh
#!/bin/sh
port="/dev/tty.usbserial-A105GSPH"

echo "Updating ESP-WROOM-02 Shield ESP8266 firmware (port:" $port ")"

read -p "Reset with flash mode (IO0 = Low). Press [Enter] key to continue."
esptool.py -p $port -b 115200 write_flash 0x00000 ./boot_v1.6.bin

read -p "Reset with flash mode (IO0 = Low). Press [Enter] key to continue."
esptool.py -p $port -b 115200 write_flash 0x01000 ./user1.bin

read -p "Reset with flash mode (IO0 = Low). Press [Enter] key to continue."
esptool.py -p $port -b 115200 write_flash 0x3fc000 ./esp_init_data_default.bin

read -p "Reset with flash mode (IO0 = Low). Press [Enter] key to continue."
esptool.py -p $port -b 115200 write_flash 0xfe000 ./blank.bin

read -p "Reset with flash mode (IO0 = Low). Press [Enter] key to continue."
esptool.py -p $port -b 115200 write_flash 0x3fe000 ./blank.bin

echo "Update completed."
```

上記スクリプトを実行し、下記のように実行完了しました。
`Reset with flash mode (IO0 = Low). Press [Enter] key to continue.`が表示された後、ESP-WROOM-02 Wi-Fi シールドの`FLASH`ボタンを押したまま`RESET`ボタンを押して、ボタンを離します。そして、PCのENTERキーをクリックします。

```
$ ./fw_update.sh
Updating ESP-WROOM-02 Shield ESP8266 firmware (port: /dev/tty.usbserial-A105GSPH )
Reset with flash mode (IO0 = Low). Press [Enter] key to continue.
esptool.py v1.2.1
Connecting...
Auto-detected Flash size: 32m
Running Cesanta flasher stub...
Flash params set to 0x0040
Writing 4096 @ 0x0... 4096 (100 %)
Wrote 4096 bytes at 0x0 in 0.4 seconds (85.7 kbit/s)...
Leaving...
Reset with flash mode (IO0 = Low). Press [Enter] key to continue.
esptool.py v1.2.1
Connecting...
Auto-detected Flash size: 32m
Running Cesanta flasher stub...
Writing 225280 @ 0x1000... 225280 (100 %)
Wrote 225280 bytes at 0x1000 in 19.6 seconds (92.2 kbit/s)...
Leaving...
Reset with flash mode (IO0 = Low). Press [Enter] key to continue.
esptool.py v1.2.1
Connecting...
Auto-detected Flash size: 32m
Running Cesanta flasher stub...
Writing 4096 @ 0x3fc000... 4096 (100 %)
Wrote 4096 bytes at 0x3fc000 in 0.4 seconds (85.6 kbit/s)...
Leaving...
Reset with flash mode (IO0 = Low). Press [Enter] key to continue.
esptool.py v1.2.1
Connecting...
Auto-detected Flash size: 32m
Running Cesanta flasher stub...
Writing 4096 @ 0xfe000... 4096 (100 %)
Wrote 4096 bytes at 0xfe000 in 0.4 seconds (85.6 kbit/s)...
Leaving...
Reset with flash mode (IO0 = Low). Press [Enter] key to continue.
esptool.py v1.2.1
Connecting...
Auto-detected Flash size: 32m
Running Cesanta flasher stub...
Writing 4096 @ 0x3fe000... 4096 (100 %)
Wrote 4096 bytes at 0x3fe000 in 0.4 seconds (85.4 kbit/s)...
Leaving...
Update completed.
```

# 参考

別の記事では、mbedをUSB-シリアル変換として利用する手順もありましたが、こちらは、未確認です。
https://developer.mbed.org/teams/ESP8266/wiki/Firmware-Update