M5Stack の BLE アプリを作ろうと思い公式サンプル「ファイル」→「スケッチ例」→EP32 BLE Arduino」→「BLE_scan」
というサンプルを動かしてみましたが loop() 内の pBLEScan->start() 関数が最初に一回呼ばれますが戻って来ません。
サンプルそのままだとウォッチドッグタイマーのエラーがでましたが対策として delay をコールバック関数に入れました。
task_wdt: Task watchdog got triggered. The following tasks did not reset the watchdog in time:
「ツール」→「シリアルモニタ」で見ると周辺にある無線マウスとかの信号を拾って「Advertised Device: Name:・・・」が最初に沢山表示されますがその後追加はされません。
ネットで検索された色々な BLE のサンプルなども見てみましたが pBLEScan->start() からは指定秒数経過すると戻る動作前提で書かれている様です。
M5Stack の BLE は不安定だとかライブラリにバグがあるなどの情報もあるのですがどの様にしたら pBLEScan->start() 以降の処理も行えるのでしょうか?
環境は以下の通りです
Windows10
Arduino IDE 1.8.15(Windows Store 1.8.49.0)
M5Stack 0.3.2
c++
1int scanTime = 5; //In seconds 2BLEScan* pBLEScan; 3 4class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks { 5 void onResult(BLEAdvertisedDevice advertisedDevice) { 6 Serial.printf("Advertised Device: %s \n", advertisedDevice.toString().c_str()); 7 delay(1); // ウォッチドッグタイマーのエラー対策 8 } 9}; 10 11void setup() { 12 Serial.begin(115200); 13 Serial.println("Scanning..."); 14 15 BLEDevice::init(""); 16 pBLEScan = BLEDevice::getScan(); //create new scan 17 pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks()); 18 pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster 19 pBLEScan->setInterval(100); 20 pBLEScan->setWindow(99); // less or equal setInterval value 21} 22 23void loop() { 24 // put your main code here, to run repeatedly: 25 BLEScanResults foundDevices = pBLEScan->start(scanTime, false); // <--ここから帰ってこない 26 Serial.print("Devices found: "); 27 Serial.println(foundDevices.getCount()); 28 Serial.println("Scan done!"); 29 pBLEScan->clearResults(); // delete results fromBLEScan buffer to release memory 30 delay(2000); 31} 32
7/21 追記
その後いろいろ試してみて解決に至りました。
結論としては周辺にBLE機器多すぎて Serial.printf の処理が重くて処理が間に合わずハングアップしていたのが原因でした。
最初の状態でシリアルモニタは以下の様になります。
ets Jun 8 2016 00:22:57 rst:0x1 (POWERON_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT) configsip: 0, SPIWP:0xee clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 mode:DIO, clock div:1 load:0x3fff0018,len:4 load:0x3fff001c,len:1216 ho 0 tail 12 room 4 load:0x40078000,len:10944 load:0x40080400,len:6388 entry 0x400806b4 Scanning... Advertised Device: Name: , Address: 66:21:91:22:61:e5, manufacturer data: 060001092002ee2ebc0b680520079feaebf2a70a9621ef20155c55bcd6 Advertised Device: Name: , Address: 62:00:64:ce:af:4f, manufacturer data: 060001092002e000b6c55cf0e375d3c466f632382ef30c084e52ff9812 ・・・ これが500件ほど続きその後だんまり
コールバック関数の Serial.printf をコメントにして実行
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks { void onResult(BLEAdvertisedDevice advertisedDevice) { //Serial.printf("Advertised Device: %s \n", advertisedDevice.toString().c_str()); } };
すると
Scanning... Devices found: 0 Scan done! Devices found: 0 Scan done! Devices found: 0 Scan done! Devices found: 0 Scan done! ・・・
これは!
ということで以下の様に変更すると
std::map<std::string,int> addr_list; class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks { void onResult(BLEAdvertisedDevice advertisedDevice) { //Serial.printf("Advertised Device: %s \n", advertisedDevice.toString().c_str()); addr_list[advertisedDevice.toString()]++; } }; void loop() { ・・・ Serial.printf("addr_list counts: %d\n", (int)addr_list.size()); for(std::map<std::string,int>::iterator i=addr_list.begin(); i!=addr_list.end(); i++){ Serial.printf("%s %d\n", i->first.c_str(), i->second); } ・・・
5秒間隔で定期的にメッセージが表示されました。
Devices found: 0 Scan done! addr_list counts: 52 Name: , Address: 07:eb:bb:7b:fe:7a, manufacturer data: 060001092002dcdbf26eefcae892515b0091e34f109ea2d762d9f5d88a 5 Name: , Address: 0a:4a:ac:28:cf:e7, serviceUUID: 0000fd6f-0000-1000-8000-00805f9b34fb 1 Name: , Address: 10:55:c2:e3:a0:6d, serviceUUID: 0000fd6f-0000-1000-8000-00805f9b34fb 3 Name: , Address: 16:6f:7a:44:e7:da, serviceUUID: 0000fd6f-0000-1000-8000-00805f9b34fb 3 ・・・
ずっと「Devices found: 0」なのが良く分かりませんがとりあえずだんまり現象は解決できました。
皆様、色々情報ありがとうございます。
7/28 追記
引き続き後試行錯誤してボードバージョン 2.0.0-rc1 (リリース予定版)だとサンプルそのままで動作する事を確認しました。
「Devices found:」も正しく件数が出ています。
Devices found: 57 Scan done! Advertised Device: Name: , Address: 0a:cd:d5:59:e0:ff, manufacturer data: 06000109200215843bdef33e24d0c4ef10afea45400eb0eff51827d36d Advertised Device: Name: , Address: 7a:b0:91:0b:2d:b7, manufacturer data: 06000109200297ac09f696e93ebb30ad30e3a9a67ef8cc0791999b251c
また中国の開発元のサイト
https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json
を環境設定の追加のボードマネージャのURLに指定してダウンロードした 1.0.7 というバージョンでも動作する事を確認しました。
1.0.7 の方が安定している感じです。
開発元版だとボードマネージャの選択項目名が変わり以下の様になっています。
GitHub版 ESP32 Arduino M5Stack-Core-ESP32 esp32 by Espressif System バージョン 2.0.0-rc1 開発元版 M5Stack Arduino M5Stack-Core-ESP32 M5Stack by MSStack official バージョン1.0.7
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/20 07:22 編集
2021/07/20 23:44
2021/07/21 00:23