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

ジャイロセンサを積む筐体が激しく動く場合、一瞬しか点灯しない0度表示では、目視確認でそれを見逃すこともあるかもしれないので、Arduionoの空き端子にLEDを追加して0度表示を拡張する。

f:id:ohguma:20190110020156p:plain

setup()の前に追加するLED用ピン定義を追記。

#define pinLedRight 5
#define pinLedLeft 7

setup()内にLED用ピンのモード設定を明示。

    pinMode(OUTPUT, pinLedRight);
    pinMode(OUTPUT, pinLedLeft);

loop()内のヨー角0度表示用処理に、0度近くの左右それぞれ表示用処理を追加。

        if (mydeg >= -5.0 && mydeg <= -1.0 ) {
            digitalWrite(pinLedLeft, HIGH);
        } else {
            digitalWrite(pinLedLeft, LOW);
        }

        if (mydeg >= 1.0 && mydeg <= 5.0 ) {
            digitalWrite(pinLedRight, HIGH);
        } else {
            digitalWrite(pinLedRight, LOW);
        }

Arduionoの空き端子はまだあるので、さらにLEDを増してもよいかも。

(つづくかも)

アナログジャイロセンサーについて(その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の判断用変数も合わせて変更にする。

(つづく、かも)

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

ジャイロセンサのヨー角を電圧で出力できてもパッと見には何も変化がないので、動作確認用も兼ねてセンター(0度)付近の向きが分かるようにLEDを追加する。LEDに接続する抵抗は適当なものを選択する。

f:id:ohguma:20190106161732p:plain


setup()の前にLEDを接続するピン番号の定義を追記。ピン番号は適当に選択する。

#define pinLedCenter 6

setup()内に追記して、LEDを接続するピンを出力モードに変更。

    pinMode(OUTPUT, pinLedCenter);

loop()内に追記して、ヨー角が0度付近でLEDをONにする。

     if (mympu.ypr[0] >= -1.0 && mympu.ypr[0] <= 1.0 ) {
         digitalWrite(pinLedCenter, HIGH);
     } else {
         digitalWrite(pinLedCenter, LOW);
     }

(つづく)

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

ジャイロセンサーの測定値が取得できるようになったら、次はD/A変換モジュールを使い、取得した値を電圧で出力してみる。

ジャイロセンサで方位を測定 : はやねさん工房」でも使われている以下のD/A変換モジュールならググれば使い方がすぐ見つかる。
akizukidenshi.com


回路は先のArduino・ジャイロセンサ間のI2C接続を、D/A変換モジュールまで延ばす。
f:id:ohguma:20190105222749p:plain


スケッチもD/A変換モジュールが使えるよう修正する。

まずは、冒頭にI2Cが利用できるよう Wire.h を追記。
(改造中のサンプルスケッチには「Fastwire」クラスが含まれているが、動かすことを優先するため、ここでは無視して標準のWireライブラリを使う)

#include "Wire.h"

setup()内にも追記

    Wire.begin();

loop()内では、ジャイロセンサの測定値をD/A変換モジュールの入力値に変換し、I2Cでそれを送信する処理を追記する。

ジャイロセンサを水平に設置し、傾けて使うことがない場合、値が変わる(目に見えて大きく変わる)のはシリアルモニタで出力される「Y」の値(上下軸まわりの回転角:ヨー角 mympu.ypr[0])だけになる。
MCP4726を使う場合は、このヨー角(-180~180度)を12ビットの値(0~4095)に変換した値をI2C通信で送信する。
値の変換は、Arduino のスケッチではmap関数を使うと簡単に計算できる。

上記のリファレンスにもあるとおりmap関数は範囲外の値も切り捨てずに計算してしまうため、変換元の値が(-180~180の範囲外になる場合、戻り値が(0~4095)からはみ出る意図しない数値になることも考えられる(例:Y値が240の場合は6144)。念の為、変換後の値が(0~4095)からはみ出ないようにconstrain関数も使っておく。

    int val = constrain(map(mympu.ypr[0], -180, 180, 4095, 0), 0, 4095);

上記の計算結果は、ヨー角がそれぞれ(-90度、0度、90度)の場合、(3072、2048、1024)付近になり、またMCP4726の出力電圧は上の結線であれば、VREF=5Vなので(3.75V、2.5V、1.25V)付近になることが期待される。
(※map関数の第4,5引数を逆にするとvalの値も逆転する。)

変数valが計算できたら、それを送信する。
データの送信部分は「ジャイロセンサで方位を測定 : はやねさん工房」を真似る。

    Wire.beginTransmission(0x60);
    Wire.write((uint8_t) ((val >> 8) & 0x0F));   // MSB: (D11, D10, D9, D8) 
    Wire.write((uint8_t) (val));  // LSB: (D7, D6, D5, D4, D3, D2, D1, D0)
    Wire.endTransmission();

※上記にある演算子については、Arduino 日本語リファレンス の「ビット演算子」を参照のこと。

スケッチが完成したら、実際にテスターでD/A変換モジュールの出力電圧を測定し、角度に応じた電圧が出力されていることを確認する。

(つづく)

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

まずは、「GitHub - rpicopter/ArduinoMotionSensorExample: MPU6050/MPU6500/MPU9150/MPU9250 over I2c for Arduino」が動作する環境を用意する。

Arduinoもジャイロセンサも購入時は対応電圧に注意する。

ArduinoとジャイロセンサのI2C、電源を接続する。
以下の例は5V対応のArduino互換機のProMicroと、5V対応のジャイロセンサを使う場合。
f:id:ohguma:20190105102925p:plain


サンプルソースの「inv_mpu.cpp」の48行目に使うセンサ型番を定義する。

準備ができたらシリアルモニタで動作確認する。
センサを動かしてどの値が変わるか確認する。
センサを水平に置いた状態で回転(ヨー軸まわりに回転)させた場合、「Y」の値が変化する。
f:id:ohguma:20190105110114p:plain

戦車で例えると、砲塔の左右回転がヨー軸(yaw)、砲身の上下がピッチ軸(pitch)、車体の横転がロール軸(roll)。

(つづく)