【Raspberry Pi】BMX055でジャイロ・加速度の測定

こんなこと、やります。

  • ジャイロ・加速度・磁気を合計9軸測れるBOSCHのBMX055の使い方
  • Raspberry PiでI2C通信、センサのデータを取得する

【Raspberry Pi】BMX055でジャイロ・加速度の測定
【Raspberry Pi】BMX055でジャイロ・加速度の測定

つかうもの

この記事でつかうものを説明します。

Raspberry Pi

お好きなRaspberry Piをご使用ください。

なお、Raspberry Piの操作は、MacのターミナルからSSHでリモート操作します。SSHのセットアップは、 Raspberry Pi zero WHをモニター・キーボードなしでSSH接続するまで をご覧ください。

BMX055センサ

BMX055センサモジュールは秋月電子通商で購入しました。ジャイロ・加速度・磁気を合計9軸測れるBOSCHのBMX055を搭載してます。

他にも、MPU9250を搭載したジャイロ・加速度・磁気センサが人気です。こちらもI2Cで通信可能です。

その他の電子部品

ブレッドボードやジャンプワイヤをお持ちでない方は揃えてください。

準備

Raspberry PiでBMX055センサを使うための準備を行います。

Raspberry PiでI2C通信をつかえるようにする

Raspberry PiでI2C通信を行うには、初期設定が必要です。詳しくは 【Raspberry Pi】はじめてのI2C設定 に書きましたので、初期設定を済ませてください。

BMX055のピン役割

BMX055のピン役割はこちらの図のとおりです。

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

ジャンパーピンの設定

Raspberry PiでBMX055を使用する場合、ジャンパーピンのはんだ付けが必要です。センサの電源電圧が3.3V、データ信号の電圧は3.3Vで使いますので、JP7をはんだ付けしてショートさせます。

Raspberry PiとBMX055の配線

次のようにして、Raspberry PiとBMX055を配線します。

Raspberry PiとBMX055の配線図
Raspberry PiとBMX055の配線図

BMX055ピン役割Raspberry Pi接続先
1GNDGND
2SDAGPIO2
3SCLGPIO3
43V3+3.3V
5VCCIO+3.3V
6VCC+3.3V

I2Cアドレスの確認

Raspberry Piとセンサの配線が完了しましたら、i2cdetect -y 1コマンドを実行してI2Cアドレスの確認を行います。センサが認識できていれば、3つのアドレスが表示されるはずです。

shell
$ 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(ピッチ)は、次の図の方向になります。

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

加速度センサの方向

加速度センサの方向は次のずのようになります。BMX055センサモジュールの場合、垂直軸の加速度が重力方向と逆向きであることに注意してください。

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

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

ジャイロセンサと加速度センサの違いを簡単に説明します。 ジャイロセンサは、「角速度」を測ることのできるセンサです。 角速度とは、簡単にいえば「物体が回転しているスピード」のことです。ですから、直線方向の動きはジャイロセンサで感知することができません。

一方、加速度センサでは、直線方向に加速する物体の「加速度」を測ることができます。重力も加速度ですから、加速度センサで感知できます。 加速度センサでは、重力加速度センサを利用して姿勢角度を計算できます。詳しくは 加速度センサで角度の計算|ArduinoとMMA8452Q をご覧ください。

Raspberry Piでジャイロ・加速度センサの値を読み取る

さいごに、Raspberry Piでジャイロ・加速度センサの値を読み取ってみましょう。

ソースコード

py
# -*- 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)

プログラムの実行

次のようにして、プログラムを実行してみてください。BMX055センサをいろいろな方向に動かすと、加速度やジャイロの値が変化するはずです。

shell
$ 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

関連記事

最後までご覧いただきありがとうございます!

▼ 記事に関するご質問やお仕事のご相談は以下よりお願いいたします。
お問い合わせフォーム

関連記事