ESP32-WROOM-32D 開発ボード

ESP32-WROOM-32D 開発ボードの「ESP32-DevKitC-32D 」を 秋月電子より購入して実験した内容です。


ESP32シリーズはEspressif Systems社のWi-Fi・Bluetooth内蔵するSoC(System-on-a-chip)です。

CPUは160MHz(or 240MHz)で可動する32bitのデュアルコアを内蔵し、520KBのメモリを持っています。

右のように、キットをケースに入れたままマイクロUSBでPCと接続してみました。

接続すると、PCのデバイスマネージャーの「ポート(COM と LPT)」の所に 「Silicon Labs CP210x USB to UART Bridge(COM6)」が出現します。
(私の環境ではCOM6ですが、一般には異なるCOM番号が現れるでしょう。)

(キーボードの横に置いています。)


Tera Term ポータブル版で、「Silicon Labs CP210x USB to UART Bridge(COM6)」に接続します。
Tera Term のシリアルで、通信速度115200bpsで接続します。
ターミナルに以下の内容が表示しました。
ets Jun  8 2016 00:22:57


rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)

configsip: 0, SPIWP:0x00

clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00

mode:DIO, clock div:2

load:0x3ffc0000,len:0

load:0x3ffc0000,len:2304

load:0x40078000,len:3788

ho 0 tail 12 room 4

load:0x40098000,len:532

entry 0x4009813c





**************************************

*       hello espressif ESP32!       *

*        2nd boot is running!        *

*            version (V0.1)          *

**************************************

compile time 18:16:58



  SPI Speed      : 40MHz

  SPI Mode       : DIO

  SPI Flash Size : 4MB

Partition Table:

## Label            Usage          Type ST Offset   Length

 0 factory          factory app      00 00 00010000 00100000

 1 rfdata           RF data          01 01 00110000 00040000

 2 wifidata         WiFi data        01 02 00150000 00040000

End of partition table

Loading app partition at offset 00010000

section 0: paddr=0x00000020 vaddr=0x00000000 size=0x0ffe8 ( 65512)

section 1: paddr=0x00010010 vaddr=0x3f400010 size=0x05b64 ( 23396) map

section 2: paddr=0x00015b7c vaddr=0x3ffba720 size=0x01378 (  4984) load

section 3: paddr=0x00016efc vaddr=0x40080000 size=0x00400 (  1024) load

section 4: paddr=0x00017304 vaddr=0x40080400 size=0x126ac ( 75436) load

section 5: paddr=0x000299b8 vaddr=0x00000000 size=0x06658 ( 26200)

section 6: paddr=0x00030018 vaddr=0x400d0018 size=0x325b4 (206260) map

start: 0x400807ac



Initializing heap allocator:

Region 19: 3FFBBA98 len 00024568 tag 0

Region 25: 3FFE8000 len 00018000 tag 1

Pro cpu up.

Pro cpu start user code

nvs_flash_init

frc2_timer_task_hdl:3ffbc564, prio:22, stack:2048

tcpip_task_hdlxxx : 3ffbeca8, prio:20,stack:2048

phy_version: 80, Aug 26 2016, 13:04:06, 0

pp_task_hdl : 3ffc34f0, prio:23, stack:8192



:>enter uart init

uart init wait fifo succeed

exit uart init



IDF version : master(db93bceb)



WIFI LIB version : master(934d079b)



ssc version : master(r283 4d376412)



!!!ready!!!

mode : softAP(32:ae:a4:ca:e2:48)

dhcp server start:(ip: 192.168.4.1, mask: 255.255.255.0, gw: 192.168.4.1)



+WIFI:AP_START

Arduino IDE環境を準備してみる

Arduino IDE環境(このリンクでインストールした環境)で試します。
予め、Espressif Systems社のライブラリ(Arduino IDEでESP32-WROOM-32Dを利用できるようにするためのライブラリ)を入手先を確認します。
それは、次のURLアドレスに用意されています。
  https://github.com/espressif/arduino-esp32
このページから、「Using Arduino IDE Boards Manager (preferred)」の 「Instructions for Boards Manager」をたどると、2019-7-25の時点で、
「https://dl.espressif.com/dl/package_esp32_index.json」を指定すると記述されていた。
このリンクをコピーして、
Arduino IDEを起動して、「ファイル」メニューの「環境設定」 を選択し、「追加のボードマネージャ」のURLの欄に、 先ほど指定された次のURLを貼り付けて[OK]します。

次に、Arduino IDEの「ツール」メニューの「ボード:[現在の選択名記述]」から「ボードマネージャ」を選択します。
多くのボードがこのウィンドウに表示されます。
インストールされているものにはINSTALLEDの表示があります。
このウィンドウの最後に、「esp32 by Espressif Systems」にESP32関連のシステムががあって、ここを選択すると、 まだインストールされていないので「インストール」のボタンが表示されます。このボタンでインストールします。

以上で、インストールは終わりです。

「ESP32-DevKitC-32D 」をUSB接続して、 Arduino IDEの「ツール」メニューの「シリアルポート」から「接続中のCOM」を選択します。
予め、 「デバイスマネージャー」でCOMの番号を確認しておくと良いでしょう。私の環境では、次が確認できました。
Silicon Labs CP210x USB to UART Bridge(COM6))

以上で、開発準備は整いました。 「ESP32-DevKitC-32D 」とPCを接続後、Arduino IDEを起動した後の重要項目を以下に示します。
  1. 「ツール」メニューから「ボード:ESP32 Dev Module」を選ぶ。
  2. 「ツール」メニューから(「ボードマネージャ」の)「Upload Speed:115200」を選ぶ。
  3. 「ツール」メニューから「シリアルポート」を選び、「接続中のCOM」を選ぶ。
なお、「ESP32-DevKitC-32D 」に書き込む前に、後述のバックアップをした方が良いでしょう。

firmwareのbackup

まず、pythonが動作する環境(Anacondaで作成したpython3.6の仮想環境)で、「esptool」をインストールした。
(win36) D:\_Hardware\Arduino>pip install esptool
Collecting esptool
・・・メッセージ表示を一部省略・・・
Building wheels for collected packages: esptool, pyaes
  Building wheel for esptool (setup.py) ... done
  Stored in directory: C:\Users\????\AppData\Local\pip\Cache\wheels\3f\63\de\44d70c782d1f5de97d0fe41b320603a8a7217e30c03a80a6a9
  Building wheel for pyaes (setup.py) ... done
  Stored in directory: C:\Users\???\AppData\Local\pip\Cache\wheels\bd\cf\7b\ced9e8f28c50ed666728e8ab178ffedeb9d06f6a10f85d6432
Successfully built esptool pyaes
Installing collected packages: pyserial, pyaes, ecdsa, esptool
Successfully installed ecdsa-0.13.2 esptool-2.7 pyaes-1.6.1 pyserial-3.4

続いて、esptool.pyを取得します。
これはEspressif ESP8266およびESP32チップのROMブートローダと通信する、Pythonベースのオープンソースのプラットフォームに依存しないユーティリティです。
次のように取得しました。
(win36) D:\_Hardware\Arduino>git clone https://github.com/espressif/esptool.git
Cloning into 'esptool'...
remote: Enumerating objects: 62, done.
remote: Counting objects: 100% (62/62), done.
remote: Compressing objects: 100% (51/51), done.
remote: Total 2002 (delta 22), reused 33 (delta 10), pack-reused 1940
Receiving objects: 100% (2002/2002), 7.57 MiB | 5.31 MiB/s, done.
Resolving deltas: 100% (1222/1222), done.

(win36) D:\_Hardware\Arduino>
以上で取得した、ツールを使って、次のように「esp32.bin」のファイルへfirmwareをbackupしました。
(win36) D:\_Hardware\Arduino>cd esptool

(win36) D:\_Hardware\Arduino\esptool>python ./esptool.py --chip esp32 -p COM6 --baud 115200 read_flash 0x0000 4194304 ../esp32.bin
esptool.py v2.8-dev
Serial port COM6
Connecting....
Chip is ESP32D0WDQ5 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: 30:ae:a4:ca:e2:48
Uploading stub...
Running stub...
Stub running...
4194304 (100 %)
4194304 (100 %)
Read 4194304 bytes at 0x0 in 379.3 seconds (88.5 kbit/s)...
Hard resetting via RTS pin...

(win36) D:\_Hardware\Arduino\esptool>
上記で得た「esp32.bin」のファイルで、esp32に復元する書き込み例を示します。
python ./esptool.py --chip esp32 -p COM6 --baud 115200 write_flash 0x0000 ../esp32.bin

MicroPtythonのインストール (esptoolを使う。)

「ESP32-DevKitC-32D 」初期化です。

マイクロUSBでPCと接続し、PCのデバイスマネージャーで 「Silicon Labs CP210x USB to UART Bridge(COM番号)」を確認します。
前述した「esptool.py」の使える環境で行います。(COM番号がCOM6の場合の例です。)
(win36) D:\_Hardware\Arduino\esptool>python ./esptool.py --chip esp32 -p COM6 --baud 115200 erase_flash
esptool.py v2.8-dev
Serial port COM6
Connecting....
Chip is ESP32D0WDQ5 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: 30:ae:a4:ca:e2:48
Uploading stub...
Running stub...
Stub running...
Erasing flash (this may take a while)...
Chip erase completed successfully in 9.8s
Hard resetting via RTS pin...

(win36) D:\_Hardware\Arduino\esptool>

バイナリをダウンロード

「https://micropython.org/download#esp32」 のページからダウンロードします。
2019-07の時点で、比較的新しい「esp32-20190125-v1.10.bin」を入手しました。

バイナリを書き込む

「esp32-20190125-v1.10.bin」が親ディレクトリにあるとして、これを書き込む例です。
(win36) D:\_Hardware\Arduino\esptool>python ./esptool.py --chip esp32 -p COM6 --baud 115200 write_flash -z 0x1000 ../esp32-20190125-v1.10.bin
esptool.py v2.8-dev
Serial port COM6
Connecting....
Chip is ESP32D0WDQ5 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: 30:ae:a4:ca:e2:48
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Auto-detected Flash size: 4MB
Compressed 1087456 bytes to 687409...
Wrote 1087456 bytes (687409 compressed) at 0x00001000 in 61.1 seconds (effective 142.3 kbit/s)...
Hash of data verified.

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

(win36) D:\_Hardware\Arduino\esptool>
Wifiのアクセスポイントとして使うための次のコードで動作確認する。
これは先頭で示したように、「ESP32-DevKitC-32D 」をUSB接続して、 Tera Term ポータブル版で、「Silicon Labs CP210x USB to UART Bridge」で接続します。
(Tera Term のシリアルで、通信速度115200bpsで接続します。)
対話形式のPythonプロンプトが出るので、ここでプログラミングします。
マフォで接続確認するとよい。
import network
station = network.WLAN(network.AP_IF)
station.active(True)

ESP-IDFでの開発

以下のリンク先からツールチェインをダウンロードし、展開(解凍)します。
https://dl.espressif.com/dl/esp32_win32_msys2_environment_and_toolchain-20181001.zip
解凍で得られる「msys32」をC:\に配置した。
これは、MinGW(ミン・ジー・ダブリュー、Minimalist GNU for Windows)と呼ばれるGNUツールチェーンをesp32利用にパッケージしたもののようです。 (MinGWは、軽量のUNIX風シェル環境とともにgccを提供しています)

そして、「msys32」の中にある「mingw32.exe」のファイルを開きます。
すると、CUIのターミナルが開きます。
>ESP-IDFでの開発で使うmakeは、pythonがインストールされていないといけないので、pythonを次のコマンドでインストールします。
同時にpipのインストール、pythonへのpyserialモジュールの追加も行っています。
pacman -S python
python -m pip install --upgrade pip

次は[ESP-IDF]のインストールで、コマンド操作を行います。
mkdir -p ~/esp
cd ~/esp
git clone -b v3.1.2 --recursive https://github.com/espressif/esp-idf.git
python -m pip install --user -r /home/yuu/esp/esp-idf/requirements.txt
この操作で、「C:\msys32\home\ユーザー名\esp」の所に、esp用SDKである[ESP-IDF]が配置されます。
続けて、環境変数設定用のファイル「export_idf_path.sh」を以下の内容で作成します。
Windows用プロンプトより「notepad C:\msys32\etc\profile.d\export_idf_path.sh」の操作のメモ帳で作成可能です。
export IDF_PATH="C:/msys32/home/<ユーザー名>/esp/esp-idf"
ここで一度閉じて、「mingw32.exe」を再び開きます。
そして、「printenv IDF_PATH」のコマンド操作で、環境変数IDF_PATHが正しく設定されているか確認するとよいでしょう。

次のコマンド操作で、サンプルのhello_worldをビルドできます。
cd ~/esp
cp -r $IDF_PATH/examples/get-started/hello_world .
cd ~/esp/hello_world
make menuconfig
make