会社のテックWebマガジン コピペテック の電子工作ネタ用にESP32について調べています。
まずはHello Worldとして、ESP32用の開発環境ESP-IDFをMacにセットアップし、ESP32開発用ボード ESP32-DevKitCでLチカしてみました。
開発ボードは秋月電子通商で購入した「ESP32-DevKitC ESP-WROOM-32 開発ボード」で試しています。
ESP32の開発環境は、主にArduino IDEとESP-IDFがあり、
Arduino IDEの方が使い勝手が良いように思いますが、Arduinoと比べてESP32のメリットであるMicroPythonによる開発をするためにはESP-IDFをベースとした環境が必要になります。
そこでまずはESP-IDFによる開発手順も確認してみたので、それをまとめてみました。
(その後調べてわかったことですが、ESP32用のMicroPythonファームウェアはバイナリでも配布されているので、こちらの Firmware for ESP32 boards を使ったほうが簡単にセットアップでます。参考: ESP32でMicroPythonを試す!簡単ですぐできました!)
ESP-IDFを利用するために必要なもの
Get Started > What You Need にESP-IDFを利用した開発環境で必要となるものがまとめられています。
- PC
- Toolchain
- ESP-IDF
- テキストエディタ
- ESP32ボード本体とUSBケーブル
Toolchainは、ESP32用のアプリケーションのビルドツールです。
ESP-IDFは、ESP32用の基本APIとToolchainを使用するためのスクリプトを提供する開発フレームワークになります。
Toolchainのセットアップ
Standard Setup of Toolchain for Mac OSに従ってToolchainをセットアップします。
ESP32 toolchain for macOS を https://dl.espressif.com/dl/xtensa-esp32-elf-osx-1.22.0-80-g6c4433a-5.2.0.tar.gz からダウンロードして、ファイルをespディレクトリに展開します。
$ mkdir -p ~/esp
$ cd ~/esp
$ tar -xzf ~/Downloads/xtensa-esp32-elf-osx-1.22.0-80-g6c4433a-5.2.0.tar.gz
~/esp/xtensa-esp32-elf/bin
をパスに通します。
.bash_profile
などに設定する場合は、以下を追加します。
export PATH=$PATH:$HOME/esp/xtensa-esp32-elf/bin
ESP-IDFの取得
~/esp
ディレクトリにesp-idfをクローンします。
$ cd ~/esp
$ git clone --recursive https://github.com/espressif/esp-idf.git
ESP-IDFをパスに通す
.bash_profile
などに以下の変数IDF_PATH
を追加します。
export IDF_PATH=~/esp/esp-idf
参考: Add IDF_PATH to User Profile > Linux and MacOS
必要なPythonライブラリのインストール
Install the Required Python Packagesを参考に以下のコマンドを実行
python -m pip install --user -r $IDF_PATH/requirements.txt
requirements.txt
を確認してみると、パッケージは以下のものが含まれていました。
setuptools
pyserial>=3.0
future>=0.16.0
cryptography
Python自体のバージョンについては、Install the Required Python PackagesのNoteに、Pythonのバージョンは2.7系が推奨っぽく書いてありますが、3.6.5でも問題ありませんでした。
ESP32をPCにつなぐ
ESP32-DevKitC用のドライバをインストールします。
CP210x USB to UART Bridge VCP Drivers からMac OS用のものをダウンロードしてインストールします。
Check port on Linux and MacOSを参考にポートを確認します。
$ ls /dev/cu.*
/dev/cu.Bluetooth-Incoming-Port /dev/cu.lpss-serial1
/dev/cu.SLAB_USBtoUART /dev/cu.lpss-serial2
/dev/cu.SLAB_USBtoUART
が確認できます。
プロジェクトの構成
Get Started > Configureに従って、hello_worldプロジェクトを動かしてみます。
cd ~/esp/hello_world
make menuconfig
ESP-IDF プロジェクトの構成ウィザードが開きます。
“Serial Flasher config —>”を選択してEnter
“Default serial port”を選択してEnter
“/dev/cu.SLAB_USBtoUART”を入力して”OK”を選択してEnter
“Save”を選択してEnter
保存先を確認して”OK”を選択してEnter
確認して”Exit”を選択してEnter
あとは、”Exit”を選択してEnterを2回して閉じます
ビルドしてESP32に転送
make flash
コマンドを実行するとプログラムをビルドしESP32に転送してくれます。
$ make flash
esptool.py v2.5.0
Building partitions from /Users/hrendoh/esp/esp-idf/components/partition_table/partitions_singleapp.csv...
CC build/app_trace/app_trace.o
...
Compressed 3072 bytes to 103...
Wrote 3072 bytes (103 compressed) at 0x00008000 in 0.0 seconds (effective 1784.9 kbit/s)...
Hash of data verified.
Leaving...
Hard resetting via RTS pin...
Make Monitorで動作確認
make monitor
で動作を確認することができます。
Hello Worldは一定間隔でプログラムを再起動して、「Hello World」と表示します。
$ make monitor
MONITOR
--- idf_monitor on /dev/cu.SLAB_USBtoUART 115200 ---
--- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
ets Jun 8 2016 00:22:57
rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0018,len:4
load:0x3fff001c,len:5868
load:0x40078000,len:9076
load:0x40080400,len:6148
entry 0x40080748
I (28) boot: ESP-IDF v3.2-dev-481-gee3f64cb 2nd stage bootloader
I (28) boot: compile time 17:14:01
I (28) boot: Enabling RNG early entropy source...
I (34) boot: SPI Speed : 40MHz
I (38) boot: SPI Mode : DIO
I (42) boot: SPI Flash Size : 4MB
I (46) boot: Partition Table:
I (50) boot: ## Label Usage Type ST Offset Length
I (57) boot: 0 nvs WiFi data 01 02 00009000 00006000
I (65) boot: 1 phy_init RF data 01 01 0000f000 00001000
I (72) boot: 2 factory factory app 00 00 00010000 00100000
I (80) boot: End of partition table
I (84) esp_image: segment 0: paddr=0x00010020 vaddr=0x3f400020 size=0x0584c ( 22604) map
I (101) esp_image: segment 1: paddr=0x00015874 vaddr=0x3ffb0000 size=0x02298 ( 8856) load
I (105) esp_image: segment 2: paddr=0x00017b14 vaddr=0x3ffb2298 size=0x00000 ( 0) load
I (111) esp_image: segment 3: paddr=0x00017b1c vaddr=0x40080000 size=0x00400 ( 1024) load
0x40080000: _WindowOverflow4 at /Users/hrendoh/esp/esp-idf/components/freertos/xtensa_vectors.S:1685
I (120) esp_image: segment 4: paddr=0x00017f24 vaddr=0x40080400 size=0x080ec ( 33004) load
I (142) esp_image: segment 5: paddr=0x00020018 vaddr=0x400d0018 size=0x11128 ( 69928) map
0x400d0018: _flash_cache_start at ??:?
I (167) esp_image: segment 6: paddr=0x00031148 vaddr=0x400884ec size=0x007b8 ( 1976) load
0x400884ec: esp_rom_spiflash_read_data at /Users/hrendoh/esp/esp-idf/components/spi_flash/spi_flash_rom_patch.c:412
I (168) esp_image: segment 7: paddr=0x00031908 vaddr=0x400c0000 size=0x00000 ( 0) load
I (174) esp_image: segment 8: paddr=0x00031910 vaddr=0x50000000 size=0x00000 ( 0) load
I (188) boot: Loaded app from partition at offset 0x10000
I (189) boot: Disabling RNG early entropy source...
I (194) cpu_start: Pro cpu up.
I (198) cpu_start: Starting app cpu, entry point is 0x40080e74
0x40080e74: call_start_cpu1 at /Users/hrendoh/esp/esp-idf/components/esp32/cpu_start.c:225
I (0) cpu_start: App cpu up.
I (208) heap_init: Initializing. RAM available for dynamic allocation:
I (215) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
I (221) heap_init: At 3FFB32E8 len 0002CD18 (179 KiB): DRAM
I (228) heap_init: At 3FFE0440 len 00003BC0 (14 KiB): D/IRAM
I (234) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (240) heap_init: At 40088CA4 len 0001735C (92 KiB): IRAM
I (247) cpu_start: Pro cpu start user code
I (265) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
Hello world!
This is ESP32 chip with 2 CPU cores, WiFi/BT/BLE, silicon revision 1, 4MB external flash
Restarting in 10 seconds...
Restarting in 9 seconds...
Restarting in 8 seconds...
Restarting in 7 seconds...
Restarting in 6 seconds...
Restarting in 5 seconds...
Restarting in 4 seconds...
Restarting in 3 seconds...
Restarting in 2 seconds...
Restarting in 1 seconds...
Restarting in 0 seconds...
Restarting now.
ets Jun 8 2016 00:22:57
...
Ctrl+]
で終了できます。
Lチカ
購入したESP32開発ボードにはオンボードLEDが無いので、ブレッドボード上にLEDと抵抗を配線して確認してみます。
一般的にLEDは1mA〜10mAで点灯するらしいので(参考: LEDの使い方 | マルツオンライン )、GPIOのOutput LevelがHighのときは3Vくらいであることを考慮して抵抗は330Ωのものを使用します。
実測の電圧は確かに3V弱で、9mA強の電流がLEDに流れるようになりました。
参考: ESP32 Series DataSheet 5.3 DC Characteristics (3.3 V, 25 °C)
この図のように、IO4のPIN13からLEDのアノード側(足の長い方)を、カソードと抵抗をつないで、抵抗をGND のPIN7につなげます。
参考: 秋月電子通称 ESP32-DevkKitC > ESP32-DevKitC PDF回路図のConnector
Lチカのコードは、ESP-IDF template appのものを利用します。
$ cd ~/esp
$ git clone https://github.com/espressif/esp-idf-template.git led-blinking
$ cd led-blinking
$ make menuconfig
make menuconfig
はプロジェクトごとに必要です。
LED点滅のコードはmain/main.c
の以下の箇所になります。
// main/main.c
...
void app_main(void)
{
...
gpio_set_direction(GPIO_NUM_4, GPIO_MODE_OUTPUT);
int level = 0;
while (true) {
gpio_set_level(GPIO_NUM_4, level);
level = !level;
vTaskDelay(300 / portTICK_PERIOD_MS);
}
}
make flash
でESP32にプログラムを流します。
$ make flash
転送が終わると、LEDが点滅を始めます。