LoginSignup
24
28

More than 3 years have passed since last update.

ESP32 (ESP-WROOM-32) 事始め

Last updated at Posted at 2017-04-30

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に出してくれているようです。

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
~/.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
~/.bash_profile
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

ESP32 Software

24
28
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
28