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

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

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

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

Q&A

解決済

2回答

920閲覧

microbitからbluetoothで取得した値のデコード方法

noob.engineer

総合スコア2

Python

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

0グッド

0クリップ

投稿2021/01/20 00:37

前提・実現したいこと

microbitで取得可能な加速度センサの値をbluetoothを利用してraspberry piでAPIを使わずに取得したいです。
microbitの資料には以下のように

Exposes accelerometer data. An accelerometer is an electromechanical device that will measure acceleration forces.

These forces may be static, like the constant force of gravity pulling at your feet, or they could be dynamic - caused by moving or vibrating the accelerometer.
Value contains fields which represent 3 separate accelerometer measurements for X, Y and Z axes as 3 unsigned 16 bit values in that order and in
little endian format.
Data can be read on demand or notified periodically.

記載されているのですが、実際にraspberry piで取得したデータは、

b'\x08-\xb9\xd2\xe8\x91'

b'\xe5(2\xd68\x8e'
b'\xb8\x19\xe1\xd3\xe8\x91'
b'"&\xee\xccs\x8f'
b'`#?\xcf\xfd\x8c'
b'\xcb/h\xd0\x9b\x85'
b"\x84'\xd4\xda\xe8\x91"
b"\x84'\x83\xd8\xae\x90"
b'\xcb/%\xdd8\x8e'
b'F*\x90\xd1\xc2\x8b'
b'\x08-\xb9\xd2\x11\x88'

となっています。上記データをどのようにデコードすればよいのでしょうか?
よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

microbitの資料
https://lancaster-university.github.io/microbit-docs/resources/bluetooth/bluetooth_profile.html

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

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

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

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

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

ikadzuchi

2021/01/20 00:58

どのあたりから分からないのでしょうか。 お示しのデータが各行6バイトづつのデータであることは分かっていますか? Pythonでのバイナリデータの扱い方は分かりますか?
noob.engineer

2021/01/20 01:28

説明が不十分で申し訳ありません。 6バイトであることが分かっておりません。 例えば、b'\xb8\x19\xe1\xd3\xe8\x91'であれば、 "\x"で区切られた6つであるとは思うのですが、 b'\xcb/%\xdd8\x8e'のように必ずしも6つで区切れるわけでもなく。。。 勉強するべき分野さえ、わかっておりません。
guest

回答2

0

その文章を読もう。
google翻訳
加速度計データを公開します。加速度計は、加速力を測定する電気機械装置です。 これらの力は、足を引っ張る一定の重力のように静的な場合もあれば、加速度計を動かしたり振動させたりすることによって引き起こされる動的な場合もあります。 値には、X、Y、Z軸の3つの個別の加速度計測定値を3つの符号なし16ビット値としてこの順序で表すフィールドが含まれています。 リトルエンディアン形式。 データはオンデマンドで読み取るか、定期的に通知することができます。

3つの、符号なし16ビットのリトルエンディアンです
これに従ってバイナリデータを解釈しましょう

投稿2021/01/20 01:25

y_waiwai

総合スコア88042

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

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

noob.engineer

2021/01/20 02:21

頓珍漢な質問かもしれませんが、 b'\xcb/%\xdd8\x8e' 左記データの どこからどこまでが、Xで、 どこからどこまでが、Yで、 どこからどこまでが、Zで、 なのかが、わかっておりません。
y_waiwai

2021/01/20 02:57

一つの数値が16ビット値ですんで、2バイトで一つの数値を表します ということで、先頭から2バイトがXで、その次の2バイトがYで、そのまた次の2バイトがZですね 「python バイト 整数」あたりでぐぐるとやり方が出てくるかと思います
noob.engineer

2021/01/20 04:58 編集

たびたびすみません。 まず、X,Y,Zの割り当てについて伺いたいのですが、 b"\x84'\xd4\xda\xe8\x91"の場合は、 x : b"\x84'"  y : b'\xd4\xda' z : b'\xe8\x91' b'\xb8\x19\xe1\xd3\xe8\x91'の場合は、 x : b'\xb8\x19' y : b'\xe1\xd3' z :b'\xe8\x91' b'`#?\xcf\xfd\x8c'の場合は、 x : b'`#' y : b'?\xcf' z :b'\xfd\x8c' であってますでしょうか?
y_waiwai

2021/01/20 05:03

データは6バイトないとおかしいです 2バイトの数値が3つですんで、6バイトないとダメですね 通信周りを見直すほうがよろしいかと
noob.engineer

2021/01/20 05:52

なるほど。 「2バイトの数値が3つですんで、6バイトないとダメですね」のご指摘で、 モヤモヤがすっきりしました。通信回りを見直すor6バイトの時だけ利用する。ですね。 ありがとうございます。 おかげさまで、次の作業に進めます。
guest

0

ベストアンサー

b"\x84'\xd4\xda\xe8\x91"の場合は、


であってますでしょうか?

はい、そのとおりです。
バイト列を表示しようとすると、バイトごとに、ASCIIの範囲で表せるものは文字で、そうでないものはエスケープされて\x+16進数で表される形になります。
思えばこのようなテキスト表現を何と呼ぶのか知りませんね…。
表示は一見分かりにくいですが、各行6バイトで正しく取れていますので、通信周りは正しく動作しているようです。
あとは単純にバイト列を読むだけですので、取ってきた値をvalとして

python

1x = val[1]+val[0]*256 2y = val[3]+val[2]*256 3z = val[5]+val[4]*256

のような形でいけるでしょう。

投稿2021/01/20 12:38

ikadzuchi

総合スコア3047

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

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

noob.engineer

2021/01/21 06:46

実機で欲しいデータを取得できるようになりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問