Raspberry PiでMPU9250を使う

海外通販のAli Expressで9軸センサ(加速度、ジャイロ、コンパス)のMPU9250を買ってみたので、Raspberry Piに繋いでみました。
ちなみに、中国から10日くらいで届きました。

接続は簡単で下記の4本です。
MPU9250 <->Raspberry Pi
VCC - 3V3
SCA - GPIO2
SCL - GPIO3
GND - GND

Raspberry PiのI2Cを有効化します。
デフォルトでは無効だったと思います。

sudo raspi-config

上記のコマンドで、config画面を出して、Interfacing Options→I2C→Yesを選択。

f:id:oki-lab:20190216220810p:plain

更に下記リンク先に書かれていることを実行していきます。
https://learn.adafruit.com/adafruit-16-channel-servo-driver-with-raspberry-pi/configuring-your-pi-for-i2c

以下のコマンドで必要な物をインストールします。

sudo apt-get install python-smbus
sudo apt-get install i2c-tools

センサを接続した状態で以下を実行すると68が認識されていると思います。

sudo i2cdetect -y 1

これで使用準備はできたので、ライブラリをインストールします。

github.com

pip install FaBo9Axis_MPU9250

今回は、上記リンク先のサンプルプログラムを少し改造して、
ロール角、ピッチ角を計算してみます。ヨー角は良く分からなかったのでパス。

import FaBo9Axis_MPU9250
import time
import sys
import numpy as np

mpu9250 = FaBo9Axis_MPU9250.MPU9250()

try:
    while True:
        accel = mpu9250.readAccel()
        print " ax = " , ( accel['x'] )
        print " ay = " , ( accel['y'] )
        print " az = " , ( accel['z'] )

        gyro = mpu9250.readGyro()
        print " gx = " , ( gyro['x'] )
        print " gy = " , ( gyro['y'] )
        print " gz = " , ( gyro['z'] )

        mag = mpu9250.readMagnet()
        print " mx = " , ( mag['x'] )
        print " my = " , ( mag['y'] )
        print " mz = " , ( mag['z'] )

        theta=np.arctan(accel["y"]/np.sqrt(accel["x"]**2+accel["z"]**2))
        phi=np.arctan(accel["x"]/accel["z"])
        
        print (theta*180./np.pi)
        print (phi*180./np.pi)

        time.sleep(0.1)

except KeyboardInterrupt:
    sys.exit()

実行するとこんな感じです。

f:id:oki-lab:20190216222145p:plain

本当は最初にオフセットして数値を整えるべきだと思いますが
今回はテストということでそこまではやっていません。

3ドルくらいで買えてちゃんと動作したので満足です。
ちなみに2個買って、両方共動きました。