esptool

ESP32にはいくつかの派生チップがありますが、これらのファームウェアの内容の確認や、書き換えを行うツールがesptoolの名称でメーカーのespressifから配布されています。esptoolは、その配布方式や提供形態にいくつかの種類があります。ここでは、我々が使用している4種類のesptoolの導入法と使用法に関して説明します。

  • 新たにesptool.exeを導入して使用
  • Arduino IDEのESP32コアに含まれるesptool.exeを使用
  • Thonnyと共に導入されたpythonにesptool.pyを導入して使用
  • 既存のPythonか新たに導入するPythonにesptool.pyを導入して使用

これらの中で、一番わかりやすいのが、最初のesptool.exeを導入して使用する方法だと思います。


BOOTモード

それぞれのツールの説明の前に、まず共通する注意点として、BOOTモードについて説明しておきます。

esptoolでESP32系の開発ボードを操作するためには、開発ボードがesptoolとの通信時にBOOTモードに遷移している必要があります。

UART-USBコンバーターを使用してPCと通信するタイプの開発ボードでは、esptoolとの通信時に自動的にBOOTモードに遷移する機能が付与されていることが一般的です。このため、BOOTモードを意識することなく、esptoolを使用してファームウェアの書き込み等を行うことができます。

一方、新しいESP32-S3やESP32-C3で、チップに内蔵のUSB機能を使用してPCと通信するタイプの開発ボードでは、esptoolとの通信時に自動的にBOOTモードに遷移する機能がありません。このため、esptoolを使用する前に、開発ボードを手動でBOOTモードに移行させておく必要があります。

このタイプの開発ボードには、ESP32-C3M-SLIM, ESP32-C3M-LEAF, ESP32-C3M-TRY, ESP32-C3M-ROBOなどがあります。

これらの開発ボードでは、LOADボタンとRSTボタンを一緒に押して先にRSTボタンを離すことにより、BOOTモードに移行させることができます。esptoolを使用する前に、この操作をして開発基板をBOOTモードに遷移させておきます。

BOOTモードでesptoolと通信を行いファームウェアの書き込みなどが終了したならば、RSTボタンで開発ボードをリセットすることによりBOOTモードから抜けることができます。


esptool.exeパッケージの利用

導入と利用が一番簡単な方法ですね。MACとLINUXは.exeじゃないですけど。。。

ツールパッケージのダウンロードとインストール

以下のWEBページで、esptoolの実行ファイル(Windowsの場合には、esptool.exe)が含まれた圧縮ファイルをダウンロードすることができます。このWEBページでは、MAC用やLINUX用の圧縮ファイルも提供されています。

圧縮ファイルの中にフォルダが含まれているので、そのフォルダを適当な場所にコピーもしくは展開します。そんなに頻繁に使うものでもないので、実行パスを通す必要もないでしょう。

カレントディレクトリをコピー・展開したフォルダに移動してdirとすると、esptool.exeを含むいくつかの.exeファイルとREADME.mdファイルなどが見えます。

このフォルダで単純にesptoolと入力しエンターキーを押すと、esptool.exeを実行できます。引数なしで起動すると、以下のようにesptoolの利用法が表示されます。

>esptool
esptool.py v4.6.2
usage: esptool [-h]
               [--chip {auto,esp8266,esp32,esp32s2,esp32s3beta2,esp32s3,esp32c3,esp32c6beta,esp32h2beta1,esp32h2beta2,esp32c2,esp32c6,esp32h2}]
               [--port PORT] [--baud BAUD]
               [--before {default_reset,usb_reset,no_reset,no_reset_no_sync}]
               [--after {hard_reset,soft_reset,no_reset,no_reset_stub}]
               [--no-stub] [--trace] [--override-vddsdio [{1.8V,1.9V,OFF}]]
               [--connect-attempts CONNECT_ATTEMPTS]
               {load_ram,dump_mem,read_mem,write_mem,write_flash,run,image_info,make_image,elf2image,read_mac,chip_id,flash_id,read_flash_status,write_flash_status,read_flash,verify_flash,erase_flash,erase_region,merge_bin,get_security_info,version}
               ...

esptool.py v4.6.2 - Espressif chips ROM Bootloader Utility

positional arguments:
  {load_ram,dump_mem,read_mem,write_mem,write_flash,run,image_info,make_image,elf2image,read_mac,chip_id,flash_id,read_flash_status,write_flash_status,read_flash,verify_flash,erase_flash,erase_region,merge_bin,get_security_info,version}
                        Run esptool.py {command} -h for additional help
    load_ram            Download an image to RAM and execute
    dump_mem            Dump arbitrary memory to disk
    read_mem            Read arbitrary memory location
    write_mem           Read-modify-write to arbitrary memory location
    write_flash         Write a binary blob to flash
    run                 Run application code in flash
    image_info          Dump headers from a binary file (bootloader or
                        application)
    make_image          Create an application image from binary files
    elf2image           Create an application image from ELF file
    read_mac            Read MAC address from OTP ROM
    chip_id             Read Chip ID from OTP ROM
    flash_id            Read SPI flash manufacturer and device ID
    read_flash_status   Read SPI flash status register
    write_flash_status  Write SPI flash status register
    read_flash          Read SPI flash content
    verify_flash        Verify a binary blob against flash
    erase_flash         Perform Chip Erase on SPI flash
    erase_region        Erase a region of the flash
    merge_bin           Merge multiple raw binary files into a single file for
                        later flashing
    get_security_info   Get some security-related data
    version             Print esptool version

optional arguments:
  -h, --help            show this help message and exit
  --chip {auto,esp8266,esp32,esp32s2,esp32s3beta2,esp32s3,esp32c3,esp32c6beta,esp32h2beta1,esp32h2beta2,esp32c2,esp32c6,esp32h2}, -c {auto,esp8266,esp32,esp32s2,esp32s3beta2,esp32s3,esp32c3,esp32c6beta,esp32h2beta1,esp32h2beta2,esp32c2,esp32c6,esp32h2}
                        Target chip type
  --port PORT, -p PORT  Serial port device
  --baud BAUD, -b BAUD  Serial port baud rate used when flashing/reading
  --before {default_reset,usb_reset,no_reset,no_reset_no_sync}
                        What to do before connecting to the chip
  --after {hard_reset,soft_reset,no_reset,no_reset_stub}, -a {hard_reset,soft_reset,no_reset,no_reset_stub}
                        What to do after esptool.py is finished
  --no-stub             Disable launching the flasher stub, only talk to ROM
                        bootloader. Some features will not be available.
  --trace, -t           Enable trace-level output of esptool.py interactions.
  --override-vddsdio [{1.8V,1.9V,OFF}]
                        Override ESP32 VDDSDIO internal voltage regulator (use
                        with care)
  --connect-attempts CONNECT_ATTEMPTS
                        Number of attempts to connect, negative or 0 for
                        infinite. Default: 7.

>

ESP32系開発ボードのUSB接続

ここで、ESP32系の開発ボードをUSBでPCに接続してください。もし、ファームウェアの書き込み対象以外の開発ボードを接続している様であれば、それらを間違って操作対象としないために、すべてUSBから外してください。

前の章「BOOTモード]を参照して、必要に応じて操作対象の開発ボードをBOOTローダーモードに設定してください。

この状態で以下に示すようにflash_idを引数に指定してesptool.exeを実行すると、ESP32系開発ボードの各種の情報をUSB経由で取得して画面に表示します。

>esptool flash_id
esptool.py v4.6.2
Found 1 serial ports
Serial port COM12
Connecting....
Detecting chip type... ESP32-S3
Chip is ESP32-S3 (revision v0.1)
Features: WiFi, BLE
Crystal is 40MHz
MAC: XX:XX:XX:XX:XX:XX
Uploading stub...
Running stub...
Stub running...
Manufacturer: c8
Device: 4018
Detected flash size: 16MB
Flash type set in eFuse: quad (4 data lines)
Hard resetting via RTS pin...

c:\>

上記の例では、ESP32-S3-KEY-R2Aが操作対象となっています。

esptoolの標準的な操作法の説明では、開発ボードのチップの種類やシリアルポートを指定する様に書かれていますが、esptoolは自動的に識別してくれるので、上記の例のように面倒であればそれらの指定を行う必要はありません。

もし無指定でesptoolが適切に動かないようであれば、操作法に従いポートやチップを適切に指定してください。

esptoolを使用したファームウェアの書き込み

ファームウェアを書き換える際には、まず下記の例に示すように、erase_flashコマンドでESP32系モジュールのフラッシュメモリの内容を消去します。

この処理は少し時間がかかります。

c:\>esptool erase_flash

次に、下記の例に示すように write_flash コマンドを使用してMicroPythonのファームウェアを書き込みます。図の[PATH]の部分には、ファームウェアをダウンロードして保存している場所のパスを記入してください。(例えば C:\HOME\ など。)

c:\>esptool write_flash -z 0 [PATH]ESP32-S3-KEY-R2-N8R2-20231103-v1.21.0.bin

一般的に、-zオプションのあとの引数は、ファームウェアを書き込むチップにより、以下のようになります。

この書き込み処理には、1‐2分程度かかります。

PCのプロンプトが返ってきたらファームウェアの書き込み成功です。明示的にBOOTモードに移行させていた場合には、ファームウェアの書き込み完了後にRSTスイッチを押して対象の開発ボードを再起動して通常の状態に戻してください。


Arduino IDEに組み込まれたesptoolの利用

Arduinoでスケッチを作成しコンパイルすると、プログラムの開発ボードへのアップロード時に、IDEのメッセージ領域に沢山表示されるメッセージの最初の方に、esptool.pyという文字列を確認することができます。このように、Arduinoのスケッチを開発ボードにアップロードする処理にesptoolが使われており、すでに利用できる状態にありますので、このesptoolを利用する方法を紹介します。

esptoolの格納場所の確認

著者の現在の開発環境では、以下のようなパスにesptool.exeという実行ファイルが格納されています。なお、パスの中のusernameは利用者のアカウント名です。

  • C:\Users\username\AppData\Local\Arduino15\packages\esp32\tools\esptool_py\4.5.1

esptool.exeの格納場所は、コマンドプロンプト(CMD.EXE)を開き、dir コマンドでArduinoをインストールしたドライブ(一般的にはC:)でesptool.exeを検索すると、少し時間がかかるかもしれませんが見つけることができます。

以下の例は、Arduino IDEがCドライブにインストールされている場合ですが、異なるドライブにインストールされている場合には、そのドライブで検索を行ってください。

c:\>dir /s /b esptool.exe
c:\Users\username\AppData\Local\Arduino15\packages\esp32\tools\esptool_py\4.5.1\esptool.exe

c:\>

esptoolの動作確認

esptool.exe を見つけたら、カレントディレクトリをesptool.exeが格納されているパスに移動しましょう。コマンドプロンプトに cd とスペースを入力した後に、見つかったesptool.exeのフォルダ名を入力します。なお、パス内のusernameは利用者のアカウント名です。

c:\>cd C:\Users\username\AppData\Local\Arduino15\packages\esp32\tools\esptool_py\4.5.1\

この状態でエンターキーを押すと、カレントディレクトリをesptool.exeの格納場所に移動できます。

ここに格納されているesptool.exeは前章の「esptool.exeの利用」で紹介したesptool.exeよりバージョンが少し古いかもしれませんが、基本的に同じものです。したがって、その使用法については、前の章の「esptool.exeの利用」を参照して利用してください。


ThonnyのPython利用

Thonnyと共にインストールされたPythonを利用して、開発ボードにMicroPythonのファームウェアの書き込みを行うことができます。

コマンドプロンプトの起動

Thonnyを起動して、まず下の図の赤丸の部分をクリックして、下図に示すようにPC用のPythonを実行対象として選択してください。

次に、Thonnyの[ツール] => [システムシェルを開く…]メニューを選択してください。コマンドプロンプト(CMD.EXE)が起動されます。

esptoolのインストール

コマンドプロンプトに以下に示すコマンドを入力してエンターキーを押すと、esptoolをインストールできます。

> pip install esptool

esptool がインストールできたら、以下に示すコマンドを入力するとesptoolの起動オプションなどが表示され、esptoolの動作確認することができます。

c:\> python -m esptool

開発ボードのUSB接続

ここで、開発ボードをUSBでPCに接続してください。もし、操作対象以外の開発ボードを接続している様であれば、それらをすべてUSBから外してください。

前の章「BOOTモード]を参照して、必要に応じて操作対象の開発ボードをBOOTローダーモードに設定してください。

この状態で下の図に示すようにflash_idを引数に指定してesptoolを実行すると、開発ボードの各種の情報をUSB経由で取得して画面に表示します。

> python -m esptool flash_id
esptool.py v4.6.2
Found 1 serial ports
Serial port COM10
Connecting...
Detecting chip type... ESP32-C3
Chip is ESP32-C3 (revision v0.3)
Features: WiFi, BLE
Crystal is 40MHz
MAC: XX:XX:XX:XX:XX:XX
Uploading stub...
Running stub...
Stub running...
Manufacturer: 20
Device: 4016
Detected flash size: 4MB
Hard resetting via RTS pin...

>

上記の例では、ESP32-C3-SLIMが操作対象となっています。

esptoolの標準的な操作法の説明では、開発ボードのチップの種類やシリアルポートを指定する様に書かれていますが、esptoolは自動的に識別してくれるので、上記の例のように面倒であればそれらの指定を行う必要はありません。

もし無指定でesptoolが適切に動かないようであれば、操作法に従いポートやチップを適切に指定してください。

esptoolを使用したファームウェアの書き込み

まず、下の図に示すようにerase_flashコマンドでESP32チップのフラッシュメモリの内容を消去します。

この処理は少し時間がかかります。

c:\> python -m esptool erase_flash

次に、下の図に示すように write_flash コマンドを使用してMicroPythonのファームウェアを書き込みます。

図の[PATH]の部分には、ファームウェアが格納されている場所のパスを記入してください。(例えば C:\HOME\ など。)

c:\> python -m esptool write_flash -z 0 [PATH]esp32c3-usb-20230426-v1.20.0.bin

この書き込み処理には、1‐2分程度かかります。

PCのプロンプトが帰ってきたらファームウェアの書き込み成功です。ファームウェアの書き込み完了後にRSTスイッチを押して開発ボードを再起動してください。


esptool.pyの利用

インストール済みPythonを利用した書き込み

Pythonのインストール

以下のサイトからインストールパッケージをダウンロードし、インストール時にPATHも設定されているPythonがPCにインストールされているのであればそれを使用します。

PCにPythonがインストールされていない場合には、上記のサイトからPythonのインストールパッケージをダウンロードしてインストールしてください。

Pythonをインストールする際には、インストーラの下部に表示されている[Add Pyhon 3.XX to PATH]をチェックして、Pythonをコマンドプロンプトで利用しやすいようにしておいてください。

esptoolのインストール

Pythonがインストールできたら、「Windows システムツール]からコマンドプロンプト(CMD.EXE)を開きます。

以下に示すコマンドを入力してエンターキーを押すと、esptoolをインストールできます。

> pip install esptool

esptoolのインストール後、以下に示すコマンドを入力してエンターキーを押します。

> esptool.py

esptools.pyのバージョンや使用法が表示されればインストールは成功です。

開発ボードのUSB接続

ここで、開発ボードをUSBでPCに接続してください。もし、フラッシュの操作対象以外の開発ボードを接続している様であれば、それらをすべてUSBから外してください。

この状態で図\ref{fig:python-esptool-chipid-1}に示すようにflash_idを引数に指定してesptoolを実行すると、開発ボードの各種の情報をUSB経由で取得して画面に表示します。

前の章「BOOTモード]を参照して、必要に応じて操作対象の開発ボードをBOOTローダーモードに設定してください。

c:\> esptool.py flash_id
esptool.py v4.5.1
Found 1 serial ports
Serial port COM17
Connecting...
Detecting chip type... ESP32-C3
Chip is ESP32-C3 (revision v0.3)
Features: WiFi, BLE
Crystal is 40MHz
MAC: XX:XX:XX:XX:XX:XX
Uploading stub...
Running stub...
Stub running...
Manufacturer: 20
Device: 4016
Detected flash size: 4MB
Hard resetting via RTS pin...

esptoolの標準的な操作法の説明では、開発ボードのチップの種類やシリアルポートを指定する様に書かれていますが、esptoolは自動的に識別してくれるので、図の例のように面倒であればそれらの指定を行う必要はありません。

esptoolを使用したファームウェアの書き込み

まず、図\ref{fig:python-esptool-erase-1}に示すようにerase\_idコマンドで \productname の\wroom モジュールのフラッシュメモリの内容を消去します。

この処理は少し時間がかかります。

c:\> esptool.py erase_flash

次に、図\ref{fig:python-esptool-write-1}に示すように write\_flash コマンドを使用してMicroPythonのファームウェアを書き込みます。

図の[PATH]の部分には、ファームウェアが格納されている場所のパスを記入してください。

(例えば C:\HOME\ など。)

c:\> esptool.py write_flash -z 0 [PATH]esp32c3-usb-20230426-v1.20.0.bin

この書き込み処理には、1‐2分程度かかります。

PCのプロンプトが帰ってきたらファームウェアの書き込み成功です。ファームウェアの書き込み完了後にRSTスイッチを押して開発ボードを再起動してください。