esptoolを使ってコンパイル済みのESP32ファームウェアイメージをコマンドラインから実機に書き込む方法(Windows/Mac)

The English version of this post is here.

ESP32の開発とファームウェア書き込みにArduino IDEを使用しています。Arduino IDEではスケッチをハードウェアに書き込む際に必ずコンパイルが実行されますが、数十台のESP32に同じ内容のファームウェアを書き込む機会があった際に、毎回コンパイルが実行されるのが非常に煩わしく感じました。そこで、コンパイル済みのファームウェアイメージを保存しておきコマンドラインから書き込むようにしたところ、煩わしさが解消され、作業時間も多少短縮することができました。本記事ではその手順を説明します。

環境

  • ESP32ボード
  • Arduino IDE: v1.8.9
  • ホストマシンのOS
    • Mac: OSX 10.14.6
    • Windows: Windows 10 Home ver. 1809

事前準備

Arduino IDEを使用してESP32のスケッチをコンパイルして実機に書き込めるようにしておきます。事前準備の詳細についてはこの記事では触れません。

手順

step 1.

Arduino IDEを起動して使用するスケッチを開きます。

step 2.

環境設定を開き、書き込み時の「より詳細な情報を表示する」にチェックをいれてOKボタンをクリックします。

Windows

Mac

step 3.

PC/MacにESP32実機を接続し、一度Arduino IDE上でスケッチのコンパイルと書き込みを実行します。書き込み時により詳細な情報を表示する設定を行ったので、書き込みの際に実行されるesptoolコマンドの引数がエディタウィンドウの出力エリアに表示されます。

step 4.

出力エリアでesptoolコマンドを実行している行をみつけます。あとで再利用するために、一行まるごとコピーして、テキストファイルに保存しておきます。

step 5.

esptoolコマンドの引数に、スケッチのファイル名が含まれる拡張子.binのファイルのパスが指定されている箇所が2箇所あります。このパスに保存されている2つの.binファイルをコピーしてstep 4のテキストファイルがあるフォルダに保存します。

ESP32のWatchdogTimerサンプルをコンパイルして書き込みした時は以下のような結果になりました。スケッチのファイル名が含まれる.binファイルは以下の2つです。

  • WatchdogTimer.ino.bin
  • WatchdogTimer.ino.partitions.bin

コンパイル&アップロード実行後(Windows)

C:\Users\hogehoge\Documents\ArduinoData\packages\esp32\tools\esptool_py\2.6.1/esptool.exe --chip esp32 --port COM7 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 80m --flash_size detect 0xe000 C:\Users\hogehoge\Documents\ArduinoData\packages\esp32\hardware\esp32\1.0.4/tools/partitions/boot_app0.bin 0x1000 C:\Users\hogehoge\Documents\ArduinoData\packages\esp32\hardware\esp32\1.0.4/tools/sdk/bin/bootloader_qio_80m.bin 0x10000 C:\Users\hogehoge\AppData\Local\Temp\arduino_build_425707/WatchdogTimer.ino.bin 0x8000 C:\Users\hogehoge\AppData\Local\Temp\arduino_build_425707/WatchdogTimer.ino.partitions.bin
esptool.py v2.6
コンパイル&アップロード実行後(Mac)

/Users/hogehoge/Library/Arduino15/packages/esp32/tools/esptool_py/2.6.1/esptool --chip esp32 --port /dev/cu.usbserial-XXXXXXXX --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 80m --flash_size detect 0xe000 /Users/hogehoge/Library/Arduino15/packages/esp32/hardware/esp32/1.0.3/tools/partitions/boot_app0.bin 0x1000 /Users/hogehoge/Library/Arduino15/packages/esp32/hardware/esp32/1.0.3/tools/sdk/bin/bootloader_qio_80m.bin 0x10000 /var/folders/8q/zz5yryg10bs8h6n8rktc_mtw0000gq/T/arduino_build_834564/WatchdogTimer.ino.bin 0x8000 /var/folders/8q/zz5yryg10bs8h6n8rktc_mtw0000gq/T/arduino_build_834564/WatchdogTimer.ino.partitions.bin

step 6.

MacならTerminalアプリ等、Windowsならcmd.exeを開き、.binファイルを保存したフォルダに移動します。テキストファイルに保存したコマンドの引数を、フォルダにコピーした.binファイルを指定するように変更してから実行します。コンパイル済みファームウェアのESP32実機への書き込みが開始します。

書き込みの実行結果(Windows)

F:\tmp>C:\Users\hogehoge\Documents\ArduinoData\packages\esp32\tools\esptool_py\2.6.1/esptool.exe --chip esp32 --port COM7 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 80m --flash_size detect 0xe000 C:\Users\hogehoge\Documents\ArduinoData\packages\esp32\hardware\esp32\1.0.4/tools/partitions/boot_app0.bin 0x1000 C:\Users\hogehoge\Documents\ArduinoData\packages\esp32\hardware\esp32\1.0.4/tools/sdk/bin/bootloader_qio_80m.bin 0x10000 .\WatchdogTimer.ino.bin 0x8000 .\WatchdogTimer.ino.partitions.bin
esptool.py v2.6
Serial port COM7
Connecting....
Chip is ESP32D0WDQ6 (revision 1)
Features: WiFi, BT, Dual Core, Coding Scheme None
MAC: XX:XX:XX:XX:XX:XX
Uploading stub...
~ ~ ~ snip ~ ~ ~
Hash of data verified.
Compressed 3072 bytes to 128...
Wrote 3072 bytes (128 compressed) at 0x00008000 in 0.0 seconds (effective 1638.4 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...

F:\tmp>

書き込みの実行結果(Mac)

$ /Users/hogehoge/Library/Arduino15/packages/esp32/tools/esptool_py/2.6.1/esptool --chip esp32 --port /dev/cu.usbserial-XXXXXXXX --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 80m --flash_size detect 0xe000 /Users/hogehoge/Library/Arduino15/packages/esp32/hardware/esp32/1.0.3/tools/partitions/boot_app0.bin 0x1000 /Users/hogehoge/Library/Arduino15/packages/esp32/hardware/esp32/1.0.3/tools/sdk/bin/bootloader_qio_80m.bin 0x10000 ./WatchdogTimer.ino.bin 0x8000 ./WatchdogTimer.ino.partitions.bin
esptool.py v2.6
Serial port /dev/cu.usbserial-XXXXXXXX
Connecting....
Chip is ESP32D0WDQ6 (revision 1)
Features: WiFi, BT, Dual Core, Coding Scheme None
MAC: XX:XX:XX:XX:XX:XX
Uploading stub...
~ ~ ~ snip ~ ~ ~
Hash of data verified.
Compressed 3072 bytes to 128...
Wrote 3072 bytes (128 compressed) at 0x00008000 in 0.0 seconds (effective 1528.7 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...
$

補足

  • Arduino IDEのメニューから"Export Compiled Binary(コンパイル済みバイナリのエクスポート)"を実行すると、WatchdogTimerサンプルの場合はWatchdogTimer.ino.binがスケッチと同じ場所にエクスポートされます。この.binファイルだけを実機に書き込んでもダメで、「手順」で実行されるesptoolに指定される.binファイルすべてを書き込まないとファームウェアは動作しませんでした。

  • ESP32ボードによっては、PC/Macに今までつないでいたボードと別なボードをつなぐと、シリアルポート番号が変化する場合があります。コマンドラインからファームウェアを書き込む際には、現在ホストPCにつながっているボードのシリアルポート番号をesptoolコマンドの--portオプションで指定する必要があります。

まとめ

コンパイル済みESP32ファームウェアイメージをesptoolコマンドを使用してコマンドラインから書き込む方法を説明しました。esptoolの詳細を一切理解せずにコピペでコマンドを再利用してしまいましたが、GUIを何度もポチポチやる煩わしさから開放され、作業時間も多少は短縮できたので今回はこれでよしとします。 もっとスマートなやり方ご存知の方おられましたらぜひ教えていただきたいです!

参考