質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
Bluetooth

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

M5Stack

M5Stackは、小型のマイコンモジュールです。拡張モジュールが豊富に用意されており、センサと組み合わせることで測定機能を自由に追加することができます。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

解決済

M5StackでBLE通信(セントラル)

menshan
menshan

総合スコア54

Bluetooth

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

M5Stack

M5Stackは、小型のマイコンモジュールです。拡張モジュールが豊富に用意されており、センサと組み合わせることで測定機能を自由に追加することができます。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

2回答

1リアクション

0クリップ

2951閲覧

投稿2021/07/19 23:22

編集2021/07/27 23:38

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++

int scanTime = 5; //In seconds BLEScan* pBLEScan; class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks { void onResult(BLEAdvertisedDevice advertisedDevice) { Serial.printf("Advertised Device: %s \n", advertisedDevice.toString().c_str()); delay(1); // ウォッチドッグタイマーのエラー対策 } }; void setup() { Serial.begin(115200); Serial.println("Scanning..."); BLEDevice::init(""); pBLEScan = BLEDevice::getScan(); //create new scan pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks()); pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster pBLEScan->setInterval(100); pBLEScan->setWindow(99); // less or equal setInterval value } void loop() { // put your main code here, to run repeatedly: BLEScanResults foundDevices = pBLEScan->start(scanTime, false); // <--ここから帰ってこない Serial.print("Devices found: "); Serial.println(foundDevices.getCount()); Serial.println("Scan done!"); pBLEScan->clearResults(); // delete results fromBLEScan buffer to release memory delay(2000); }

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
thkana👍を押しています

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Bluetooth

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

M5Stack

M5Stackは、小型のマイコンモジュールです。拡張モジュールが豊富に用意されており、センサと組み合わせることで測定機能を自由に追加することができます。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。