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

(つづく)

アナログジャイロセンサーについて

 古い記事に質問があったのでまとめ直してみる。

TJ3Bのオプションにある方位センサはコンパスセンサのみで、ジャイロセンサを使う場合は自作する必要がある。C-Styleを無改造で使うためには

  • オプションのコンパスセンサと同様の出力を返すI2C接続のジャイロセンサ
  • Inputポートに接続して、ラインセンサ等と同様に電圧を返すアナログ出力のジャイロセンサ

のいずれかが必要となるが、単体でコンパスセンサと同等の値をI2C接続で返すジャイロセンサはググった限りでは見つけられなかった。

アナログ出力のジャイロセンサについては、以下のページで情報が公開されている。利用しているジャイロセンサ「L3GD20」は幾つか使ってみたが、個体差やドリフトが大きく、使うセンサごとの調整が面倒だった。
blog.livedoor.jp

後日公開されたMPU6050を使うジャイロセンサのサンプルにある「DMPライブラリ」を使うと、その調整が不要でドリフトも抑えられるということを知り、DMPを利用するサンプルを幾つか探してみた。
blog.livedoor.jp


自分が理解可能なArduinoベースでDMPを利用するサンプルでは、こちらの作りがシンプルだった。プログラムはページ右側の「Clone or download」→「Download ZIP」で取得できる。
github.com


メインプログラムの「AvrCopter.ino」はこれだけのプログラムで、ジャイロセンサから得た値をシリアル出力する。

#include "freeram.h"

#include "mpu.h"
#include "I2Cdev.h"

int ret;
void setup() {
    Fastwire::setup(400,0);
    Serial.begin(38400);
    ret = mympu_open(200);
    Serial.print("MPU init: "); Serial.println(ret);
    Serial.print("Free mem: "); Serial.println(freeRam());
	
}

unsigned int c = 0; //cumulative number of successful MPU/DMP reads
unsigned int np = 0; //cumulative number of MPU/DMP reads that brought no packet back
unsigned int err_c = 0; //cumulative number of MPU/DMP reads that brought corrupted packet
unsigned int err_o = 0; //cumulative number of MPU/DMP reads that had overflow bit set

void loop() {
    ret = mympu_update();

    switch (ret) {
	case 0: c++; break;
	case 1: np++; return;
	case 2: err_o++; return;
	case 3: err_c++; return; 
	default: 
		Serial.print("READ ERROR!  ");
		Serial.println(ret);
		return;
    }

    if (!(c%25)) {
	    Serial.print(np); Serial.print("  "); Serial.print(err_c); Serial.print(" "); Serial.print(err_o);
	    Serial.print(" Y: "); Serial.print(mympu.ypr[0]);
	    Serial.print(" P: "); Serial.print(mympu.ypr[1]);
	    Serial.print(" R: "); Serial.print(mympu.ypr[2]);
	    Serial.print("\tgy: "); Serial.print(mympu.gyro[0]);
	    Serial.print(" gp: "); Serial.print(mympu.gyro[1]);
	    Serial.print(" gr: "); Serial.println(mympu.gyro[2]);
    }
}


ジャイロセンサの値を取得する部分はそのまま流用して

  • 角度を電圧で返すためのDAC用の処理
  • 原点調整の初期化処理
  • 原点付近かどうかを知るためのLED表示

等を追加してアナログ出力ジャイロセンサにしてみる。

(つづく)

ジャイロ・コンパス センサ

はやねさん工房で紹介されていた「L3GD20」が秋月のサイトから購入できなくなっていることに気づいた。


BMX055は、BNO055の代わりにはならないようだ。


ストロベリー・リナックスのHMC6352も品切れのようで。


Adafruit の BNO055情報。

ホームセンターにて(その3)

せとうちオープン2018に持ち込んだこちらのロボットのフレームにはシナベニヤを使っている。


シナベニヤはMDFやラワンベニヤと同様に一般的な素材で大抵のホームセンターで扱いがあると思う。いろいろな厚さ売られているが、そこそこ軽くて、それなりの強度がある4mm厚のシナベニヤを使っている。
シナベニヤはラワンベニヤに比べて、表面がきれいで、反りが少ない(個人的な感想です)。


以前は張ってはがせるスプレーのりで図面を貼り付けて、細工用の片刃のこぎりで部品を切り出していたが、いまは中華製の5.5Wレーザー加工機を使い、直接図面データから部品を切り出している。

4mm圧のシナベニヤなら速度12mm/s、同じラインを繰り返し10回焼き切ることでパーツ化している。

レーザー加工機はこちらで購入した。