恵方巻きコンパスを作りたい&地磁気・加速度センサーの値の取得

恵方巻きコンパス

スーパーやコンビニに行くともう恵方巻きの予約やらの広告が掲示されている。GooglePlayで恵方巻きコンパスを探してみたら、普通のコンパスに加えて、恵方巻きコンパスも腐るほど出てきた。これなら俺が作っても大丈夫ではなかろうかと思った。なんとなくだけど、センサーから数値を引っ張るところまではできそうだけど、それを元に画像(磁針とか)を動かすのに苦戦しそうだなと思う。でもまあやってみよう、節分に間に合うかな。間に合わなかったらそれはそれでいいや。

センサーを扱う

とりあえず画像とかは後回しにして、テキストで数値を表示するようなものを作ってみたい。いろんなサイトを見ると、加速度センサーと磁気センサーを使うみたい。方位で、なんで加速度が必要なんだろうと思ったけどよく分かってない。

private SensorManager mSensorManager;
private Sensor mAccelerometer;
private Sensor mMagneticField;
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

センサーを使うときは、SensorManagerを使うみたい。

public class CompassActivity extends AppCompatActivity implements SensorEventListener {

implements SensorEventListnerを追加すると

@Override
public void onSensorChanged(SensorEvent event) {

}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {

}

の2つを追加するように言われる。2つの違いがあまり良く分からんが、普通上のメソッドの中に処理を書くみたい。

@Override
protected void onResume() {
    super.onResume();
    mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    mMagneticField = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
    mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
    mSensorManager.registerListener(this, mMagneticField, SensorManager.SENSOR_DELAY_NORMAL);
}

@Override
protected void onPause() {
    super.onPause();
    mSensorManager.unregisterListener(this);
}

onResumeとonPauseでリスナの登録と解除。onStopで解除してるとこもあったけどなぜかな。これで使う準備できたはず。

private float[] fAccell;
private float[] fMagnetic;
@Override
public void onSensorChanged(SensorEvent event) {
    switch (event.sensor.getType()) {
        case Sensor.TYPE_ACCELEROMETER:
            fAccell = event.values.clone();
            break;
        case Sensor.TYPE_MAGNETIC_FIELD:
            fMagnetic = event.values.clone();
            break;
    }
}

switchでセンサーの種類を判断し、それぞれ値をfloat型の変数に代入する。とりあえずTextViewに表示してみよう。

StringBuilder sb = new StringBuilder();
if (fAccell != null && fMagnetic != null) {
    sb.append("加速度\nX _ ");
    sb.append(fAccell[0]);
    sb.append("\nY _ ");
    sb.append(fAccell[1]);
    sb.append("\nZ _ ");
    sb.append(fAccell[2]);

    sb.append("\n\n地磁気\nX _ ");
    sb.append(fMagnetic[0]);
    sb.append("\nY _ ");
    sb.append(fMagnetic[1]);
    sb.append("\nZ _ ");
    sb.append(fMagnetic[2]);

    textView.setText(sb.toString());
}

どっちもnullじゃないことを確認して表示。

できた。ぐるーっと回したり、傾けてみたり、数字が変わるが、意味がよく分かってないぞ。

参考

https://developer.android.com/guide/topics/sensors/sensors_overview

https://developer.android.com/guide/topics/sensors/sensors_motion

https://developer.android.com/guide/topics/sensors/sensors_position

https://qiita.com/InoueDaiki/items/568b3328557bc44fb5d6

http://www.magicvox.net/archive/2015/02072148/

カテゴリー: したい タグ: , , , パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です