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

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

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

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

M5Stack

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

Arduino

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

Q&A

解決済

2回答

5802閲覧

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

menshan

総合スコア54

Bluetooth

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

M5Stack

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

Arduino

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

1グッド

0クリップ

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

とりあえず、てもとではM5Stack gray, Arduino IDE1.8.13(Win10/ストアでないほう), ボードライブラリesp32 1.0.6でサンプルBLE_scanが難なく動いています(これってM5StackではなくESP32の方のサンプルですよね?)。既に他回答にありますが、これが動かないことの方が問題でしょう。

ボードライブラリの削除/再インストール等試してみては。

投稿2021/07/20 01:54

thkana

総合スコア7645

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

menshan

2021/07/20 07:22 編集

ハードの種類を書いて無かったですが M5Stack Core Basic です。 M5Stack gray とは加速度センサーが違うだけでBLEの差異は無さそうです。 サンプルは ESP32の方のサンプルで、ボードライブラリもesp32 1.0.6 です。 サンプルがそのまま動かないのがそもそもおかしいと思いますので ライブラリとかIDEのバージョン変更、ファーム初期化などして確認してみます。
menshan

2021/07/20 23:44

その後いろいろ試してみて解決に至りました。 詳細は元の本文に追記しました。 色々情報ありがとうございました。
thkana

2021/07/21 00:23

> 周辺にBLE機器多すぎて Serial.printf の処理が重くて処理が間に合わずハングアップ そういうこともあるんですね...情報共有ありがとうございます。 私もBLE_Scanを走らせた時に「こんなにBLEモノあったっけ?」と思いましたけれど。
guest

0

まずはそのサンプルプログラムできちんと動くのを確認しましょう
それで動かない、というのであれば、どこかでなんか間違ってるってことです。

それをろくに確認もしないで、うわべだけで動くように修正したところで、無駄でしかないです

投稿2021/07/19 23:46

y_waiwai

総合スコア87782

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問