Overview
ワンコイン WiFi Arduinoとして ESP8266 は大変有名ですが、この後継として、 WiFi だけでなく、Bluetooth も 加わり、 Dual Core になって、かつ、GPIOなどのperipheralも充実した後継の ESP-WROOM-32 でましたよね。
(ESP8266での参考: GWだし、ESP8266関係の記事をまとめながら、IoT framework作ってみる)
ただ、ピンのピッチが通常の2.54mmから、ハーフピッチの1.27mmということや、長い休みもなかったので、放置していましたが、 ESP32-DevKitC ESP-WROOM-32開発ボード も購入し、GWなので、遊んでみることにします。
このDevKitは、LDO や USB-UART bridge も基板上に乗っているので、単にmicro USBとPCを接続するだけで、開発を始められるという便利なものです。そして、十分に小さいので、サイズを追い求める以外はこれで十分かもしれません。最初からピンヘッダーも出ていますのでブレッドボードに挿して色々と試してみるのにも適しています。
おさらい
W-ROOM-32 や ESP32-DevKitC の pin配列
以下からわかるように、ESP32-DevKitCは基本的にW-ROOM-32のpinを全てpin headerに出してくれているようです。
- ESP-WROOM-32 : http://akizukidenshi.com/download/ds/espressifsystems/esp_wroom_32_datasheet_en.pdf
- ESP32-DevKitの回路図 : http://akizukidenshi.com/download/ds/espressifsystems/ESP32-Core-Board-V2_sch.pdf
W-ROOM-32 pin | W-ROOM-32 Desc | ESP32-DevKitC pin | ESP32-DevKitC | Mux |
---|---|---|---|---|
1 | GND | J3:7 & J3:1 | GND | |
2 | 3V3 | J2:1 | VDD33 | 2.2-3.6V / Average 80mA |
3 | EN | J2:2 | EN | Active High |
4 | SENSOR_VP | J2:3 | SENSOR_VP | GPI36, ADC_H, ADC1_CH0, RTC_GPIO0 |
5 | SENSOR_VN | J2:4 | SENSOR_VN | GPI39, ADC_H, ADC1_CH3, RTC_GPIO3 |
6 | IO34 | J2:5 | IO34 | GPI34, ADC1_CH6, RTC_GPIO4 |
7 | IO35 | J2:6 | IO35 | GPI35, ADC1_CH7, RTC_GPIO5 |
8 | IO32 | J2:7 | IO32 | GPIO32, XTAL_32K_P, ADC1_CH4, TOUCH9, RTC_GPIO9 |
9 | IO33 | J2:8 | IO33 | GPIO33, XTAL_32K_N, ADC1_CH5, TOUCH8, RTC_GPIO8 |
10 | IO25 | J2:9 | IO25 | GPIO25, DAC_1, ADC2_CH8, RTC_GPIO6, EMAC_RXD0 |
11 | IO26 | J2:10 | IO26 | GPIO26, DAC_2, ADC2_CH9, RTC_GPIO17, EMAC_RXD1 |
12 | IO27 | J2:11 | IO27 | GPIO27, ADC2_CH7, TOUCH7, RTC_GPIO17, EMAC_RX_DV |
13 | IO14 | J2:12 | IO14 | GPIO14, ADC2_CH6, TOUCH6, RTC_GPIO16, MTMS, HSPICLK, HS2_CLK, SD_CLK, EMAC_TXD2 |
14 | IO12 | J2:13 | IO12 | GPIO12, ADC2_CH5, TOUCH5, RTC_GPIO15, MTDI, HSPIQ, HS2_DATA2, SD_DATA2, EMAC_TXD3 |
15 | GND | J2:14 | GND | |
16 | IO13 | J2:15 | IO13 | GPIO13, ADC2_CH4, TOUCH4, RTC_GPIO14, MTCK, HSPID, HS2_DATA3, SD_DATA3, EMAC_RX_ER |
17 | SD2 | J2:16 | SD2 | GPIO9, SD_DATA2, SPIHD, HS1_DATA2, U1RXD |
18 | SD3 | J2:17 | SD3 | GPIO10, SD_DATA3, SPIWP, HS1_DATA3, U1TXD |
19 | CMD | J2:18 | CMD | GPIO11, SD_CMD, SPICS0, HS1_CMD, U1RTS |
20 | CLK | GPIO6, SD_CLK, SPICLK, HS1_CLK, U1CTS | ||
21 | SD0 | J3:18 | SD0 | GPIO7, SD_DATA0, SPIQ, HS1_DATA0, U2RTS |
22 | SD1 | J3:17 | SD1 | GPIO8, SD_DATA1, SPID, HS1_DATA1, U2CTS |
23 | IO15 | J3:16 | IO15 | GPIO15, ADC2_CH3, TOUCH3, MTDO, HSPICS0, RTC_GPIO13, HS2_CMD, SD_CMD, EMAC_RXD3 |
24 | IO2 | J3:15 | IO2 | GPIO2, ADC2_CH2, TOUCH2, RTC_GPIO12, HSPIHD, HS2_DATA1, SD_DATA0 |
25 | IO0 | J3:14 | IO0 | GPIO0, ADC2_CH1, TOUCH1, RTC_GPIO11, CLK_OUT1, EMAC_TX_CLK |
26 | IO4 | J3:13 | IO4 | GPIO4, ADC2_CH0, TOUCH0, RTC_GPIO10, HSPIHD, HS2_DATA1, SD_DATA1, EMAC_TX_ER |
27 | IO16 | J3:12 | IO16 | GPIO16, HS1_DATA4, U2RXD, EMAC_CLK_OUT |
28 | IO17 | J3:11 | IO17 | GPIO17, HS1_DATA5, U2TXD, EMAC_CLK_OUT_180 |
29 | IO5 | J3:10 | IO5 | GPIO5, VSPICS0, HS1_DATA6, EMAC_RX_CLK |
30 | IO18 | J3:9 | IO18 | GPIO18, VSPICLK, HS1_DATA7 |
31 | IO19 | J3:8 | IO19 | GPIO19, VSPIQ, U0CTS, EMAC_TXD0 |
32 | NC | |||
33 | IO21 | J3:6 | IO21 | GPIO21, VSPIHD, EMAC_TX_EN |
34 | RXD0 | J3:5 | RXD0 | GPIO3, U0RXD, CLK_OUT2 |
35 | TXD0 | J3:4 | TXD0 | GPIO1, U0TXD, CLK_OUT3, EMAC_RXD2 |
36 | IO22 | J3:3 | IO22 | GPIO22, VSPIWP, U0RTS, EMAC_TXD1 |
37 | IO23 | J3:2 | IO23 | GPIO23, VSPID, HS1_STROBE |
38 | GND | J3:7 & J3:1 | GND | |
J2:19 | EXT_5V |
Peripherals
Interface | Channels | Description |
---|---|---|
ADC | 16 ports | 2ch 12bit SAR ADCs (6+10) |
Ultra Low Noise Analog | 2ch | 60dB gain by using larger capacitors |
DAC | 2ch | 8bit |
Touch | 10ch | Capacitive touch sensor |
SD/SDIO/MMC Host Controller | 1ch | SD memory card v3.01. 4bit |
SDIO Slave | 1ch | SDIO2.0 slave |
Motor PWM | 3ch of 16bit timers generated PWM wave form | |
LED PWM | 16ch | 80MHz/16bits |
UART | 3ch | 2ch UART (U0/U1/U2) |
I2C | 2ch | master/slave |
I2S/LCD | 1ch | Stereo I/O , Parallell LCD data output |
Ir | 8ch | 8ch IR transmitter transmitter / receiver |
Parallel QSPI | 3ch | Standard SPI, Dual SPI, Quad SPI |
General Purpose SPI | 1ch | 64byte FIFO and DMA. |
EMAC | 1ch | Ethernet MAC with MII/RMII interface |
JATG | 1ch | Muxed with IO12-15 |
Backup original ROM
まずは、出荷時に焼かれているfirmwareをbackupしておきましょう。
esptool.py
今はesprissifにメンテされているesptoolで行いましょう。
$ git clone https://github.com/espressif/esptool.git
$ cd esptool
DevKitは32MBitsなので、4MBなので、
$ ./esptool.py --chip esp32 --port /dev/tty.SLAB_USBtoUART --baud 921600 read_flash 0x0000 4194304 ../esp32.bin
M5StickCの場合は以下のようにbaudrateを落としてみてください。
$ python3 ./esptool.py --chip esp32 --port /dev/tty.usbserial-xxx --baud 115200 read_flash 0x0000 4194304 ../esp32-m5stickc.bin
で、とりあえず、全バックアップ。
start addr | descritption |
---|---|
0x1000 | bootloader.bin |
0x8000 | partitions_singleapp.bin |
0x10000 | your app |
開発環境のsetup
ESP8266 では、 Arduinoとして使う方が多いですが、せっかくesprissifが、FreeRTOSベースの
IoT Development Framework を公開してくれているので、今回はそれを使ってみましょう。
参考:
- http://www.espressif.com/sites/default/files/documentation/esp-idf_getting_started_guide_en.pdf
- http://esp-idf.readthedocs.io/en/latest/get-started/macos-setup-scratch.html
CP210x driver install (optional)
ESP32-DevKitにはCP210xが搭載されていますので、USB UARTのドライバーの準備が必要です。
(よく使われているので既に環境構築済みの方はskip可能)
Required Package の install (optional)
(よく使われているので既に環境構築済みの方はskip可能)
$ brew install flex bison gperf
$ brew install gnu-sed gawk binutils gperftools gettext wget help2man libtool autoconf automake
brew update
して、$ Error: /usr/local must be writable!
が出る場合は、
$ sudo chgrp -R admin /usr/local
$ sudo chmod -R g+w /usr/local
$ brew update
$ brew upgrade
などで対策を。
install toolchain
ESP32 IDFには必須。
versionはとりあえず以下をinstallしてみて、version incompatibleと出た場合は、expectと出ているversionを入れてください。
$ wget https://dl.espressif.com/dl/xtensa-esp32-elf-osx-1.22.0-61-gab8375a-5.2.0.tar.gz
$ tar zxvf xtensa-esp32-elf-osx-1.22.0-61-gab8375a-5.2.0.tar.gz -C ~/bin
$ vi ~/.bash_profile
export PATH=~/bin/xtensa-esp32-elf/bin:$PATH
$ source ~/.bash_profile
$ xtensa-esp32-elf-gcc --version
xtensa-esp32-elf-gcc (crosstool-NG crosstool-ng-1.22.0-61-gab8375a) 5.2.0
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
pdfに入っているversionは古いので、新しいこの5.2.0が、4/30/2017時点では必要でした。
Download ESP-IDF
$ git clone --recursive https://github.com/espressif/esp-idf
export IDF_PATH=~/work/esp-idf
$ source ~/.bash_profile
example を buildする
$ cp -r ~/work/esp-idf/examples/get-started/hello_world ~/work
$ cd ~/work/hello_world
$ make menuconfig
Default serial port を /dev/cu.SLAB_USBtoUART
に設定 (ESP32-DevKitCのようにCP2102場合)
$ make all
$ make flash
で焼けるみたいです。
make flash
Flashing binaries to serial port /dev/cu.SLAB_USBtoUART (app at offset 0x10000)...
esptool.py v2.0-beta3
Connecting........_
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Auto-detected Flash size: 4MB
Flash params set to 0x0220
Compressed 15824 bytes to 9223...
Wrote 15824 bytes (9223 compressed) at 0x00001000 in 0.8 seconds (effective 155.0 kbit/s)...
Hash of data verified.
Compressed 363152 bytes to 171924...
..snip..
Wrote 3072 bytes (82 compressed) at 0x00008000 in 0.0 seconds (effective 2140.0 kbit/s)...
Hash of data verified.
Leaving...
Hard resetting...
こんな風に。
実行
$ screen /dev/tty.SLAB_USBtoUART 115200
で、terminalを開いて
ets Jun 8 2016 00:22:57
rst:0xc (SW_CPU_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:0x3fff0008,len:8
load:0x3fff0010,len:4404
load:0x40078000,len:11092
load:0x40080000,len:252
entry 0x40080034
I (45) boot: ESP-IDF v2.0-rc1-725-g07b61d5 2nd stage bootloader
I (45) boot: compile time 22:01:22
I (46) boot: Enabling RNG early entropy source...
I (64) boot: SPI Speed : 40MHz
I (77) boot: SPI Mode : DIO
I (89) boot: SPI Flash Size : 4MB
I (101) boot: Partition Table:
I (113) boot: ## Label Usage Type ST Offset Length
I (135) boot: 0 nvs WiFi data 01 02 00009000 00006000
I (159) boot: 1 phy_init RF data 01 01 0000f000 00001000
I (182) boot: 2 factory factory app 00 00 00010000 00100000
I (205) boot: End of partition table
I (218) boot: Disabling RNG early entropy source...
I (235) boot: Loading app partition at offset 00010000
I (761) boot: segment 0: paddr=0x00010018 vaddr=0x00000000 size=0x0ffe8 ( 65512)
I (762) boot: segment 1: paddr=0x00020008 vaddr=0x3f400010 size=0x0660c ( 26124) map
I (778) boot: segment 2: paddr=0x0002661c vaddr=0x3ffb0000 size=0x02ae4 ( 10980) load
I (808) boot: segment 3: paddr=0x00029108 vaddr=0x40080000 size=0x00400 ( 1024) load
I (831) boot: segment 4: paddr=0x00029510 vaddr=0x40080400 size=0x12a7c ( 76412) load
I (893) boot: segment 5: paddr=0x0003bf94 vaddr=0x400c0000 size=0x00000 ( 0) load
I (894) boot: segment 6: paddr=0x0003bf9c vaddr=0x00000000 size=0x0406c ( 16492)
I (914) boot: segment 7: paddr=0x00040010 vaddr=0x400d0018 size=0x28a68 (166504) map
I (940) cpu_start: Pro cpu up.
I (951) cpu_start: Starting app cpu, entry point is 0x40080d30
I (0) cpu_start: App cpu up.
I (984) heap_alloc_caps: Initializing. RAM available for dynamic allocation:
I (1006) heap_alloc_caps: At 3FFAE2A0 len 00001D60 (7 KiB): DRAM
I (1027) heap_alloc_caps: At 3FFB60A8 len 00029F58 (167 KiB): DRAM
I (1048) heap_alloc_caps: At 3FFE0440 len 00003BC0 (14 KiB): D/IRAM
I (1069) heap_alloc_caps: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (1091) heap_alloc_caps: At 40092E7C len 0000D184 (52 KiB): IRAM
I (1112) cpu_start: Pro cpu start user code
I (1169) cpu_start: Starting scheduler on PRO CPU.
Hello world!
Restarting in 10 seconds...
I (204) cpu_start: Starting scheduler on APP CPU.
Restarting in 9 seconds...
Restarting in 8 seconds...
Restarting in 7 seconds...
Restarting in 6 seconds...
Restarting in 5 seconds...
Restarting in 4 seconds...
みたいになっていれば成功です。
つづく。
開発環境構築
Eclipse
Eclipseを使って開発が可能です. しかし全てではなく、 make menuconfig
みたいのは必須です。
- コード開発支援
- build
- flash
IDF Monitor
$ make monitor
- 基本的にはserial terminalプログラムです.
- 関数名の自動表示 (
0x4________
のようなアドレスを、addr2line
を使って、関数名やコードの場所を示しま -
Ctrl+J
: Exit -
Ctrl+T
Ctrl-H
: help -
Ctrl+T
Ctrl+F
: Quick compile & Flash :make flash
-
Ctrl+T
Ctrl+A
: Quick compile & Flash :make app-flash
-
Ctrl+T
Ctrl+R
: Quick Reset
- 関数名の自動表示 (
GDBStub
$ make menuconfig
AtComponent config
-> ESP32-specific
-> Panic handler behaviour
, select Invoke GDBStub
optionが有効な際には、idf_monitor経由で利用できます。
参考 : Mac の screen の 終了のさせ方
screen の画面で control + a を押して、次に k を押し、Really kill this window [y/n] と表示されるので、 y
Appendix
ESP32 hardware
-
Datasheet : http://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf
-
Pin list : http://www.espressif.com/sites/default/files/documentation/esp32_chip_pin_list_en.pdf
-
Pin out : http://www.espressif.com/en/support/download/documents?keys=ESP32+Pinout&field_type_tid%5B%5D=13
-
Technical Reference Manual : http://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf
-
Hardware Design Guide : http://www.espressif.com/sites/default/files/documentation/esp32_hardware_design_guidelines_en.pdf
-
ESP32 / ESP32-DevKit Schematic : http://esp-idf.readthedocs.io/en/latest/hw-reference/modules-and-boards.html#esp32-core-board-v2-esp32-devkitc
-
Errata : http://espressif.com/sites/default/files/documentation/eco_and_workarounds_for_bugs_in_esp32_en.pdf
-
start guide : http://www.espressif.com/sites/default/files/documentation/esp-idf_getting_started_guide_en.pdf
ESP32 Software