ラズパイでBMX055の使い方

この記事では、Raspberry Piでジャイロセンサーおよび加速度センサーを使う方法を解説していく。 ジャイロ・加速度・磁気を合計9軸測れるBOSCHのBMX055センサーを使用した。ラズパイとBMX055との接続はI2C通信で行う。

I2Cの設定方法はこちらの記事を参考に

MPU9250 交換 I2C 9DOF BMX055 IMU 9軸姿勢センサーボードモジュール
MPU9250 交換 I2C 9DOF BMX055 IMU 9軸姿勢センサーボードモジュール
Amazon

BMX055センサモジュールについて

今回は秋月電子で購入した「9軸センサモジュール(BMX055)」を使用する。

9軸センサモジュール(BMX055)

9軸センサモジュール(BMX055)のピン役割
9軸センサモジュール(BMX055)のピン役割

ジャンパーピンの設定

ラズパイで使用する場合は、ジャンパーピンの半田付け作業をする必要がある。センサーの電源は3.3V、またデータ信号の電圧範囲は3.3Vなので、JP7のみを半田付けしてショートさせる。

ラズパイとBMX055の配線

ラズパイとBMX055の配線は次の通り。

ラズパイとBMX055の配線図
ラズパイとBMX055の配線図

BMX055ピン役割ラズパイ接続先
1GNDGND
2SDAGPIO2
3SCLGPIO3
43V3+3.3V
5VCCIO+3.3V
6VCC+3.3V

配線が完了したら次のコマンドを実行してアドレスが表示されるか確認しよう。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: -- -- -- -- -- -- -- --                         

それぞれのアドレスは、次ような各センサーに対応している。

センサーアドレス
加速度センサー0x19
ジャイロセンサー0x69
磁気センサー0x13

ジャイロセンサーのRoll・Yaw・Pitch

ジャイロセンサーのRoll・Yaw・Pitchの方向
ジャイロセンサーのRoll・Yaw・Pitchの方向

加速度センサーの方向

BMX055モジュールの加速度センサーの方向は図のようになっている。

加速度センサーの方向
加速度センサーの方向

ジャイロセンサーと加速度センサーの違い

ジャイロセンサーは角速度を測ることのできるセンサーである。角速度とはかんたんに言えば、物体が回転しているスピードである。直線的な動きはジャイロセンサーでは測れない。一方で加速度センサーは、直線運動する物体の加速度を測ることのできるセンサーである。

ジャイロセンサーと加速度センサーの値を読み取る

ここまで準備できたら、とりあえずジャイロと加速度の値を読み取れるか試してみよう。次のプログラムで動作確認してみた。

# -*- coding: utf-8 -*-
import smbus
import time

ACCL_ADDR = 0x19
GYRO_ADDR = 0x69

bus = smbus.SMBus(1)

# 加速度センサーの設定
# Select PMU_Range register, 0x0F(15)
#       0x03(03)    Range = +/- 2g
bus.write_byte_data(ACCL_ADDR, 0x0F, 0x03)
# Select PMU_BW register, 0x10(16)
#       0x08(08)    Bandwidth = 7.81 Hz
bus.write_byte_data(ACCL_ADDR, 0x10, 0x08)
# Select PMU_LPW register, 0x11(17)
#       0x00(00)    Normal mode, Sleep duration = 0.5ms
bus.write_byte_data(ACCL_ADDR, 0x11, 0x00)

time.sleep(0.5)


# ジャイロセンサーの設定
# Select Range register, 0x0F(15)
#       0x04(04)    Full scale = +/- 125 degree/s
bus.write_byte_data(GYRO_ADDR, 0x0F, 0x04)
# Select Bandwidth register, 0x10(16)
#       0x07(07)    ODR = 100 Hz
bus.write_byte_data(GYRO_ADDR, 0x10, 0x07)
# Select LPM1 register, 0x11(17)
#       0x00(00)    Normal mode, Sleep duration = 2ms
bus.write_byte_data(GYRO_ADDR, 0x11, 0x00)
time.sleep(0.5)


def accl():
    xA = yA = zA = 0

    try:
        data = bus.read_i2c_block_data(0x19, 0x02, 6)
        # Convert the data to 12-bits
        xA = ((data[1] * 256) + (data[0] & 0xF0)) / 16
        if xA > 2047:
            xA -= 4096
        yA = ((data[3] * 256) + (data[2] & 0xF0)) / 16
        if yA > 2047:
            yA -= 4096
        zA = ((data[5] * 256) + (data[4] & 0xF0)) / 16
        if zA > 2047:
            zA -= 4096
    except IOError as e:
        print("I/O error({0}): {1}".format(e.errno, e.strerror))

    return xA, yA, zA


def gyro():
    xG = yG = zG = 0

    try:
        data = bus.read_i2c_block_data(GYRO_ADDR, 0x02, 6)
        # Convert the data
        xG = (data[1] * 256) + data[0]
        if xG > 32767:
            xG -= 65536

        yG = (data[3] * 256) + data[2]
        if yG > 32767:
            yG -= 65536

        zG = (data[5] * 256) + data[4]
        if zG > 32767:
            zG -= 65536

    except IOError as e:
        print("I/O error({0}): {1}".format(e.errno, e.strerror))

    return xG, yG, zG




if __name__ == "__main__":

    while True:
        xAccl, yAccl, zAccl = accl()
        xGyro, yGyro, zGyro = gyro()

        print("acceleration -> x:{}, y:{}, z: {}".format(xAccl, yAccl, zAccl))
        print("Gyro -> x:{}, y:{}, z: {}".format(xGyro, yGyro, zGyro))

        time.sleep(0.1)

センサーを動かすと値が変化する。

$ 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
MPU9250 交換 I2C 9DOF BMX055 IMU 9軸姿勢センサーボードモジュール
MPU9250 交換 I2C 9DOF BMX055 IMU 9軸姿勢センサーボードモジュール
Amazon

人気のラズパイ

Raspberry Pi 4 Model B 8GB 技適マーク入 正規品!ラズベリーパイ4 モデルB
Raspberry Pi 4 Model B 8GB 技適マーク入 正規品!ラズベリーパイ4 モデルB
Amazon
TRASKIT Raspberry Pi 4 Model B Starter Kit
TRASKIT Raspberry Pi 4 Model B Starter Kit
Amazon
Raspberry Pi Zero W - ヘッダー ハンダ付け済み
Raspberry Pi Zero W - ヘッダー ハンダ付け済み
Amazon

人気のラズパイ周辺機器

10 インチRaspberry Pi用タッチモニター EleDuino HDMI モバイルディスプレイ
10 インチRaspberry Pi用タッチモニター EleDuino HDMI モバイルディスプレイ
Amazon
Raspberry Pi4 Model B /アルミニウム金属ケース/ファンレス/放熱シート付き
Raspberry Pi4 Model B /アルミニウム金属ケース/ファンレス/放熱シート付き
Amazon
Freenove Raspberry Pi 4 B 3 B+ 400用の究極のスターターキット
Freenove Raspberry Pi 4 B 3 B+ 400用の究極のスターターキット
Amazon
KEYESTUDIO DC 5V 4チャンネル リレーシールドモジュール 拡張ボード for Raspberry Pi
KEYESTUDIO DC 5V 4チャンネル リレーシールドモジュール 拡張ボード for Raspberry Pi
Amazon

Raspberry Piのオススメ入門書

Raspberry Piクックブック 第3版 (Make:PROJECTS)
Raspberry Piクックブック 第3版 (Make:PROJECTS)
Amazon
これ1冊でできる! ラズベリー・パイ 超入門 改訂第6版 Raspberry Pi 4/Zero W対応
これ1冊でできる! ラズベリー・パイ 超入門 改訂第6版 Raspberry Pi 4/Zero W対応
KindleAmazon
写真や図解でよくわかる ラズパイZeroを使い倒す本 Raspberry Pi Zero W対応
写真や図解でよくわかる ラズパイZeroを使い倒す本 Raspberry Pi Zero W対応
KindleAmazon
記事に関するご質問などがあれば、ぜひTwitterへお返事ください。