M5Stack Gray には MPU9250 が搭載されていて、加速度、ジャイロ、磁気を計測することができますが、買ってすぐに Arduino のサンプルスケッチを動かしてみただけだったので、 MicroPython で値を読み出してみました。
MPU9250 モジュール
M5Stack の MicroPython では MPU9250 モジュールが組み込まれているので、 import するだけで使えるようになっています。モジュールの内容は下記で参照することができます。
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)
これを実行すると下記のような表示になります。
公式のサンプルも下記に公開されています。
https://github.com/m5stack/M5Cloud/blob/master/examples/mpu9250/basic/main.py
まとめ
今回はとりあえずセンサーの値をそのまま読み出すだけでしたが、これらのセンサーの値はこのままでは意味がなく、計算して方位などがわかるようにしたかったのですが、そのためにはキャリブレーションが必要になってくるので、今後その方法も調べて、アバター等と組み合わせて有効に使えるようにしていきたいと思います。