【Raspberry Pi】BMX055でジャイロ・加速度の測定
はじめに
こんなこと、やります。 - ジャイロ・加速度・磁気を合計9軸測れるBOSCHのBMX055の使い方 - Raspberry PiでI2C通信、センサのデータを取得する

準備
Raspberry PiでBMX055センサを使うための準備を行います。
Raspberry PiでI2C通信をつかえるようにする
Raspberry PiでI2C通信を行うには、初期設定が必要です。詳しくは に書きましたので、初期設定を済ませてください。
BMX055のピン役割
BMX055のピン役割はこちらの図のとおりです。
ジャンパーピンの設定
Raspberry PiでBMX055を使用する場合、ジャンパーピンのはんだ付けが必要です。センサの電源電圧が3.3V、データ信号の電圧は3.3Vで使いますので、JP7をはんだ付けしてショートさせます。
Raspberry PiとBMX055の配線
次のようにして、Raspberry PiとBMX055を配線します。

———- | —- | ————– ||
1 | GND | GND |
2 | SDA | GPIO2 |
3 | SCL | GPIO3 |
4 | 3V3 | +3.3V |
5 | VCCIO | +3.3V |
6 | VCC | +3.3V |
I2Cアドレスの確認
Raspberry
Piとセンサの配線が完了しましたら、i2cdetect -y 1
コマンドを実行してI2Cアドレスの確認を行います。センサが認識できていれば、3つのアドレスが表示されるはずです。
$ sudo i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- 13 -- -- -- -- -- 19 -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- 69 -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
I2Cアドレスの意味
それぞれのアドレスは、次ように加速度・ジャイロ・磁気の各種センサに対応してます。
センサ | アドレス |
---|---|
加速度センサ | 0x19 |
ジャイロセンサ | 0x69 |
磁気センサ | 0x13 |
ジャイロ・加速度の方向
ここでは、BMX055センサのジャイロ・加速度の方向を説明します。なお磁気センサについては省略します。
### ジャイロセンサのRoll・Yaw・Pitch
ジャイロセンサのRoll(ロール)、Yaw(ヨー)、Pitch(ピッチ)は、次の図の方向になります。
加速度センサの方向
加速度センサの方向は次のずのようになります。BMX055センサモジュールの場合、垂直軸の加速度が重力方向と逆向きであることに注意してください。

ジャイロセンサと加速度センサの違い
ジャイロセンサと加速度センサの違いを簡単に説明します。 ジャイロセンサは、「角速度」を測ることのできるセンサです。 角速度とは、簡単にいえば「物体が回転しているスピード」のことです。ですから、直線方向の動きはジャイロセンサで感知することができません。
一方、加速度センサでは、直線方向に加速する物体の「加速度」を測ることができます。重力も加速度ですから、加速度センサで感知できます。 加速度センサでは、重力加速度センサを利用して姿勢角度を計算できます。詳しくは をご覧ください。
Raspberry Piでジャイロ・加速度センサの値を読み取る
さいごに、Raspberry Piでジャイロ・加速度センサの値を読み取ってみましょう。
ソースコード
import smbus
import time
= 0x19
ACCL_ADDR = 0x69
GYRO_ADDR
= smbus.SMBus(1)
bus
0x0F, 0x03)
bus.write_byte_data(ACCL_ADDR, 0x10, 0x08)
bus.write_byte_data(ACCL_ADDR, 0x11, 0x00)
bus.write_byte_data(ACCL_ADDR,
0.5)
time.sleep(
0x0F, 0x04)
bus.write_byte_data(GYRO_ADDR, 0x10, 0x07)
bus.write_byte_data(GYRO_ADDR, 0x11, 0x00)
bus.write_byte_data(GYRO_ADDR, 0.5)
time.sleep(
def accl():
= yA = zA = 0
xA
try:
= bus.read_i2c_block_data(0x19, 0x02, 6)
data # Convert the data to 12-bits
= ((data[1] * 256) + (data[0] & 0xF0)) / 16
xA if xA > 2047:
-= 4096
xA = ((data[3] * 256) + (data[2] & 0xF0)) / 16
yA if yA > 2047:
-= 4096
yA = ((data[5] * 256) + (data[4] & 0xF0)) / 16
zA if zA > 2047:
-= 4096
zA except IOError as e:
print("I/O error({0}): {1}".format(e.errno, e.strerror))
return xA, yA, zA
def gyro():
= yG = zG = 0
xG
try:
= bus.read_i2c_block_data(GYRO_ADDR, 0x02, 6)
data # Convert the data
= (data[1] * 256) + data[0]
xG if xG > 32767:
-= 65536
xG
= (data[3] * 256) + data[2]
yG if yG > 32767:
-= 65536
yG
= (data[5] * 256) + data[4]
zG if zG > 32767:
-= 65536
zG
except IOError as e:
print("I/O error({0}): {1}".format(e.errno, e.strerror))
return xG, yG, zG
if __name__ == "__main__":
while True:
= accl()
xAccl, yAccl, zAccl = gyro()
xGyro, yGyro, zGyro
print("acceleration -> x:{}, y:{}, z: {}".format(xAccl, yAccl, zAccl))
print("Gyro -> x:{}, y:{}, z: {}".format(xGyro, yGyro, zGyro))
0.1) time.sleep(
プログラムの実行
次のようにして、プログラムを実行してみてください。BMX055センサをいろいろな方向に動かすと、加速度やジャイロの値が変化するはずです。
$ python bmx055.py
Accl -> x:10, y:-290, z: 969
Gyro -> x:217, y:94, z: -314
Accl -> x:29, y:-286, z: 1017
Gyro -> x:1710, y:117, z: -64
Accl -> x:15, y:-280, z: 969
Gyro -> x:3480, y:320, z: -582
Accl -> x:23, y:-260, z: 1010
Gyro -> x:3054, y:247, z: -341
関連記事
- 10日で作る!ラズパイ倒立振子ロボット
- 加速度センサで角度の計算|ArduinoとMMA8452Q
- 超音波センサHC-SR04の使い方|ArduinoとRaspberry Piで解説
- ESP32でESP-NOWを使って通信してみよう
- M5StickC PLUSの加速度センサで振動測定と周波数特性