= 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と記述しています。 ---- == ピンアサイン == [https://espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf ESP32 Datasheet(PDF)]より抜粋。 より詳しく各ピン別の機能を見る際は[https://espressif.com/sites/default/files/documentation/esp32_pinout_v1_0.pdf ESP32 Pinout]を参照してください。 ||**Name**||**No.**||**Type**||**Function**|| ||GND||1||P||Ground|| ||3V3||2||P||Power supply.|| ||EN||3||I||Chip-enable signal. Active high.|| ||SENSOR_VP||4||I||GPIO36, SENSOR_VP, ADC_H, ADC1_CH0, RTC_GPIO0|| ||SENSOR_VN||5||I||GPIO39, SENSOR_VN, ADC1_CH3, ADC_H, RTC_GPIO3|| ||IO34||6||I||GPIO34, ADC1_CH6, RTC_GPIO4|| ||IO35||7||I||GPIO35, ADC1_CH7, RTC_GPIO5, GPIO32, XTAL_32K_P (32.768 kHz crystal oscillator input), ADC1_CH4,|| ||IO32||8||I/O||TOUCH9, RTC_GPIO9, GPIO33, XTAL_32K_N (32.768 kHz crystal oscillator output), ADC1_CH5,|| ||IO33||9||I/O||TOUCH8, RTC_GPIO8|| ||IO25||10||I/O||GPIO25, DAC_1, ADC2_CH8, RTC_GPIO6, EMAC_RXD0|| ||IO26||11||I/O||GPIO26, DAC_2, ADC2_CH9, RTC_GPIO7, EMAC_RXD1|| ||IO27||12||I/O||GPIO27, ADC2_CH7, TOUCH7, RTC_GPIO17, EMAC_RX_DV, GPIO14, ADC2_CH6, TOUCH6, RTC_GPIO16, MTMS, HSPICLK,|| ||IO14||13||I/O||HS2_CLK, SD_CLK, EMAC_TXD2, GPIO12, ADC2_CH5, TOUCH5, RTC_GPIO15, MTDI, HSPIQ,|| ||IO12||14||I/O||HS2_DATA2, SD_DATA2, EMAC_TXD3|| ||GND||15||P||Ground, GPIO13, ADC2_CH4, TOUCH4, RTC_GPIO14, MTCK, HSPID,|| ||IO13||16||I/O||HS2_DATA3, SD_DATA3, EMAC_RX_ER|| ||__SHD/SD2*__||17||I/O||GPIO9, SD_DATA2, SPIHD, HS1_DATA2, U1RXD|| ||__SWP/SD3*__||18||I/O||GPIO10, SD_DATA3, SPIWP, HS1_DATA3, U1TXD|| ||__SCS/CMD*__||19||I/O||GPIO11, SD_CMD, SPICS0, HS1_CMD, U1RTS|| ||__SCK/CLK*__||20||I/O||GPIO6, SD_CLK, SPICLK, HS1_CLK, U1CTS|| ||__SDO/SD0*__||21||I/O||GPIO7, SD_DATA0, SPIQ, HS1_DATA0, U2RTS|| ||__SDI/SD1*__||22||I/O||GPIO8, SD_DATA1, SPID, HS1_DATA1, U2CTS, GPIO15, ADC2_CH3, TOUCH3, MTDO, HSPICS0, RTC_GPIO13,|| ||IO15||23||I/O||HS2_CMD, SD_CMD, EMAC_RXD3, GPIO2, ADC2_CH2, TOUCH2, RTC_GPIO12, HSPIWP, HS2_DATA0,|| ||IO2||24||I/O||SD_DATA0, GPIO0, ADC2_CH1, TOUCH1, RTC_GPIO11, CLK_OUT1,|| ||IO0||25||I/O||EMAC_TX_CLK, GPIO4, ADC2_CH0, TOUCH0, RTC_GPIO10, HSPIHD, HS2_DATA1,|| ||IO4||26||I/O||SD_DATA1, EMAC_TX_ER|| ||IO16||27||I/O||GPIO16, HS1_DATA4, U2RXD, EMAC_CLK_OUT|| ||IO17||28||I/O||GPIO17, HS1_DATA5, U2TXD, EMAC_CLK_OUT_180|| ||IO5||29||I/O||GPIO5, VSPICS0, HS1_DATA6, EMAC_RX_CLK|| ||IO18||30||I/O||GPIO18, VSPICLK, HS1_DATA7|| ||IO19||31||I/O||GPIO19, VSPIQ, U0CTS, EMAC_TXD0|| ||NC||32||-||-|| ||IO21||33||I/O||GPIO21, VSPIHD, EMAC_TX_EN|| ||RXD0||34||I/O||GPIO3, U0RXD, CLK_OUT2|| ||TXD0||35||I/O||GPIO1, U0TXD, CLK_OUT3, EMAC_RXD2|| ||IO22||36||I/O||GPIO22, VSPIWP, U0RTS, EMAC_TXD1|| ||IO23||37||I/O||GPIO23, VSPID, HS1_STROBE|| ||GND||38||P||Ground|| ||GND||39||P||Ground|| *がついているピン(IO6~11)はモジュール内部でSPIフラッシュメモリに接続されているため、他の用途での利用は推奨されません。また、後述するピンマトリクス機能においても、IO6~11を別の機能に割り当てることは推奨されません。 == GPIOマトリクス機能について == 各種ペリフェラルを説明する前に、本機能について少し説明します。Arduinoからは離れた話なので、Arduinoとして少し使うぶんには気にしなくとも問題ありません。詳細については、説明しきれない部分が多いため、以下の資料を御覧ください。 [https://espressif.com/sites/default/files/documentation/esp32_pinout_v1_0.pdf ESP32 Pinout]の`Note.12`にある通り、内蔵ペリフェラル用の信号は設定によって好きなピンに再割り当てすることが可能です。 回路ブロック図に関しては、[https://espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf ESP32 Technical Reference Manual]の`4. 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ライブラリは、[https://github.com/espressif/arduino-esp32/blob/3cbc405edf2448cf1d77b0a30a5e62ddab806a85/libraries/SPI/src/SPI.cpp#L277 ライブラリ中]に定義されるように、VSPI回路を利用します。更に、独自にSPIクラスをインスタンス化すると、[https://github.com/espressif/arduino-esp32/blob/3cbc405edf2448cf1d77b0a30a5e62ddab806a85/libraries/SPI/src/SPI.h#L53 こちら]にあるようにHSPIが利用されます。 各SPIモジュールのピンアサインは以下の通りです。ただし、GPIOマトリックスの項目で説明した通り、比較的自由にリマッピング可能です。 * HSPI - SCK,MISO,MOSI,SS = 14,12,13,15 * VSPI - SCK,MISO,MOSI,SS = 18,19,23,5 === サンプルスケッチ === 以上の仕様と、GPIOマトリックス機能を合わせると、ものによってはブレッドボードに上手く挿すだけでジャンパワイヤなしに通信が可能です。 == I^2^C通信 == == GPIO == == ADC == == DAC == == PWM == == ホールセンサ == == 温度センサー == == タッチセンサ ==