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

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

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

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

M5Stack

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

2881閲覧

複数のBluetooth機器からデータを取得する(データ取得間隔が短くできない)

inugami.mamoru

総合スコア20

Bluetooth

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

M5Stack

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/06/18 04:36

複数のM5StickCをBT接続して、加速度センサの値を取得しようと考えています。
データ取得はPythonで行います。

Bleakライブラリを用いて以下のようなスクリプトを作成しましたが、
データ取得間隔がデータ送信間隔(1秒に20回)より大幅に遅くなります。

データ取得間隔をより早くするにはどのようにコードを改良すればよいでしょうか。

python

1import asyncio 2from bleak import BleakClient 3 4address1 = "D8:A0:1D:55:EE:8A" 5UUID1 = "beb5483e-36e1-4688-b7f5-ea07361b26a8" 6 7address2 = "94:B9:7E:93:21:76" 8UUID2 = "beb5483e-36e1-4688-b7f5-ea07361b26a2" 9 10async def main(): 11 client1 = BleakClient(address1) 12 client2 = BleakClient(address2) 13 print(client1.address) 14 print(client2.address) 15 await client1.connect() 16 await client2.connect() 17 while(True): #ここが遅い 18 print(await client1.read_gatt_char(UUID1)) 19 print(await client2.read_gatt_char(UUID2)) 20 21if __name__ == "__main__": 22 loop = asyncio.get_event_loop() 23 loop.run_until_complete(main())

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

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

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

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

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

guest

回答2

0

コードを以下のように変更して、前のデータから次のデータまでの差の時間を見てみました。

python

1from bleak import BleakClient 2import asyncio 3import time 4 5address1 = "D8:A0:1D:55:EE:8A" 6UUID1 = "beb5483e-36e1-4688-b7f5-ea07361b26a8" 7 8address2 = "94:B9:7E:93:21:76" 9UUID2 = "beb5483e-36e1-4688-b7f5-ea07361b26a2" 10 11adresses = [address1, address2] 12UUIDs = [UUID1, UUID2] 13 14def run(addresses, UUIDs): 15 loop = asyncio.get_event_loop() 16 task = asyncio.gather(*(connect_to_device(address, UUID) for address, UUID in zip(addresses, UUIDs))) 17 loop.run_until_complete(task) 18 19async def connect_to_device(address, UUID): 20 print("starting", address, "loop") 21 async with BleakClient(address, timeout=5) as client: 22 print("connected to", address) 23 time0 =time.time() 24 while(True): 25 tasks = {client.read_gatt_char(UUID)} 26 done, not_done = await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED) 27 for tasks in done: 28 try: 29 now=time.time() 30 print(now-time0, await tasks) 31 except Exception as e: 32 print(e) 33 not_done.add(tasks) 34 time0=now 35 tasks = not_done 36 37if __name__ == "__main__": 38 run(adresses, UUIDs)

*****pythonスクリプトの出力***********

0.1186833381652832 bytearray(b'A,-0.06,-0.50,10.33,79.84,2.28,286.76')
0.11967945098876953 bytearray(b'A,-0.12,-0.65,10.50,81.29,2.99,288.47')
0.12067699432373047 bytearray(b'A,-0.21,-0.69,10.44,82.81,3.73,290.00')
0.12067699432373047 bytearray(b'A,-0.12,-0.68,10.31,84.44,4.49,291.56')
0.1186823844909668 bytearray(b'A,-0.17,-0.62,10.38,85.82,5.34,293.14')
0.12067770957946777 bytearray(b'A,-0.16,-0.75,10.49,87.51,6.19,294.74')
0.11967945098876953 bytearray(b'A,-0.31,-0.69,10.43,88.90,7.11,-64.47')
2.2290396690368652 bytearray(b'B,-0.07,0.20,10.17,-70.31,-20.39,235.95')
0.12067818641662598 bytearray(b'A,-0.12,-0.72,10.44,90.40,8.03,-62.86')
0.11967921257019043 bytearray(b'A,-0.04,-0.63,10.42,91.93,8.99,-61.23')

おおよそ0.12秒の間隔でM5StickCの一つ、「A」のデータが測定できています。1秒間に20点には届きませんが、何とか使えそうです。

ところが、もう一つのM5StickC「B」のデータは二秒おきぐらいにまばらにしか測定できないのです。

二つのデータが均等に測定できないか、別の質問をお願いしています。
https://teratail.com/questions/edit/345571

投稿2021/06/25 04:32

inugami.mamoru

総合スコア20

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

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

0

while(True): #ここが遅い

whileが1回辺り何秒で動いているのか、計測してみてください。
1秒に20回も動いていなければ、取得が追いつかないのは当然です。
「python while 速度」でググるとwhileは遅くforの方が少し速いと出てきますので、forで書き換えてみたらどうでしょうか?

投稿2021/06/18 05:58

Wind

総合スコア442

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

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

inugami.mamoru

2021/06/18 06:48 編集

ありがとうございます。ただ、下のコードのように1個のBT機器からの受信とすると受信速度が大幅にアップするのです。 import asyncio from bleak import BleakClient address1 = "D8:A0:1D:55:EE:8A" UUID1 = "beb5483e-36e1-4688-b7f5-ea07361b26a8" address2 = "94:B9:7E:93:21:76" UUID2 = "beb5483e-36e1-4688-b7f5-ea07361b26a2" async def main(): client1 = BleakClient(address1) client2 = BleakClient(address2) print(client1.address) print(client2.address) await client1.connect() # await client2.connect() while(True): #ここが遅い print(await client1.read_gatt_char(UUID1)) # print(await client2.read_gatt_char(UUID2)) if __name__ == "__main__": loop = asyncio.get_event_loop() loop.run_until_complete(main())
Wind

2021/06/23 02:02

「大幅に遅くなります」や「大幅にアップ」では、具体的な速度が不明です。 最初の回答にも書きましたが、whileが1回に何ミリ秒かかるのか、計測してみてはどうでしょうか? またBT通信を使わずシンプルにawaitの中を50ミリ秒のループやスリープにしてみてはどうでしょうか? そうすればコードの改良点が見えてくるかと思います。
inugami.mamoru

2021/06/25 04:31 編集

コードを以下のように変更して、前のデータから次のデータまでの差の時間を見てみました。 from bleak import BleakClient import asyncio import time address1 = "D8:A0:1D:55:EE:8A" UUID1 = "beb5483e-36e1-4688-b7f5-ea07361b26a8" address2 = "94:B9:7E:93:21:76" UUID2 = "beb5483e-36e1-4688-b7f5-ea07361b26a2" adresses = [address1, address2] UUIDs = [UUID1, UUID2] def run(addresses, UUIDs): loop = asyncio.get_event_loop() task = asyncio.gather(*(connect_to_device(address, UUID) for address, UUID in zip(addresses, UUIDs))) loop.run_until_complete(task) async def connect_to_device(address, UUID): print("starting", address, "loop") async with BleakClient(address, timeout=5) as client: print("connected to", address) time0 =time.time() while(True): tasks = {client.read_gatt_char(UUID)} done, not_done = await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED) for tasks in done: try: now=time.time() print(now-time0, await tasks) except Exception as e: print(e) not_done.add(tasks) time0=now tasks = not_done if __name__ == "__main__": run(adresses, UUIDs) *****pythonスクリプトの出力*********** 0.1186833381652832 bytearray(b'A,-0.06,-0.50,10.33,79.84,2.28,286.76') 0.11967945098876953 bytearray(b'A,-0.12,-0.65,10.50,81.29,2.99,288.47') 0.12067699432373047 bytearray(b'A,-0.21,-0.69,10.44,82.81,3.73,290.00') 0.12067699432373047 bytearray(b'A,-0.12,-0.68,10.31,84.44,4.49,291.56') 0.1186823844909668 bytearray(b'A,-0.17,-0.62,10.38,85.82,5.34,293.14') 0.12067770957946777 bytearray(b'A,-0.16,-0.75,10.49,87.51,6.19,294.74') 0.11967945098876953 bytearray(b'A,-0.31,-0.69,10.43,88.90,7.11,-64.47') 2.2290396690368652 bytearray(b'B,-0.07,0.20,10.17,-70.31,-20.39,235.95') 0.12067818641662598 bytearray(b'A,-0.12,-0.72,10.44,90.40,8.03,-62.86') 0.11967921257019043 bytearray(b'A,-0.04,-0.63,10.42,91.93,8.99,-61.23') おおよそ0.12秒の間隔でM5StickCの一つ、「A」のデータが測定できています。1秒間に20点には届きませんが、何とか使えそうです。 ところが、もう一つのM5StickC「B」のデータは二秒おきぐらいにまばらにしか測定できないのです。 二つのデータが均等に測定できないか、別の質問をお願いしています。 https://teratail.com/questions/edit/345571
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問