TJ3B C-Style Ver.190216

ダイセンのダウンロードサイトに新しい C-Style が公開された。

www.daisendenshi.com

  • TJ3B C-Style 操作編
  • プログラミングソフト C-Style Ver.19021

インストール先「C:\Daisen\C-Style for TJ3B V190216」(デフォルトの場合)にある修正履歴には、「①サブプログラムをTimer割込み内で動作する機能を追加」と記述があり、マニュアルの「C-Style 操作編」にもその機能の使い方が追加されている。

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

モニタ表示があれば、センサーの値を使ったプログラムのデバッグが容易になる。
I2C接続のモニタだと結線も容易にできる。
f:id:ohguma:20190112110313p:plain



アナログジャイロセンサ

動画で使っているOLEDはこちら。ドライバICがSSD1306のもので、AdafruitのArduino用SSD1306ライブラリを使うことで簡単に利用できる。


loop()内では、毎周ではなく、適当な周回(動画では50周ごと)で画面を更新し、三角関数を使い図形を作成している。

      int x1_, y1_, x2_, y2_, x3_, y3_;
      float x1, y1, x2, y2, x3, y3;
      float sn, cs;
      sn = sin(- 3.14 * mydeg / 180);
      cs = cos(- 3.14 * mydeg / 180);
      x1 = 0;
      y1 = 15;
      x2 = -4;
      y2 = -15;
      x3 = 4;
      y3 = -15;
      x1_ = (int)(x1 * cs - y1 * sn) + 16;
      y1_ = (int)(x1 * sn + y1 * cs) + 16;
      x2_ = (int)(x2 * cs - y2 * sn) + 16;
      y2_ = (int)(x2 * sn + y2 * cs) + 16;
      x3_ = (int)(x3 * cs - y3 * sn) + 16;
      y3_ = (int)(x3 * sn + y3 * cs) + 16;
      display.drawLine(x1_, y1_, x2_, y2_, WHITE);
      display.drawLine(x2_, y2_, x3_, y3_, WHITE);
      display.drawLine(x3_, y3_, x1_, y1_, WHITE);


三角関数が理解できれば、プログラムの幅も広がるので、良くわからない方には以下をオススメ。


一連のブレッドボードのイメージはFritzingで作成した。
Fritzingでは独自のパーツも作成できる。

(ProMicroのMicroUSBコネクタがもげたので、おわり)

アナログジャイロセンサーについて(その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);
     }

(つづく)