アナログジャイロセンサーについて(その5)

GitHub - rpicopter/ArduinoMotionSensorExample: MPU6050/MPU6500/MPU9150/MPU9250 over I2c for Arduino」で測定するセンサの向きは安定するまでに数十秒かかる。
センサの動作が安定してから任意の向きを基準とした向きが判定できるよう「ジャイロセンサで方位を測定 : はやねさん工房」でも存在する向き初期化用のタクトスイッチを追加する。

f:id:ohguma:20190109224417p:plain

Arduino の pinMode関数の第2引数でINPUT_PULLUPを使えば、上のプルアップ抵抗は不要だが、事故防止のため、設定に依存しないプルアップ抵抗を入れたほうがよいと思う。
mag.switch-science.com
cammy.co.jp


setup()の前にタクトスイッチを接続するピン番号の定義を追記。ピン番号は適当に選択する。
また、以下の2変数を定義、初期化しておく。(mympu.ypr[0]のヨー角だけでなく、mympu.ypr[1]のピッチ角、mympu.ypr[2]のロール角も考慮する場合は配列にする)

  • 初期化スイッチを押した際の向き(初期向き)を記録しておく変数「myinitdeg」
  • ジャイロセンサで測定した向きから初期向きを引くことで、初期向きを基準とした角度を記録しておく変数「mydeg」
  • データ型は、mympu.ypr[0]に合わせて2変数とも floatとする。(先のサンプルソースではmpu.cpp・mpu.hで定義されている)
#define pinBtn 8
float myinitdeg = 0;
float mydeg = 0;

setup()内に追記して、タクトスイッチを接続するピンを入力モードに変更。

    pinMode(INPUT, pinBtn);

loop()内にタクトスイッチが押された場合の向き(ヨー角)を初期向きとして記録する処理を追記。

    if (digitalRead(pinBtn) == LOW) {
        myinitdeg = mympu.ypr[0];
    }

また、D/A変換モジュール用の入力値を計算する前に、初期向きを基準とした角度を計算する処理を追加する。
ここで(-180~180度)の値から(-180~180度)の値を足し・引きした結果も(-180~180度)の範囲に収まるように調整しておく。
(例:-270度 → 90度 一周360度回った向きは同じ向き)

    mydeg = mympu.ypr[0] - myinitdeg;        
    if (mydeg < -180) {
        mydeg += 360;
    } else if (mydeg > 180) {
        mydeg -= 360;
    }

D/A変換モジュール用の入力値を計算する際の元データを変更して、初期向きを基準とした角度から出力電圧を設定する。

  • 変更前:センサ測定値のヨー角(mympu.ypr[0])
  • 変更後:初期向きを基準とした角度(mydeg)

ヨー角0度表示用LEDの判断用変数も合わせて変更にする。

(つづく、かも)