wiki:esp32_tips

Version 15 (modified by kishida, 2 years ago) (diff)

--

ESP-WROOM-32に関するTIPS

ESP-WROOM-32は、Xtensa Dual-Core 32-bit LX6 マイクロプロセッサを搭載する、上海のESPRESSIF社が開発した無線モジュールです。WiFiとBluetooth v4.2に対応しています。 開発ボードはスイッチサイエンスでも販売されている(要追記)他にも、ESPRESSIF社からESP32-DevKitCなどが発売さています。

本ページでは、無線モジュール ESP-WROOM-32の各種機能をArduinoとして使うにあたってのサンプルスケッチや注意点などを解説します。 ESP32と呼ぶときはコントローラーそのもの、無線モジュール全体を指すときはESP-WROOM-32と記述しています。

ESP-WROOM-32は本記事執筆時点(2017/4~5月)でも頻繁にライブラリにアップデートがあります。記事中の内容は最新の状態とは異なる場合があるため注意してください。特に、GitHubのコードの特定行への参照は古いものの可能性が高くなっています。

資料について


ESP-WROOM-32のピンアサイン

ESP32 Datasheet(PDF)より抜粋。 より詳しく各ピン別の機能を見る際はESP32 Pinoutを参照してください。

NameNo.TypeFunction
GND1PGround
3V32PPower supply.
EN3IChip-enable signal. Active high.
SENSOR_VP4IGPIO36, SENSOR_VP, ADC_H, ADC1_CH0, RTC_GPIO0
SENSOR_VN5IGPIO39, SENSOR_VN, ADC1_CH3, ADC_H, RTC_GPIO3
IO346IGPIO34, ADC1_CH6, RTC_GPIO4
IO357IGPIO35, ADC1_CH7, RTC_GPIO5, GPIO32, XTAL_32K_P (32.768 kHz crystal oscillator input), ADC1_CH4,
IO328I/OTOUCH9, RTC_GPIO9, GPIO33, XTAL_32K_N (32.768 kHz crystal oscillator output), ADC1_CH5,
IO339I/OTOUCH8, RTC_GPIO8
IO2510I/OGPIO25, DAC_1, ADC2_CH8, RTC_GPIO6, EMAC_RXD0
IO2611I/OGPIO26, DAC_2, ADC2_CH9, RTC_GPIO7, EMAC_RXD1
IO2712I/OGPIO27, ADC2_CH7, TOUCH7, RTC_GPIO17, EMAC_RX_DV, GPIO14, ADC2_CH6, TOUCH6, RTC_GPIO16, MTMS, HSPICLK,
IO1413I/OHS2_CLK, SD_CLK, EMAC_TXD2, GPIO12, ADC2_CH5, TOUCH5, RTC_GPIO15, MTDI, HSPIQ,
IO1214I/OHS2_DATA2, SD_DATA2, EMAC_TXD3
GND15PGround, GPIO13, ADC2_CH4, TOUCH4, RTC_GPIO14, MTCK, HSPID,
IO1316I/OHS2_DATA3, SD_DATA3, EMAC_RX_ER
SHD/SD2*17I/OGPIO9, SD_DATA2, SPIHD, HS1_DATA2, U1RXD
SWP/SD3*18I/OGPIO10, SD_DATA3, SPIWP, HS1_DATA3, U1TXD
SCS/CMD*19I/OGPIO11, SD_CMD, SPICS0, HS1_CMD, U1RTS
SCK/CLK*20I/OGPIO6, SD_CLK, SPICLK, HS1_CLK, U1CTS
SDO/SD0*21I/OGPIO7, SD_DATA0, SPIQ, HS1_DATA0, U2RTS
SDI/SD1*22I/OGPIO8, SD_DATA1, SPID, HS1_DATA1, U2CTS, GPIO15, ADC2_CH3, TOUCH3, MTDO, HSPICS0, RTC_GPIO13,
IO1523I/OHS2_CMD, SD_CMD, EMAC_RXD3, GPIO2, ADC2_CH2, TOUCH2, RTC_GPIO12, HSPIWP, HS2_DATA0,
IO224I/OSD_DATA0, GPIO0, ADC2_CH1, TOUCH1, RTC_GPIO11, CLK_OUT1,
IO025I/OEMAC_TX_CLK, GPIO4, ADC2_CH0, TOUCH0, RTC_GPIO10, HSPIHD, HS2_DATA1,
IO426I/OSD_DATA1, EMAC_TX_ER
IO1627I/OGPIO16, HS1_DATA4, U2RXD, EMAC_CLK_OUT
IO1728I/OGPIO17, HS1_DATA5, U2TXD, EMAC_CLK_OUT_180
IO529I/OGPIO5, VSPICS0, HS1_DATA6, EMAC_RX_CLK
IO1830I/OGPIO18, VSPICLK, HS1_DATA7
IO1931I/OGPIO19, VSPIQ, U0CTS, EMAC_TXD0
NC32--
IO2133I/OGPIO21, VSPIHD, EMAC_TX_EN
RXD034I/OGPIO3, U0RXD, CLK_OUT2
TXD035I/OGPIO1, U0TXD, CLK_OUT3, EMAC_RXD2
IO2236I/OGPIO22, VSPIWP, U0RTS, EMAC_TXD1
IO2337I/OGPIO23, VSPID, HS1_STROBE
GND38PGround
GND39PGround

*がついているピン(GPIO6~11)はモジュール内部でSPIフラッシュメモリに接続されているため、他の用途での利用は推奨されません。また、後述するピンマトリクス機能においても、GPIO6~11を別の機能に割り当てることは推奨されません。

GPIOマトリクス機能について

各種ペリフェラルを説明する前に、本機能について少し説明します。Arduinoからは離れた話なので、Arduinoとして少し使うぶんには気にしなくとも問題ありません。詳細については、説明しきれない部分が多いため、以下の資料を御覧ください。

ESP32 PinoutNote.12にある通り、内蔵ペリフェラル用の信号は設定によって好きなピンに再割り当てすることが可能です。

回路ブロック図に関しては、ESP32 Technical Reference Manual4. IO_MUX and GPIO Matrixが詳しいです。

ESP32には「(物理的な)ピン」「IO MUX」「GPIO マトリックス」という3つの回路があります。ピンに対してはIO MUXが接続されています。一つのピンは内蔵機能またはGPIOとして割り当てる事ができます。これをIO MUXにて行います。

IO MUXにてGPIOに割り当てられたピンは、GPIO マトリックスにて機能の割り当てを行うことができます。GPIOマトリックスは、入力と出力を文字通り自由に組み替えら得れる回路になっており、ピンへの入力を内蔵ペリフェラルピンに割り当てたり、逆にペリフェラルピンを出力ピンに接続したりできます。

このGPIOマトリックスにて操作できるものは、基本的に内蔵ペリフェラルほぼ全てです。よって、他のデバイスとのコミュニケーションにはおおよそ好きなピンを利用することができます。

ただし、以下の制約があります。

  • GPIO 34~39 ピンは出力には使えない
  • GPIO 0,2 ピンは回路的にブートモードの設定に利用されることがあり、実際ほぼこの通り使われていると考えます
  • GPIO 1,3 ピンは回路的にUART通信(U0RXD、U0TXD)に利用されることがあり、実際ほぼこの通り使われていると考えます
  • GPIO 12 は内蔵LDOの電圧設定に利用されることがある
  • GPIO 15 はU0TXDピンのデバッグログの設定に利用されることがある
  • Ethernet, SDIO, SPI, JTAG, UARTなどの高速信号は、パフォーマンス低下を回避するためにGPIOマトリクスを介さないで接続可能なものがあり、その場合は出力ピンが固定される
  • GPIO 6~11 はESP-WROOM-32モジュール内部では既にFLASHメモリと接続されている

特に、GPIO 0,1,2,3に関しては電圧を固定してしまうと以降ArduinoIDEなどからのスケッチの書き込みができなくなるため、注意が必要です。更には、ESP-WROOM-32モジュールには内蔵FLASHメモリのために幾つかの回路が配線済みであるため、SDIO Slaveの機能やParallel QSPIといった機能は使えません。

SPI通信

内部の仕様について

ESP-WROOM-32に搭載されているコントローラーにはSPIモジュールが3つ内蔵されています。それぞれ、

  • SPI
  • HSPI
  • VSPI

の名称がつけられています。このうち、SPIに関しては上記ピンアサインの項目の通りFSPIとして内蔵FLASHとの接続に使われています。よって、普段周辺機器を接続する際にはHSPIもしくはVSPIの回路を利用することになります。この2つに関しては、SlaveとMasterどちらも利用可能です。

一方で、ArduinoのSPIライブラリは、ライブラリ中に定義されるように、VSPI回路を利用します。更に、独自にSPIクラスをインスタンス化すると、こちらにあるようにHSPIが利用されます。例えば、SPIclass SPI2;とやると、SPI2インスタンスはHSPI回路を利用し、標準のSPIインスタンスとは別の回路で動きます。

各SPIモジュールのピンアサインは以下の通りです。ただし、GPIOマトリックスの項目で説明した通り、比較的自由にリマッピング可能です。

  • HSPI - SCK,MISO,MOSI,SS = 14,12,13,15
  • VSPI - SCK,MISO,MOSI,SS = 18,19,23,5

ピンを指定するときは、SPI.begin(SCK, MISO, MOSI, SS);というふうに引数を指定します。

サンプルスケッチ

以上の仕様と、GPIOマトリックス機能を合わせると、ものによってはブレッドボードに上手く挿すだけでジャンパワイヤなしに通信が可能です。

I2C通信

内部の仕様について

SPI通信と同じく、内蔵回路は2つ(I2C0とI2C1)あります。基本的なピンアサインは以下のとおりです。

  • I2C0 - SDA,SCL = 21,22
  • I2C1 - 未定義

未定義、というのも、I2C通信の回路のSDA、SCLピンはGPIOマトリクスのみに接続されているため、IO MUXに直結(=高速通信のために物理ピンに直結)していません。GPIOマトリクス経由で自由に再マッピングできます。もしI2C1回路を使う場合は、このあたりを参考に、Towire Wire2(1);などと宣言すると良さそうです。

ピンを指定するときはWire.begin(SDA, SCK);もしくはWire.begin(SDA, SCL, FREQ);というふうに引数を指定します。FREQuint32_t型の動作周波数で、標準では100kHzです。

サンプルスケッチ

SPI通信のときと同じように、ものによってはブレッドボードに上手く挿すだけでジャンパワイヤなしに通信が可能です。

GPIO

基本的に一般的なArduinoと同じです。3.3V動作であり5Vトレラントでない点、および他のマトリクス機能との衝突を起こす可能性がある点に注意すると良いです。

サンプルスケッチ

ADC(アナログ入力)

ADCに使えるピンを以下の表に示します。

定数GPIOピン
A036
A339
A432
A533
A634
A735
A104
A110
A122
A1315
A1413
A1512
A1614
A1727
A1825
A1926

※A1,A2は定義されていません。本来ならGPIO37、38ピンで利用できますが、後述するLow-Noise Amplifier回路を利用するためにすでに部品が配線されています。 ※GPIO0、2に関しては書き込みモードの制御、GPIO15,12も他の機能で使われることがあります。

内部の仕様について

ESP32には逐次比較型(SAR)ADCモジュールが2つ内蔵されています。分解能は9~12bitで、デフォルトは12bitです。(参照)

SAR ADC1 には、GPIO32~39に相当するピンと、後述するホールセンサが接続されています。

SAR ADC2 には、それ以外のピンと、deep sleep機能用の入力などが接続されています。

また、ADCの入力には減衰器を設定することができます。実のところ、ESP32のADCモジュールは0~1 Vの間でAD変換を行っています。このモジュールに例えば11db(約1/3.6倍)の減衰器を設定することで、0~3.6 Vの間のAD変換ができるようになります。

デフォルトでは11dBの減衰が設定され、12bitでの最大値は3.6 Vを示しています。 参考情報として、電源電圧3.31 VでA0ピン(GPIO36)に1.667 Vを入力した時のADCの値は、1950程度でした。値が4095の時3.50 Vになる計算です。 また、現在AD変換の結果は少し誤差があるとのことです(公式スレッド参照)。 他にも議論が見受けられ(例1,例2)、状況によって値が変わる可能性がある点に注意したほうが良いでしょう。

setupのブロックでanalogSetAttenuation()関数を呼ぶことで減衰率の設定ができます。例えば減衰無し(入力電圧範囲 0~1 V)であれば、analogSetAttenuation(ADC_0db);と設定します。詳しくはこのあたりを参照ください。

また、ADC2回路を利用するピンは、WiFi機能と並行して利用できず、常に値が4095になります(参照)。注意してください。

サンプルスケッチ

DAC(アナログ出力)

いわゆるArduinoUNOなどで実行するanalogWrite()ではなく、ArduinoDUEのDACピンのようにアナログ電圧が直接ピンから出てくる機能です。

内部の仕様について

ESP32は2chの8bit DACを内蔵しています。出力ピンはGPIO25,26ピンの位置に固定されています。

dacWrite(pin, value)と引数を渡します。pinは25もしくは26のみで、valueは0から255までの値です。

サンプルスケッチ

PWM

いわゆるArduinoUNOのanalogWrite()と同様の振る舞いをします。

内部の仕様について

サンプルスケッチ

LED C機能を使ったサンプルスケッチがexamplesにあります。LEDCSoftwareFadeという名前です。

SigmaDelta変調を使ったサンプルスケッチもexamplesにあります。SigmaDeltaという名前です。

ホールセンサ

ESP32にはホールセンサ(磁気センサー)が内蔵されています。自由度は1です。

内部の仕様について

ホール効果によって発生する電圧を先のADC回路にて読み取っています。生じる電圧は小さいので、内蔵のLow-Noise Amplifierを利用することが回路的には可能ですが、Arduinoライブラリではサポート外のようです。(参照)

サンプルスケッチ

温度センサー

内部の仕様について

サンプルスケッチ

タッチセンサ

内部の仕様について

サンプルスケッチ

ULP コプロセッサとdeep sleep

内部の仕様について

サンプルスケッチ

Attachments (7)

Download all attachments as: .zip