アナログジャイロセンサーについて(その7)
モニタ表示があれば、センサーの値を使ったプログラムのデバッグが容易になる。
I2C接続のモニタだと結線も容易にできる。
動画で使っているOLEDはこちら。ドライバICがSSD1306のもので、AdafruitのArduino用SSD1306ライブラリを使うことで簡単に利用できる。
- I2C シリアルOLED液晶ディスプレイモジュール 128x32
- GitHub - adafruit/Adafruit_SSD1306: Arduino library for SSD1306 monochrome 128x64 and 128x32 OLEDs
- 基板サイズは秋月D型
- Arduino ProMicro(互換品)
- MPU-6050
- OLEDの下にDAC(MCP4726)
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);
三角関数が理解できれば、プログラムの幅も広がるので、良くわからない方には以下をオススメ。
- 作者: 結城浩
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2014/04/24
- メディア: 単行本
- この商品を含むブログ (12件) を見る
一連のブレッドボードのイメージはFritzingで作成した。
Fritzingでは独自のパーツも作成できる。
(ProMicroのMicroUSBコネクタがもげたので、おわり)
アナログジャイロセンサーについて(その6)
ジャイロセンサを積む筐体が激しく動く場合、一瞬しか点灯しない0度表示では、目視確認でそれを見逃すこともあるかもしれないので、Arduionoの空き端子にLEDを追加して0度表示を拡張する。
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」で測定するセンサの向きは安定するまでに数十秒かかる。
センサの動作が安定してから任意の向きを基準とした向きが判定できるよう「ジャイロセンサで方位を測定 : はやねさん工房」でも存在する向き初期化用のタクトスイッチを追加する。
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に接続する抵抗は適当なものを選択する。
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); }
(つづく)