Arduino for ESP32バージョン3.0.0リリース

概要

ESP32のArudinoライブラリのメジャーバージョンが3にアップしました。内部で利用しているESP-IDFも5系になり大幅に変更が入っているので差分を確認してみたいと思います。

基本情報

ESP32は内部でESP-IDFというSDKを利用して開発を行います。ESP-IDFを利用してArduiono CoreのAPIを実装したものの正式名称が「Arduino core for the ESP32, ESP32-S2, ESP32-S3, ESP32-C3, ESP32-C6 and ESP32-H2」です。

バージョン2系はESP-IDF v4を採用しており、バージョン3系はESP-IDF v5系になっています。この差は結構大きくて対応しているチップの種類が増えています。

https://github.com/espressif/esp-idf

上記がESP-IDFのバージョンとチップの対応表になります。これまではESP-IDF v4.4だったのですが、今回ESP-IDF v5.1.4に更新されました。これまで利用できなかったESP32-C2、C6、H2が利用可能になりました。ただしP5とC5はv5.3以降なのでまだ利用できません。

GitHub - tanakamasayuki/esp32-arduino-test
Contribute to tanakamasayuki/esp32-arduino-test development by creating an account on GitHub.

上記に過去のバージョンアップ履歴があるのですが長らくv4.4系が使われてきていました。今後のバージョンアップはわかりませんが、v5.3以降にバージョンアップ対応してくれると嬉しいですね。

バージョンアップの影響

ビルドシステムの変更

makeまわりが大幅に変更されています。ただしArduinoで利用する場合には見えないところなのであまり影響を受けないはずです。

またgccのバージョンが上がっています。これに伴いデフォルトの言語サポートが変更されています。これまでC言語はC11だったものがC17に、C++はC++11だったのものがC++20にあがりました。ESP-IDFだと内部的に変更が可能でしたがArduino環境だとデフォルトしか使えないのでこれは嬉しい変更です。

インライン変数 - cpprefjp C++日本語リファレンス

たとえばC++17で追加されたインライン変数とかはヘッダのみでstatic変数を宣言可能になります。個人的にはヘッダのみで動くライブラリが好きなのでかなり便利な機能です。

Arduinoでの独自拡張をESP-IDFの機能に統合

これまでESP-IDFとArduinoで同じような機能の関数がありましたが、動きとしては分かれており独自にAPIを拡張していました。そのため微妙に動きの違う関数などになっていましたが今回はArduinoはなるべくESP-IDFの関数を呼び出すように修正されています。

これの影響は大きく、ESP-IDFと設計が異なるAPIまわりはごそっと修正が入っています。analogRead関数なども影響を受けていますが、タイマーやI2Sなどの他、ESP-NOWなど通信系も差分が大きかったです。ただし、ほぼすべてのAPIが影響を受けているので、どこまで変わっているのかは個別に見てみる必要があります。

スケッチ例の差分

#####
1ArduinoOTABasicOTABasicOTA.ino
2AsyncUDPAsyncUDPClientAsyncUDPClient.ino
3AsyncUDPAsyncUDPMulticastServerAsyncUDPMulticastServer.ino
4AsyncUDPAsyncUDPServerAsyncUDPServer.ino
5BLEBeacon_ScannerBeacon_Scanner.ino
6BLEBLE5_extended_scanBLE5_extended_scan.ino
7BLEBLE5_multi_advertisingBLE5_multi_advertising.ino
8BLEBLE5_periodic_advertisingBLE5_periodic_advertising.ino
9BLEBLE5_periodic_syncBLE5_periodic_sync.ino
10BLEClientClient.ino
11BLEEddystoneTLM_BeaconEddystoneTLM_Beacon.ino
12BLEEddystoneURL_BeaconEddystoneURL_Beacon.ino
13BLEiBeaconiBeacon.ino
14BLENotifyNotify.ino
15BLEScanScan.ino
16BLEServerServer.ino
17BLEServer_multiconnectServer_multiconnect.ino
18BLEUARTUART.ino
19BLEWriteWrite.ino
20BluetoothSerialbt_classic_device_discoverybt_classic_device_discovery.ino
21BluetoothSerialbt_remove_paired_devicesbt_remove_paired_devices.ino
22BluetoothSerialDiscoverConnectDiscoverConnect.ino
23BluetoothSerialGetLocalMACGetLocalMAC.ino
24BluetoothSerialSerialToSerialBTSerialToSerialBT.ino
25BluetoothSerialSerialToSerialBTMSerialToSerialBTM.ino
26BluetoothSerialSerialToSerialBT_LegacySerialToSerialBT_Legacy.ino
27BluetoothSerialSerialToSerialBT_SSPSerialToSerialBT_SSP.ino
28DNSServerCaptivePortalCaptivePortal.ino
29EEPROMeeprom_classeeprom_class.ino
30EEPROMeeprom_extraeeprom_extra.ino
31EEPROMeeprom_writeeeprom_write.ino
32ESP32AnalogOutLEDCFadeLEDCFade.ino
33ESP32AnalogOutledcFrequencyledcFrequency.ino
34ESP32AnalogOutLEDCSoftwareFadeLEDCSoftwareFade.ino
35ESP32AnalogOutledcWrite_RGBledcWrite_RGB.ino
36ESP32AnalogOutSigmaDeltaSigmaDelta.ino
37ESP32AnalogReadAnalogRead.ino
38ESP32AnalogReadContinuousAnalogReadContinuous.ino
39ESP32ArduinoStackSizeArduinoStackSize.ino
40ESP32CameraCameraWebServerCameraWebServer.ino
41ESP32ChipIDGetChipIDGetChipID.ino
42ESP32CICIBoardsTestCIBoardsTest.ino
43ESP32DeepSleepExternalWakeUpExternalWakeUp.ino
44ESP32DeepSleepSmoothBlink_ULP_CodeSmoothBlink_ULP_Code.ino
45ESP32DeepSleepTimerWakeUpTimerWakeUp.ino
46ESP32DeepSleepTouchWakeUpTouchWakeUp.ino
47ESP32FreeRTOSBasicMultiThreadingBasicMultiThreading.ino
48ESP32FreeRTOSMutexMutex.ino
49ESP32FreeRTOSQueueQueue.ino
50ESP32FreeRTOSSemaphoreSemaphore.ino
51ESP32GPIOBlinkRGBBlinkRGB.ino
52ESP32GPIOFunctionalInterruptFunctionalInterrupt.ino
53ESP32GPIOFunctionalInterruptStructFunctionalInterruptStruct.ino
54ESP32GPIOGPIOInterruptGPIOInterrupt.ino
55ESP32HWCDC_EventsHWCDC_Events.ino
56ESP32MacAddressGetMacAddressGetMacAddress.ino
57ESP32ResetReasonResetReasonResetReason.ino
58ESP32ResetReasonResetReason2ResetReason2.ino
59ESP32RMTRMTCallbackRMTCallback.ino
60ESP32RMTRMTLoopbackRMTLoopback.ino
61ESP32RMTRMTReadXJTRMTReadXJT.ino
62ESP32RMTRMTWriteNeoPixelRMTWriteNeoPixel.ino
63ESP32RMTRMT_CPUFreq_TestRMT_CPUFreq_Test.ino
64ESP32RMTRMT_EndOfTransmissionStateRMT_EndOfTransmissionState.ino
65ESP32RMTRMT_LED_BlinkRMT_LED_Blink.ino
66ESP32SerialBaudRateDetect_DemoBaudRateDetect_Demo.ino
67ESP32SerialOnReceiveError_BREAK_DemoOnReceiveError_BREAK_Demo.ino
68ESP32SerialonReceiveExampleonReceiveExample.ino
69ESP32SerialOnReceive_DemoOnReceive_Demo.ino
70ESP32SerialRS485_Echo_DemoRS485_Echo_Demo.ino
71ESP32SerialRxFIFOFull_DemoRxFIFOFull_Demo.ino
72ESP32SerialRxTimeout_DemoRxTimeout_Demo.ino
73ESP32SerialSerial_All_CPU_FreqsSerial_All_CPU_Freqs.ino
74ESP32SerialSerial_STD_Func_OnReceiveSerial_STD_Func_OnReceive.ino
75ESP32TemplateExampleTemplateExampleTemplate.ino
76ESP32TimeSimpleTimeSimpleTime.ino
77ESP32TimerRepeatTimerRepeatTimer.ino
78ESP32TimerWatchdogTimerWatchdogTimer.ino
79ESP32TouchTouchButtonTouchButton.ino
80ESP32TouchTouchButtonV2TouchButtonV2.ino
81ESP32TouchTouchInterruptTouchInterrupt.ino
82ESP32TouchTouchReadTouchRead.ino
83ESP32TWAITWAIreceiveTWAIreceive.ino
84ESP32TWAITWAItransmitTWAItransmit.ino
85ESP32UtilitiesHEXBuilderHEXBuilder.ino
86ESP32UtilitiesMD5BuilderMD5Builder.ino
87ESP32UtilitiesSHA1BuilderSHA1Builder.ino
88ESP32ZigbeeZigbee_Light_BulbZigbee_Light_Bulb.ino
89ESP32ZigbeeZigbee_Light_SwitchZigbee_Light_Switch.ino
90ESP32ZigbeeZigbee_Temperature_SensorZigbee_Temperature_Sensor.ino
91ESP32ZigbeeZigbee_ThermostatZigbee_Thermostat.ino
92ESPmDNSmDNS-SD_ExtendedmDNS-SD_Extended.ino
93ESPmDNSmDNS_Web_ServermDNS_Web_Server.ino
94ESP_I2SES8388_loopbackES8388_loopback.ino
95ESP_I2SRecord_to_WAVRecord_to_WAV.ino
96ESP_I2SSimple_toneSimple_tone.ino
97ESP_NOWESP_NOW_Broadcast_MasterESP_NOW_Broadcast_Master.ino
98ESP_NOWESP_NOW_Broadcast_SlaveESP_NOW_Broadcast_Slave.ino
99ESP_NOWESP_NOW_NetworkESP_NOW_Network.ino
100ESP_NOWESP_NOW_SerialESP_NOW_Serial.ino
101ESP_SRBasicBasic.ino
102EthernetETH_LAN8720ETH_LAN8720.ino
103EthernetETH_TLK110ETH_TLK110.ino
104EthernetETH_W5500_Arduino_SPIETH_W5500_Arduino_SPI.ino
105EthernetETH_W5500_IDF_SPIETH_W5500_IDF_SPI.ino
106FFatFFat_TestFFat_Test.ino
107FFatFFat_timeFFat_time.ino
108HTTPClientAuthorizationAuthorization.ino
109HTTPClientBasicHttpClientBasicHttpClient.ino
110HTTPClientBasicHttpsClientBasicHttpsClient.ino
111HTTPClientHTTPClientEnterpriseHTTPClientEnterprise.ino
112HTTPClientReuseConnectionReuseConnection.ino
113HTTPClientStreamHttpClientStreamHttpClient.ino
114HTTPUpdatehttpUpdatehttpUpdate.ino
115HTTPUpdatehttpUpdateSecurehttpUpdateSecure.ino
116HTTPUpdatehttpUpdateSPIFFShttpUpdateSPIFFS.ino
117HTTPUpdateServerWebUpdaterWebUpdater.ino
118InsightsDiagnosticsSmokeTestDiagnosticsSmokeTest.ino
119InsightsMinimalDiagnosticsMinimalDiagnostics.ino
120LittleFSLITTLEFS_testLITTLEFS_test.ino
121LittleFSLITTLEFS_timeLITTLEFS_time.ino
122NetBIOSESP_NBNSTESP_NBNST.ino
123NetworkClientSecureWiFiClientInsecureWiFiClientInsecure.ino
124NetworkClientSecureWiFiClientPSKWiFiClientPSK.ino
125NetworkClientSecureWiFiClientSecureWiFiClientSecure.ino
126NetworkClientSecureWiFiClientSecureEnterpriseWiFiClientSecureEnterprise.ino
127NetworkClientSecureWiFiClientSecureProtocolUpgradeWiFiClientSecureProtocolUpgrade.ino
128NetworkClientSecureWiFiClientShowPeerCredentialsWiFiClientShowPeerCredentials.ino
129NetworkClientSecureWiFiClientTrustOnFirstUseWiFiClientTrustOnFirstUse.ino
130PPPPPP_BasicPPP_Basic.ino
131PreferencesPrefs2StructPrefs2Struct.ino
132PreferencesStartCounterStartCounter.ino
133RainMakerRMakerCustomRMakerCustom.ino
134RainMakerRMakerCustomAirCoolerRMakerCustomAirCooler.ino
135RainMakerRMakerSonoffDualR3RMakerSonoffDualR3.ino
136RainMakerRMakerSwitchRMakerSwitch.ino
137SDSD_TestSD_Test.ino
138SDSD_timeSD_time.ino
139SD_MMCSDMMC_TestSDMMC_Test.ino
140SD_MMCSDMMC_timeSDMMC_time.ino
141SimpleBLESimpleBleDeviceSimpleBleDevice.ino
142SPISPI_Multiple_BusesSPI_Multiple_Buses.ino
143SPIFFSSPIFFS_TestSPIFFS_Test.ino
144SPIFFSSPIFFS_timeSPIFFS_time.ino
145TFLiteMicrohello_worldhello_world.ino
146TickerBlinkerBlinker.ino
147TickerTickerBasicTickerBasic.ino
148TickerTickerParameterTickerParameter.ino
149UpdateAWS_S3_OTA_UpdateAWS_S3_OTA_Update.ino
150UpdateHTTPS_OTA_UpdateHTTPS_OTA_Update.ino
151UpdateHTTP_Client_AES_OTA_UpdateHTTP_Client_AES_OTA_Update.ino
152UpdateHTTP_Server_AES_OTA_UpdateHTTP_Server_AES_OTA_Update.ino
153UpdateOTAWebUpdaterOTAWebUpdater.ino
154UpdateSD_UpdateSD_Update.ino
155USBCompositeDeviceCompositeDevice.ino
156USBConsumerControlConsumerControl.ino
157USBCustomHIDDeviceCustomHIDDevice.ino
158USBFirmwareMSCFirmwareMSC.ino
159USBGamepadGamepad.ino
160USBHIDVendorHIDVendor.ino
161USBKeyboardKeyboardLogoutKeyboardLogout.ino
162USBKeyboardKeyboardMessageKeyboardMessage.ino
163USBKeyboardKeyboardReprogramKeyboardReprogram.ino
164USBKeyboardKeyboardSerialKeyboardSerial.ino
165USBKeyboardAndMouseControlKeyboardAndMouseControl.ino
166USBMIDIMidiControllerMidiController.ino
167USBMIDIMidiInterfaceMidiInterface.ino
168USBMIDIMidiMusicBoxMidiMusicBox.ino
169USBMIDIReceiveMidiReceiveMidi.ino
170USBMouseButtonMouseControlButtonMouseControl.ino
171USBSystemControlSystemControl.ino
172USBUSBMSCUSBMSC.ino
173USBUSBSerialUSBSerial.ino
174USBUSBVendorUSBVendor.ino
175WebServerAdvancedWebServerAdvancedWebServer.ino
176WebServerFSBrowserFSBrowser.ino
177WebServerHelloServerHelloServer.ino
178WebServerHttpAdvancedAuthHttpAdvancedAuth.ino
179WebServerHttpAuthCallbackHttpAuthCallback.ino
180WebServerHttpAuthCallbackInlineHttpAuthCallbackInline.ino
181WebServerHttpBasicAuthHttpBasicAuth.ino
182WebServerHttpBasicAuthSHA1HttpBasicAuthSHA1.ino
183WebServerHttpBasicAuthSHA1orBearerTokenHttpBasicAuthSHA1orBearerToken.ino
184WebServerMultiHomedServersMultiHomedServers.ino
185WebServerPathArgServerPathArgServer.ino
186WebServerSDWebServerSDWebServer.ino
187WebServerSimpleAuthentificationSimpleAuthentification.ino
188WebServerUploadHugeFileUploadHugeFile.ino
189WebServerWebServerWebServer.ino
190WebServerWebUpdateWebUpdate.ino
191WiFiFTMFTM_InitiatorFTM_Initiator.ino
192WiFiFTMFTM_ResponderFTM_Responder.ino
193WiFiSimpleWiFiServerSimpleWiFiServer.ino
194WiFiWiFiAccessPointWiFiAccessPoint.ino
195WiFiWiFiBlueToothSwitchWiFiBlueToothSwitch.ino
196WiFiWiFiClientWiFiClient.ino
197WiFiWiFiClientBasicWiFiClientBasic.ino
198WiFiWiFiClientConnectWiFiClientConnect.ino
199WiFiWiFiClientEnterpriseWiFiClientEnterprise.ino
200WiFiWiFiClientEventsWiFiClientEvents.ino
201WiFiWiFiClientStaticIPWiFiClientStaticIP.ino
202WiFiWiFiIPv6WiFiIPv6.ino
203WiFiWiFiMultiWiFiMulti.ino
204WiFiWiFiMultiAdvancedWiFiMultiAdvanced.ino
205WiFiWiFiScanWiFiScan.ino
206WiFiWiFiScanAsyncWiFiScanAsync.ino
207WiFiWiFiScanDualAntennaWiFiScanDualAntenna.ino
208WiFiWiFiSmartConfigWiFiSmartConfig.ino
209WiFiWiFiTelnetToSerialWiFiTelnetToSerial.ino
210WiFiWiFiUDPClientWiFiUDPClient.ino
211WiFiWPSWPS.ino
212WiFiProvWiFiProvWiFiProv.ino
213WireWireMasterWireMaster.ino
214WireWireScanWireScan.ino
215WireWireSlaveWireSlave.ino

上記が3.0.0に入っていたスケッチ例の一覧です。2.0.17との差分を確認してみます。

削除された項目

HallSensor

ホールセンサーはESP32に内蔵しているセンサーで、磁石などが近づいたことがわかります。ただし精度が怪しいのでデータシートから消された機能になります。今回のバージョンアップに伴いAPIからも削除されていました。

I2S

I2Sは大幅に作り直しが入っていますのでESP_I2Sに純粋なサウンド系は入っています。ただし、ADCまわりに関してはI2Sから削除されて、AnalogReadContinuousなどに移動しています。

追加された項目

Utilities

HEXやMD5、SHA1に対してのヘルパー関数などが追加されているようです。

  • HEXBuilder::hex2bytes
  • HEXBuilder::bytes2hex
  • md5.add(password) -> .calculate() -> .toString()
  • md5.addHexString(passwordAsHex)
  • sha1.add(password)
  • sha1.addHexString(passwordAsHex)

上記のようなものでよく使う変換が可能になっています。

Zigbee

ZigbeeはC6など新しいチップでESP-IDF5以降でないと対応していないため今回追加されています。

ESP_I2S

I2SからESP_I2Sに名前が変わっていますが、内部もかなり変更されているため過去との互換性はないようです。

ESP_NOW

こちらもESPNowからESP_NOWに名前が変わって、中身をかなり変わっています。

ESP_SR

マイクを利用しての音声入力をするライブラリです。

Ethernet

昔からサポートはしていましたがW5500のサンプルが追加されていました。

PPP

LTEモデムのSIM7600を利用してPPP接続するためのサンプルがありました。

TFLiteMicro

こちらESP-IDFでは昔からサポートされていましたがArduino環境では公式サポートがなかったのですが増えていました。とはいえhello_worldですのでサインカーブを出力するやつで、とくになにもできません。

Ticker

タイマー周りが変更あったので、サンプルも追加されていました。

MIDI

USBの中にMIDIが増えていました。中身はシリアル通信なのでシンプルなのですが、公式スケッチ例が増えたのは嬉しいです。

まとめ

まだあまりさわれていないので、気になったところは今後中身を確認してみたいと思います。あと地味にUSBシリアルまわりも変わっていました。前のバージョンは地味に状態によって定義される名前が変更されていたのですが、今回はSerial0とUSBSerialなど存在するシリアルが常に定義されており、Serialの別名をどれにするのかを状況によって変更しています。とりあえずSerialに出力しておけばコンパイルエラーにはならなくなりました。

コメント

  1. 匿名 より:

    https://github.com/espressif/arduino-esp32/blob/master/docs/en/migration_guides/2.x_to_3.0.rst#ledc
    ではledcSetupとledcAttachPinのAPIが削除されたとあるので、M5Stack公式ライブラリのSpeaker.cppが更新されないとPWM機能を使用する際にエラーが出るかもしれないですね

    • たなかまさゆき より:

      そうですね
      PWMのチャンネル指定がなくなって、自動指定に変わったので微妙に引数が変わっています
      タイマー周りもいろいろ変わっていたり、赤外線リモコンなどで使うRMTも影響範囲が大きいみたいです

      なのでM5Stackの場合には3系はまだ早く、M5Stack板のボードマネージャーも2系のままで更新されていないようでした