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を渡す