p5jsを使ったウェブアプリを作る中で、MPU-6050を使ったデバイスからのデータを処理している。
バイトオーダーで少し引っかかったので、情報を整理。
MPU-6050のバイトオーダー
- MPU-6050の加速度やジャイロの出力値は各軸の値で16ビット
- I2Cのレジスタからバイト単位で読み出す
- アドレス順に読み出した場合、先に読み出すのは上位バイトになる(ビッグエンディアン)
- そのままのバイト列で送信した場合、16ビットの値に戻すときには先に来た8ビットを上位にする
通常のバイトオーダー
- マイコン等の処理で16ビット値をキャストしてバイト単位で見る場合、下位バイトが先にくることが多い(リトルエンディアン)
- ESP32でも先に下位バイトがくる
- ESP32でMPU-6050の出力値を読み出す場合、バイト列をそのまま16ビット値として使うことはできない
8ビット値として読んで、並べ替えて16ビット値に戻す
p5jsで読み出す場合
- ESP32でMPU-6050の出力値を読み出しBLEで送信したものをp5jsのウェブアプリ上で処理するケース
- 読み出したバイト列をそのままBLEで送信することを想定
- getInt16で2つめの引数にfalseを渡すことで、ビッグエンディアンで処理される
- 先にきたバイトを上位バイトとして扱ってくれるので、正しい16ビット値に戻すことができる
- 別途ESP32の方で別の16ビット値をバイト列に加えた場合、こちらはリトルエンディアンになるので2つめの引数はtrueを渡す