ESP-IDFをMacにセットアップしてESP32-DevKitCでLチカ


会社のテック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を利用した開発環境で必要となるものがまとめられています。

  1. PC
  2. Toolchain
  3. ESP-IDF
  4. テキストエディタ
  5. 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が点滅を始めます。

,