MOVERIO
BT-350 ドキュメント

6. センサー制御

6.1. センサー制御概要

BT-350では、センサー一覧に記載されているセンサーが利用可能です。各センサー値は、Android標準APIを利用することで一般のセンサーと同様に取得できます。センサータイプが使用できない場合には、センサーIDを直接指定することも可能です。また、ソースコードの未解決状態が発生する場合には、2.5.2. 参考 Android Studioで未解決状態がある場合には により解決することも可能です。
センサーを使用する場合には、事前にセンサーの校正を実施して下さい。

6.1.1. センサー一覧

表 6-1 センサー一覧
センサータイプ センサーID (Hex) 内容 搭載場所 Android標準
TYPE_ACCELEROMETER 0x00000001 加速度センサー ヘッドセット
TYPE_MAGNETIC_FIELD 0x00000002 地磁気センサー ヘッドセット
TYPE_ORIENTATION 0x00000003 方位角検知 ヘッドセット
TYPE_GYROSCOPE 0x00000004 ジャイロセンサー ヘッドセット
TYPE_LIGHT 0x00000005 照度センサー ヘッドセット
TYPE_TEMPERATURE 0x00000007 温度センサー ヘッドセット
TYPE_GRAVITY 0x00000009 重力センサー ヘッドセット
TYPE_LINEAR_ACCELERATION 0x0000000a 直線加速度センサー ヘッドセット
TYPE_ROTATION_VECTOR 0x0000000b 回転ベクトルセンサー ヘッドセット
TYPE_MAGNETIC_FIELD_UNCALIBRATED 0x0000000e 地磁気センサー ヘッドセット
TYPE_HEADSET_TAP 0x00002001 タップ検知 ヘッドセット  
TYPE_CONTROLLER_ACCELEROMETER 0x00100001 加速度センサー コントローラー  
TYPE_CONTROLLER_MAGNETIC_FIELD 0x00100002 地磁気センサー コントローラー  
TYPE_CONTROLLER_GYROSCOPE 0x00100004 ジャイロセンサー コントローラー  
TYPE_CONTROLLER_ROTATION_VECTOR 0x0010000b 回転ベクトルセンサー コントローラー  

※ヘッドセット、コントローラーに搭載されているセンサーは同時に使用することが出来ます。同時に使用可能なセンサーに特に制限はありませんが、パフォーマンス低下を防ぐために、必要なセンサーのみをリスナー登録することを推奨します。

※ミュートノック機能の検知には、TYPE_HEADSET_TAPによるタップ検知を使用しています。ミュートノックがONになっている場合、タップを検知するとミュート状態となってしまいます。そのため、タップ検知を有効にする前に、ユーザーに対して、ミュートノックをを OFF にするように案内してください。

※システムソフトウェアR1.3.0において、TYPE_ROTATION_VECTORのアルゴリズムを変更しています。R1.3.0よりも前のシステムソフトウェアに搭載されていたTYPE_ROTATION_VECTORを使用する場合には、センサーIDに、0x00002005を指定して下さい。

6.1.2. 各センサーの座標軸について

ヘッドセットおよびコントローラーに搭載されているセンサーのうち、X,Y,Z軸を持つ各センサーについては、下図のような座標軸に従ってセンサー値が出力されます。

6.1.3. センサーの校正機能について

BT-350搭載の地磁気センサー、ジャイロセンサーは工場出荷時には校正されていないため、以下の手順で校正をしてください。初めて使用する場合および工場出荷状態への初期化を行った場合には、センサーの校正が必要になります。アプリケーションでセンサーを利用すると、校正機能が自動的に働き、校正が完了すると端末内に校正情報が保存されます。そのため、毎回校正をする必要はありません。

■センサーの校正方法

センサーの校正は、ヘッドセットまたはコントローラーに対してそれぞれ行う必要があります。また、校正をする際は、加速度、ジャイロ、地磁気の各センサーが同時に動作している必要があります。そのためには、加速度、ジャイロ、地磁気センサーをリスナー登録(SensorManager.registerListener)して動作している状態で以下の操作を行ってください。

  1. 地磁気センサーの校正

    ヘッドセットまたはコントローラーを手に持ち、10回ほど∞の字を描くように振ってください。端末の向きは手の動きに応じて変化するようにしてください。本操作をする際は、周りに十分注意して行ってください。

  2. ジャイロセンサーの校正

    振動のない安定した水平な台の上に1秒以上置いてください。

    動作完了後は、アプリケーション内で必ずリスナー解除(SensorManager.unregisterListener)を確実に行ってください。リスナー解除を行わない場合は、校正情報が端末内に保存されません。

6.2. センサーの利用方法

センサーの利用には、Android標準APIのSensorEventListenerを利用します。

6.2.1. インポートモジュール

センサーを利用する場合、下記モジュールをインポートして下さい。

  • android.hardware.Sensor
  • android.hardware.SensorEvent
  • android.hardware.SensorEventListener

6.2.2. SensorEventListenerの利用

センサーを利用するActivityやServiceにSensorEventListenerを継承する必要があります。

例)ActivityにSensorEventListenerを継承する

6.2.3. 利用するセンサーの登録

センサーを利用する場合は、センサーをリスナー登録する必要があります。

例)加速度センサーの登録

// システムのセンサーサービスの取得
SensorManager sm = (SensorManager)getSystemService(SENSOR_SERVICE);
// 加速度センサー(TYPE_ACCELEROMETER)の登録
Sensor s = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sm.registerListener(this, s, SensorManager.SENSOR_DELAY_NORMAL);

6.2.4. センサー値の取得

SensorEventListenerのonSensorChangedにてセンサーイベントを取得することで、センサー値を利用することができます。

例)加速度センサーのセンサー値の取得

@Override
public void onSensorChanged(SensorEvent event) {
  // 加速度センサー値の取得(ログ表示)
  if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
    Log.d("Sample","ax="+event.values[0]+",ay="+event.values[1]+",az="+event.values[2]);
  }
}

onSensorChangedで取得できるセンサー値は、使用するセンサータイプによって異なります。各センサータイプと対応するSensorEvent配列の要素番号は、次のとおりです。

表 6-2 Epson独自センサーで取得できるセンサー値
センサータイプ 単位 SensorEvent
配列の要素番号
センサー値
TYPE_HEADSET_TAP - 0 2:左側、もしくは、右側からダブルタップされた
TYPE_CONTROLLER_ACCELEROMETER m/s² 0 X軸
1 Y軸
2 Z軸
TYPE_CONTROLLER_MAGNETIC_FIELD uT 0 X軸
1 Y軸
2 Z軸
TYPE_CONTROLLER_GYROSCOPE rad/s 0 X軸
1 Y軸
2 Z軸
TYPE_CONTROLLER_ROTATION_VECTOR - 0 X軸
1 Y軸
2 Z軸

※Android標準のセンサータイプについては、Android準拠のため、割愛しています。

6.3. サンプルコード

センサータイプTYPE_HEADSET_TAPを使用し、タップ検知した際にToastを表示するサンプルコードです。

package com.epson.moverio.sample.TapSample;
                
import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends Activity implements SensorEventListener {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    SensorManager sm = (SensorManager)getSystemService(SENSOR_SERVICE);
    Sensor sensor = sm.getDefaultSensor(Sensor.TYPE_HEADSET_TAP);
    sm.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL);
  }
  @Override
  public void onSensorChanged(SensorEvent event) {
    if(event.sensor.getType() == Sensor.TYPE_HEADSET_TAP){
      // タップイベント発生時に、Toast表示する
      Toast.makeText(this, "tap event!", Toast.LENGTH_SHORT).show();
    }
  @Override
  protected void onPause() {
    super.onPause();
    SensorManager sm = (SensorManager)getSystemService(SENSOR_SERVICE);
    if (sm != null) {
      sm.unregisterListener(this);
    }
  }
  @Override
  public void onAccuracyChanged(Sensor sensor, int accuracy) {
  }
Go to Top