M5Stack GrayにはMPU9250という9軸センサ(それぞれ3軸の加速度、ジャイロ、磁気)が搭載されています。これを利用してモータースポーツなどで見かけるGボウルを描画します。
m5stackでGボウル動いたよ pic.twitter.com/zEBYiCFPTf
— きー (Mitsukuni Sato) (@key3) 2019年3月16日
I2Cを初期化してMPU9250用のインスタンスを作ります。
from machine import I2C
from mpu9250 import MPU9250
i2c = I2C(sda=21, scl=22)
sensor = MPU9250(i2c)
値を取得してループしながら描画します。
x, y = 0, 0
while True:
ax, ay, az = sensor.acceleration
# オリジナルのX軸は左が正の値なので反転
ax = ax * -1
# 前回描画したボールを削除
lcd.circle(x, y, 5, lcd.BLACK, lcd.BLACK)
# Gボウルを描画
lcd.circle(160, 120, 110, lcd.WHITE)
lcd.circle(160, 120, 55, lcd.WHITE)
lcd.line(50, 120, 270, 120, lcd.WHITE)
lcd.line(160, 10, 160, 230, lcd.WHITE)
# ボールを描画
x = int(ax * (55 / 10)) + 160
y = int(ay * (55 / 10)) + 120
lcd.circle(x, y, 5, lcd.RED, lcd.RED)
time.sleep_ms(20)
サンプルコードはこちら。
https://github.com/key/playground-m5stack/blob/master/mpu9250_gbowl/main.py
課題
- 再描画時のチラツキ
- XOR取って必要な部分だけ再描画するとちらつきが無くなると思います
- (VRAM直接ポチポチしてた頃にやってたような古典的な対応)
- 加速度センサのノイズ
- ローパスフィルタや移動平均などを使ってならすと良いかも知れません