ESP8266系の基板の中でも最小限なピン構成ながら、I2C用途がメインの私には少電力でとても便利なESP-01S、難点はフラッシュメモリが1MBしかないこと。普通にスケッチを焼く分にはそれでも十分なのですが、ESP Easyを焼いた後、OTAでFirmwareを更新しようとすると、必要な残り容量を確保出来ないことから、その機能を利用出来ない旨の警告が表示され、実際Update Firmwareしようとするとエラーになります。
これはこれで割り切っていたのですが最近、フラッシュメモリを載せ替えてしまう改造例を見付けてしまいました。
ハードウェア
早速、淘寶でW25Q32FVSIGを発注です(個当たりRMB1.0〜1.2程度+送料)。メモリ容量のビットとバイトの表記を以下にまとめます。
- 25Q40BT : 4Mbit = 512kByte (ESP-01 Blue)
- 25Q80ASSIG : 8Mbit = 1MByte (ESP-01S Black)
- W25Q32FVSIG : 32Mbit = 4MByte (ESP-12E,ESP32,etc.)
- W25Q64FVSIG : 64Mbit = 8MByte
- W25Q128FVSIG:128Mbit = 16MByte (WeMos D1 mini Pro)
到着した4MBメモリと既にESP-01Sに搭載されている1MBメモリを比較してみます。平面寸法、厚み共に全く同じなことが分かります(図02は左から、ESP-01S, W25Q32FVSIG, W25Q64FVSIG)。
1MBメモリを外し、端子に残ったハンダを慣らしておきます。基板には親切にも1番ピンマークがプリントされています。
載せ替える4MBメモリのピンにも少しハンダを盛ってから基板に載せ、拡大鏡で確認しながら丁寧にハンダ付けしました(図05は左から、4MBメモリに載せ替えたESP-01S, 外した1MBメモリ)。
焼き込み
正常に認識出来るか、焼き込みに使うEspressif社謹製のesptool.py のflash_idオプションを使ってチェックしてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$ sudo esptool.py --port /dev/ttyUSB0 --baud 115200 flash_id esptool.py v2.8 Serial port /dev/ttyUSB0 Connecting.... Detecting chip type... ESP8266 Chip is ESP8266EX Features: WiFi Crystal is 26MHz MAC: 60:01:94:**:**:** Uploading stub... Running stub... Stub running... Manufacturer: ef Device: 4016 Detected flash size: 4MB Hard resetting via RTS pin... |
問題なく4MBフラッシュが検出されました。それでは焼き込みの前に念の為、一度フラッシュを消去します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ sudo esptool.py --port /dev/ttyUSB0 --baud 115200 erase_flash esptool.py v2.8 Serial port /dev/ttyUSB0 Connecting.... Detecting chip type... ESP8266 Chip is ESP8266EX Features: WiFi Crystal is 26MHz MAC: 60:01:94:**:**:** Uploading stub... Running stub... Stub running... Erasing flash (this may take a while)... Chip erase completed successfully in 4.5s Hard resetting via RTS pin... |
それではいよいよ焼き込みです。バイナリイメージは、ESP-12Eで使う4MB用のESP Easyを使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$ sudo esptool.py --port /dev/ttyUSB0 --baud 115200 write_flash --flash_size 4MB --flash_mode dio 0x00000 ./ESP_Easy_mega_20200608_test_ESP8266_4M1M_VCC.bin esptool.py v2.8 Serial port /dev/ttyUSB0 Connecting.... Detecting chip type... ESP8266 Chip is ESP8266EX Features: WiFi Crystal is 26MHz MAC: 60:01:94:**:**:** Uploading stub... Running stub... Stub running... Configuring flash size... Flash params set to 0x0240 Compressed 1046336 bytes to 680044... Wrote 1046336 bytes (680044 compressed) at 0x00000000 in 59.9 seconds (effective 139.7 kbit/s)... Hash of data verified. Leaving... Hard resetting via RTS pin... |
esptool.pyを実行した各工程に於いて、実行後は一度ESP-01SをUSBライタごと母艦から抜き挿しする必要があります。挿したまま、複数のコマンドを実行させることは出来ません。
ESP Easy検証
それでは、ESP Easyを焼いたESP-01Sを以前作った開発ボードに載せて起動させてみます。WiFi初期設定後、早速Firmware更新機能を確認してみると、WARNINGは消えてOTA更新は可能になりました。
4MB化で何が変わったのか、ESP EasyのInfoページで比較してみましょう。まずは比較用に純正1MBの情報はこのようになっていました(System Info頁のFirmware, ESP Board, Storage項を抜粋)。
それが今回4MB化したことで、 以下のように変わりました。具体的には当然ながらFlash Chip Real Size, Flash IDE Sizeを始め、前述のOTAの可否に関する項目、そして大きな違いとしては、SPIFSS容量が格段に増えました。また少し気になったのは、ESP Board Nameが4MBではESP12Eとなっていること。この項は使ったイメージの中の決め打ち文字列なのかもしれません。
8MBメモリに挑戦
図02にもある通り、実は16MBメモリも大差無い価格だったので発注していました。これも物理寸法全く同じなので、4MBの時と同じ要領で載せ替えてみます(図09は左から、8MBメモリに載せ替えたESP-01S, 外した4MBメモリ、元の1MBメモリ)。
esptool.pyのflash_idオプションを使ったチェックでも、正しく8MB認識されています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$ sudo esptool.py --port /dev/ttyUSB0 --baud 115200 flash_id esptool.py v2.8 Serial port /dev/ttyUSB0 Connecting.... Detecting chip type... ESP8266 Chip is ESP8266EX Features: WiFi Crystal is 26MHz MAC: 60:01:94:**:**:** Uploading stub... Running stub... Stub running... Manufacturer: ef Device: 4017 Detected flash size: 8MB Hard resetting via RTS pin... |
早速焼いてみるのですが、ESP Easyには8MBイメージが有りません。4MBのものを使いますが、flash_sizeオプション設定を8MBとして焼いた場合はこのようになりました。
1 |
$ sudo esptool.py --port /dev/ttyUSB0 --baud 115200 write_flash --flash_size 8MB --flash_mode dio 0x00000 Downloads/ESP_Easy_mega_20200608_test_ESP8266_4M1M_VCC.bin |
次に同じイメージをflash_sizeオプション4MB設定にて焼いてみるとどうなるか、実験してみました。
1 |
$ sudo esptool.py --port /dev/ttyUSB0 --baud 115200 write_flash --flash_size 4MB --flash_mode dio 0x00000 Downloads/ESP_Easy_mega_20200608_test_ESP8266_4M1M_VCC.bin |
比べてみると、Flash IDE Size に違いがあるのみで、Max OTA Sketch SIzeやSPIFFSは両者全く同じで、さらにそれは4MBの時と同じでした。4MBを越えるメモリの領域を最大限活かすには、ESP Easyのソースから例えばSPIFFSパーティション増やした設定でmakeするなど、踏み込んだ作業が必要です。
この辺り、大きなイメージのリリースがないか調べていたところ、ESP Easy公式GitHubに次のような記述があるのを見つけました。
1 2 3 4 5 6 7 8 9 |
MemorySize can be: - 1M => 1 MB flash modules (e.g. almost all Sonoff modules) - 2M => 2 MB flash modules (e.g. Shelly1/WROOM02) - 4M => 4 MB flash modules (e.g. NodeMCU/ESP32) - 16M => 16 MB flash modules (e.g. Wemos D1 mini pro) Please note that the performance of 14MB SPIFFS (16M flash modules) is really slow. All file access takes a lot longer and since the settings are also read from flash, the entire node will perform slower. See [Arduino issue - SPIFFS file access slow on 16/14M flash config](https://github.com/esp8266/Arduino/issues/5932) |
実はこの8MBメモリのESP Easyを起動がいつもより時間掛かったり、立ち上がった後の動き(ページ遷移時など)も何か引っかかる感じで少し気になっていたのですが、これで納得しました。現状では、4MBへの載せ替えがベストと言えそうです。