M5Stack Gray の MPU9250 の値を MicroPython で読み取る

 M5Stack Gray には MPU9250 が搭載されていて、加速度、ジャイロ、磁気を計測することができますが、買ってすぐに Arduino のサンプルスケッチを動かしてみただけだったので、 MicroPython で値を読み出してみました。

www.switch-science.com

MPU9250 モジュール

 M5Stack の MicroPython では MPU9250 モジュールが組み込まれているので、 import するだけで使えるようになっています。モジュールの内容は下記で参照することができます。

github.com

 MPU9250 は MPU6500(加速度、ジャイロ)+ AK8963(磁気) の組み合わせになっているようで、それぞれを明示的に初期化して MPU9250 の初期化時に指定することもできるようになっています。今回は磁気センサーの値から方位を計算することをしてみようとしたのですが、 AK8963 のキャリブレーションについてはメソッドが用意されているわけでもなさそうで、方法が調べ切れなかったので、ひとまず値をそのまま読み出すところまでにしています。

サンプルコード

 今回実装したサンプルは下記のような内容になります。 MPU9250 は I2C 接続になっていて、 SDA が 21番ピン、 SCL が 22 番ピンになっているようなので、 I2C のインスタンス作成時にそのピンを指定し、 MPU9250 のインスタンス作成時に I2C のインスタンスを渡しています。あとはそのインスタンスから acceleration gyro magnetic でそれぞれの値がタプルで返ってくるので、それをバラして画面表示させています。

from m5stack import lcd
from machine import I2C, Pin
from mpu9250 import MPU9250
import time

i2c = I2C(sda = 21, scl = 22)
sensor = MPU9250(i2c)

lcd.clear()
lcd.setCursor(0, 0)
lcd.setColor(lcd.WHITE)

fw, fh = lcd.fontSize()

lcd.print('Acceleration', 0, 0)
lcd.print('Gyro', 0, fh * 4)
lcd.print('Magnetic', 0, fh * 8)

while True:
    ax, ay, az = sensor.acceleration
    gx, gy, gz = sensor.gyro
    mx, my, mz = sensor.magnetic
    
    lcd.print(' ax: {:+.5f}'.format(ax), 0, fh * 1)
    lcd.print(' ay: {:+.5f}'.format(ay), 0, fh * 2)
    lcd.print(' az: {:+.5f}'.format(az), 0, fh * 3)
    
    lcd.print(' gx: {:+.5f}'.format(gx), 0, fh * 5)
    lcd.print(' gy: {:+.5f}'.format(gy), 0, fh * 6)
    lcd.print(' gz: {:+.5f}'.format(gz), 0, fh * 7)
    
    lcd.print(' mx: {:+.5f}'.format(mx), 0, fh * 9)
    lcd.print(' my: {:+.5f}'.format(my), 0, fh * 10)
    lcd.print(' mz: {:+.5f}'.format(mz), 0, fh * 11)
    
    time.sleep_ms(20)

 これを実行すると下記のような表示になります。

f:id:akanuma-hiroaki:20181027233113j:plain

 公式のサンプルも下記に公開されています。

https://github.com/m5stack/M5Cloud/blob/master/examples/mpu9250/basic/main.py

まとめ

 今回はとりあえずセンサーの値をそのまま読み出すだけでしたが、これらのセンサーの値はこのままでは意味がなく、計算して方位などがわかるようにしたかったのですが、そのためにはキャリブレーションが必要になってくるので、今後その方法も調べて、アバター等と組み合わせて有効に使えるようにしていきたいと思います。