6軸モーションセンサー

Atom MatrixにはMPU6886という6軸モーションセンサーが搭載されています

1. 6軸モーションセンサとは

6軸モーションセンサーとは、「加速度センサー(3軸)」と「ジャイロスコープ(3軸)」の合計6つの動きを測定できる機能を一つのパッケージにまとめたセンサーの総称です。

加速度センサーは、デバイスがどちらに傾いているか(床に対して水平か、垂直か)を、地球の重力(1G)の力を利用して測ったり、デバイスがどれくらいの勢いで動き出したか、または止まったかを測れます

ジャイロスコープは、デバイスが1秒間に何度の速さで回転したか(または向きを変えたか)を正確に測ります。

両方の情報を組み合わせることで、「今、どの方向に、どれくらいのスピードで傾きながら回転しているか」という、複雑で正確な動きの情報を得ることができます

2. gemのインストール

MPU6886をESP32で使うために必要なことがあるのですが、今回は、あらかじめ、簡単に利用できるようにしたgemを使います

PCで R2P2-ESP32/components/picoruby-esp32/picoruby/build_config/xtensa-esp.rb この設定ファイルを開いて以下を追加してください

  conf.gem core: 'picoruby-pwm'

  conf.gem github: 'bash0C7/picoruby-mpu6886', branch: 'main' # 追加

  conf.picoruby(alloc_libc: false)

シリアルモニタを立ち上げている場合は一度 Ctl+] で終了してください

追加した設定ファイルの状態で、再度buildして、追加したgemを取り込みます

rake clean build

この内容でマイコンに書き込みます。

ESPBAUD=115200 rake flash

再度シリアルモニターを立ち上げます。

rake monitor

3. 値をとる

実際に加速度センサーをさわってみましょう。

一度シリアルモニターを終了して

シリアルモニターを Ctr+] で終了して 以下のファイルを作って、保存して storage/home/ 配下に、accel.rb という名前で置いてください

require 'i2c'
require 'mpu6886'

# センサー初期化
i2c = I2C.new(unit: :ESP32_I2C0, frequency: 100_000, sda_pin: 25, scl_pin: 21)
mpu = MPU6886.new(i2c)

# ボタン設定
button = GPIO.new(39, GPIO::IN)

loop do
  break if button.read == 0 # ボタンを押すと終了
  
  accel = mpu.acceleration
  puts "X:#{accel[:x]}  Y:#{accel[:y]}  Z:#{accel[:z]}"
  
  sleep_ms 300
end

ESPBAUD=115200 rake flashで書き込み、rake monitorでシリアルモニターを立ち上げてください

シリアルモニターで実行します

./accel.rb

右に傾けるとXが負の数、左に傾けると正の数、奥に傾けるとYが負の数、手前に傾けると正の数、真上に加速すると、Zが増加、真下に加速するとZが減少します

確かめたら、ボタンを押して終了してください

4. 閾値

状態を判定するには閾値を設けます。たとえば閾値が0.3以上なら傾いていると判定します

シリアルモニターを Ctr+] で終了して 以下のファイルを作って、保存して storage/home/ 配下に、tilt.rb という名前で置いてください

require 'i2c'
require 'mpu6886'

puts "傾き検知プログラム開始"

# ATOM Matrix用のI2C設定
i2c = I2C.new(
  unit: :ESP32_I2C0,
  frequency: 100_000,
  sda_pin: 25,
  scl_pin: 21
)

# MPU6886センサーを初期化
mpu = MPU6886.new(i2c)
# ボタン設定
button = GPIO.new(39, GPIO::IN)

puts "---"

# センサーデータを繰り返し読み取る
loop do
  break if button.read == 0 # ボタンを押したら終了

  # 加速度を取得(単位:G、重力加速度)
  accel = mpu.acceleration
  
  # X軸方向の傾きを判定(閾値:0.3G)
  if accel[:x] > 0.3
    puts "右に傾いています! X軸: #{accel[:x]}"
  elsif accel[:x] < -0.3
    puts "左に傾いています! X軸: #{accel[:x]}"
  end
  
  # Y軸方向の傾きを判定(閾値:0.3G)
  if accel[:y] > 0.3
    puts "前に傾いています! Y軸: #{accel[:y]}"
  elsif accel[:y] < -0.3
    puts "後ろに傾いています! Y軸: #{accel[:y]}"
  end
  
  # 詳細な数値も表示
  puts "加速度 X:#{accel[:x]} Y:#{accel[:y]} Z:#{accel[:z]} (G単位)"
  puts "---"
  
  # 200ミリ秒待機
  sleep_ms 200
end

ESPBAUD=115200 rake flashで書き込み、rake monitorでシリアルモニターを立ち上げてください

シリアルモニターで実行します

./tilt.rb

今回は0.3としていますが、それは使うセンサーや目的次第です。少しでも傾けたら方向を判定したいなら閾値0.1とか、大きく傾けた時にはじめて判定したければ0.5など自分の実現したいことに合わせて設定します