ラズパイでBMX055の使い方
この記事では、Raspberry Piでジャイロセンサーおよび加速度センサーを使う方法を解説していく。 ジャイロ・加速度・磁気を合計9軸測れるBOSCHのBMX055センサーを使用した。ラズパイとBMX055との接続はI2C通信で行う。
I2Cの設定方法はこちらの記事を参考に
BMX055センサモジュールについて
今回は秋月電子で購入した「9軸センサモジュール(BMX055)」を使用する。
9軸センサモジュール(BMX055)
ジャンパーピンの設定
ラズパイで使用する場合は、ジャンパーピンの半田付け作業をする必要がある。センサーの電源は3.3V、またデータ信号の電圧範囲は3.3Vなので、JP7のみを半田付けしてショートさせる。
ラズパイとBMX055の配線
ラズパイとBMX055の配線は次の通り。
BMX055ピン | 役割 | ラズパイ接続先 |
---|---|---|
1 | GND | GND |
2 | SDA | GPIO2 |
3 | SCL | GPIO3 |
4 | 3V3 | +3.3V |
5 | VCCIO | +3.3V |
6 | VCC | +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
加速度センサーの方向
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
この記事で扱った関連製品はこちら
Raspberry Piの参考書
本書は、全世界で多くのユーザーの支持を集めているマイコンボード「Raspberry Pi」を使いこなすためのレシピ集です。ハードウェアの基本、オペレーティングシステムの使い方、ネットワーク接続、Pythonプログラミングの基本を紹介した上デ、実際の作品製作に必要になる、高度なPythonプログラミング、GPIO(汎用入出力)、モーター、センサー、ディスプレイなどの使い方へと解説を進めていきます。
Amazon本書は、大人から子供まで、初心者の方でも、ラズパイZeroとラズパイZero WをIoTのデバイスとして使いこなせるようになることを目的とした入門書です。また、ラズパイZeroとラズパイZero WをUSBケーブル1本でパソコンに接続できる便利な「Zero over USB」について、日本で初めて詳しく解説しました。
Amazon最後まで読んでいただきありがとうございました。
「この記事が参考になったよ」という方は、ぜひ記事をシェアをしていただけるととても嬉しいです。
今後も有益な記事を書くモチベーションにつながりますので、どうかよろしくお願いいたします。↓↓↓↓↓↓↓