目次
WiFi と Bluetooth はどちらも巨大なライブラリです
以前から、ESP32 devkit C で WiFi と Bluetooth / BLE を同時に使うと、スケッチを保存するフラッシュ領域が足りないという事例がありました。実際に、以下のように WiFi と BluetoothSerial を同時に begin するコードを書きこむと、すでにフラッシュの 99 % が使用済みになってしまいました。
#include <WiFi.h> #include <BluetoothSerial.h> const char* BT_NAME = "ESP32-BTSerial"; // Bluetoothデバイス名 const char* WIFI_SSID = "your_ssid"; const char* WIFI_PASS = "your_password"; BluetoothSerial SerialBT; void setup() { Serial.begin(115200); WiFi.begin(WIFI_SSID, WIFI_PASS); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi.."); } Serial.println(WiFi.localIP()); SerialBT.begin(BT_NAME); } void loop() { Serial.println("loop"); delay(1000); }
さて、この問題の解決策は、ツール > Partition Scheme の設定変更です。「Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS)」を、「No OTA (2MB APP / 2MB SPIFFS)」などの APP に割り当てられたフラッシュ領域がより多いものに変えるとよいです。
RAMも足りなくなることがあるらしい
ところが、少し規模の大きいプロジェクトで、下記のようなエラーメッセージが出ました。※Core Debug Level を Debug に設定しています
WiFi を先に begin してから SerialBT を begin した場合
WiFi 接続を完了した直後、Core 0 panic’ed (StoreProhibited) が発生しています。
[D][WiFiGeneric.cpp:374] _eventCallback(): Event: 0 - WIFI_READY [D][WiFiGeneric.cpp:374] _eventCallback(): Event: 2 - STA_START Connecting to WiFi.. Connecting to WiFi.. [D][WiFiGeneric.cpp:374] _eventCallback(): Event: 7 - STA_GOT_IP [D][WiFiGeneric.cpp:419] _eventCallback(): STA IP: 192.168.137.192, MASK: 255.255.255.0, GW: 192.168.137.1 [D][WiFiGeneric.cpp:374] _eventCallback(): Event: 7 - STA_GOT_IP [D][WiFiGeneric.cpp:419] _eventCallback(): STA IP: 192.168.137.192, MASK: 255.255.255.0, GW: 192.168.137.1 Connecting to WiFi.. 192.168.137.192 Guru Meditation Error: Core 0 panic'ed (StoreProhibited). Exception was unhandled. Core 0 register dump: PC : 0x40092b47 PS : 0x00060230 A0 : 0x80152c64 A1 : 0x3fff6fd0 A2 : 0x00000000 A3 : 0x00000000 A4 : 0x00000130 A5 : 0x00000000 A6 : 0x3f40c558 A7 : 0x00000013 A8 : 0x80082674 A9 : 0x3fff6f70 A10 : 0x00000000 A11 : 0x00001800 A12 : 0x00000000 A13 : 0x00000003 A14 : 0x3ffc99c0 A15 : 0x3ffc24d0 SAR : 0x00000010 EXCCAUSE: 0x0000001d EXCVADDR: 0x00000000 LBEG : 0x400929b0 LEND : 0x400929cc LCOUNT : 0x00000000 ELF file SHA256: 0000000000000000 Backtrace: 0x40092b47:0x3fff6fd0 0x40152c61:0x3fff6fe0 0x40127551:0x3fff7000 0x4012758b:0x3fff7020 0x40095996:0x3fff7050
SerialBT を 先に begin してから WiFi を begin した場合
Core panic こそ起きないものの、WiFi.begin が失敗し、WiFiに接続できません。
[I][BluetoothSerial.cpp:572] _init_bt(): device name set [I][BluetoothSerial.cpp:243] esp_spp_cb(): ESP_SPP_INIT_EVT E (5783) wifi:Expected to init 16 rx buffer, actual is 7 [I][BluetoothSerial.cpp:246] esp_spp_cb(): ESP_SPP_INIT_EVT: slave: start [E][WiFiGeneric.cpp:137] wifiLowLevelInit(): esp_wifi_init 257 E (5791) wifi:create wif[I][Bi task: failed to crluetoothSeate task erial.cpp:347] esp_spp_cb(): ESP_SPP_START_EVT [E][WiFiGeneric.cpp:137] wifiLowLevelInit(): esp_wifi_init 257 [E][WiFiSTA.cpp:120] begin(): STA enable failed! ( 以下、ずっとWiFiにつながらない )
いずれにせよ、ログを見てもぱっと見では理由が分かりません。色々調べたところ、おそらく RAM の不足に起因すると思われます。WiFi も Bluetooth も多くの RAM を消費するため、2つ同時に使うと動的に確保する分が足りなくなってしまうのかな……。あまり詳しくはないので推測ですが。
解決策は?
一応、Arduino がインストールされているフォルダ(Windows であれば C:/Users/user/AppData/Local/Arduino)に保存されている、packages/esp32/hardware/esp32/x.x.x/tools/sdk/include/config/sdkconfig.h(x.x.x はボードマネージャのバージョン名)の
- CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM 16
- CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM 32
- CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM 32
を、より小さい数値にすることで解決したという事例がありました。ただ、私の手元では 16 を 6 にしても同じ箇所で abort() が起きて解決しませんでした。大人しく WiFi の使用をやめて、Bluetooth だけにしようと思います。