Android(X06HT Desire) 搭載センサーの値を取得してみる

実機を使ってデバッグすることを覚えたので、Desire に搭載されているセンサーの値を取得してみよう。

http://developer.android.com/reference/android/hardware/SensorEvent.html

SenserEvent API の座標系

desire 

OpenGLの座標系と同じであり、一般のコンピューター上のスクリーン座標(左上が原点)とは異なる。

3軸 加速度センサー(3-axis Accelerometer)

 

accel

m/s2(メートル毎秒毎秒)で、加速度を表す。

加速度の計測

  1. X軸加速度
  2. Y軸加速度
  3. Z軸加速度
  • 水平なテーブルに端末を置いて、左側を右に向けて押した場合、X軸加速度は、正の値になる。
  • 水平なテーブルに端末を置いた場合、加速度の値は、端末の加速度(0 m/s^2) 引く、重力(-9.81 m/s^2)で、 +9.81 となる。
  • 水平なテーブルに端末を置いて、空に向けて A m/s^2 の加速度をかけた場合、A + 9.81 となる。

3軸 磁界センサー(3-axis Magnetic field sensor)

magnetic 

磁界センサーは、いろいろな用途に利用できるようだが、自分にはさっぱり理解できません。

μT(マイクロテスラ)という単位で電磁波をはかるらしい。

某ピップエレキバンの類似商品が、うちにあり、パッケージを見ると 「100マイクロテスラ」 とうたっている。

pip

Desire の背面の左下あたりに近づけると、確かに 100マイクロテスラ を超える値を検知!

某エレキバンの真偽を確かめるのには使えそうだ。

傾きセンサー(Orientation sensor)

orientation

  1. 方位 ・・・ 0=北, 90=東, 180=南, 270=西 として、0 ~ 359 の角度
  2. ピッチ(Pitch) ・・・ X軸にそって、-180 ~ 180 まで回転。Z軸が、Y軸に向かう場合、正の値。
  3. ロール(Roll) ・・・ Y軸にそって、 -90 ~ 90 まで回転。X軸が、Z軸に向かう場合、正の値。

orientation

近接センサー(Proximity sensor)

proximity

物体が近づいたら距離を cm で検知する。

ただし、上記に対応しておらず、「近い」「遠い」のいずれかで計測するものもある。

Desire では、近い 0 、遠い 1 と計測されるようだ。

輝度センサー(Light sensor)

light

明るさをルクス(lux)で計測

 

上記のソースコード。

  1. package info.typea.sensorlist;
  2. package info.typea.sensorlist;
  3.  
  4. import java.util.ArrayList;
  5. import java.util.List;
  6.  
  7. import android.app.ListActivity;
  8. import android.content.SharedPreferences;
  9. import android.content.SharedPreferences.Editor;
  10. import android.hardware.Sensor;
  11. import android.hardware.SensorEvent;
  12. import android.hardware.SensorEventListener;
  13. import android.hardware.SensorManager;
  14. import android.os.Bundle;
  15. import android.view.View;
  16. import android.widget.ArrayAdapter;
  17. import android.widget.ListAdapter;
  18. import android.widget.ListView;
  19. import android.widget.TextView;
  20.  
  21. public class SensorListActivity extends ListActivity {
  22.  
  23. private final static String ACTIVE_SENSOR = "ActiveSensor";
  24. private SensorManager sensorManager = null;
  25. private List<SensorItem> sensorItems;
  26. private TextView txtResult = null;
  27. private int activeSensorType = 0;
  28. /** Called when the activity is first created. */
  29. @Override
  30. public void onCreate(Bundle savedInstanceState) {
  31. super.onCreate(savedInstanceState);
  32. setContentView(R.layout.main);
  33. sensorManager = (SensorManager)this.getSystemService(SENSOR_SERVICE);
  34. List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
  35. sensorItems = new ArrayList<SensorItem>();
  36. for (Sensor sensor : sensors) {
  37. SensorItem sensorItem = new SensorItem();
  38. sensorItem.setSensorName(sensor.getName());
  39. sensorItem.setSensorType(sensor.getType());
  40. sensorItems.add(sensorItem);
  41. }
  42. ArrayAdapter<SensorItem> lstAdapter
  43. = new ArrayAdapter<SensorItem>(this, R.layout.sensor_row, sensorItems);
  44. setListAdapter(lstAdapter);
  45. txtResult = (TextView) findViewById(R.id.txt_result);
  46. }
  47. @Override
  48. protected void onResume() {
  49. super.onResume();
  50. // プリファレンスに保存されたセンサーを復帰
  51. SharedPreferences pref = getPreferences(MODE_PRIVATE);
  52. int sensorType = pref.getInt(ACTIVE_SENSOR, 0);
  53. startSensorTrace(sensorType);
  54. }
  55. @Override
  56. protected void onPause() {
  57. // 選択されたセンサーをプリファレンスに待避
  58. if (this.activeSensorType != 0) {
  59. SharedPreferences pref = getPreferences(MODE_PRIVATE);
  60. Editor editor = pref.edit();
  61. editor.putInt(ACTIVE_SENSOR, this.activeSensorType);
  62. editor.commit();
  63. }
  64. super.onPause();
  65. }
  66. @Override
  67. protected void onListItemClick(ListView l, View v, int position, long id) {
  68. super.onListItemClick(l, v, position, id);
  69. txtResult.setText("");
  70. // 選択されたセンサーのリスニングを行う
  71. int sensorType = ((SensorItem)l.getAdapter().getItem(position)).getSensorType();
  72. startSensorTrace(sensorType);
  73. }
  74. /**
  75. * センサータイプを指定してリスナーを登録
  76. * 指定されなかったセンサーのリスナーの登録解除
  77. * @param sensorType
  78. */
  79. private void startSensorTrace(int sensorType) {
  80. ListAdapter lstAdapter = this.getListAdapter();
  81. for (int i=0; i<lstAdapter.getCount(); i++) {
  82. SensorItem sensorItem = (SensorItem)lstAdapter.getItem(i);
  83. if (sensorItem.getSensorType() == sensorType) {
  84. Sensor sensor = sensorManager.getDefaultSensor(sensorItem.getSensorType());
  85. // センサーリスニングの登録
  86. sensorManager.registerListener(
  87. sensorItem.listener,sensor, SensorManager.SENSOR_DELAY_NORMAL);
  88. this.activeSensorType = sensorType;
  89. } else {
  90. // センサーリスニングの登録解除
  91. sensorManager.unregisterListener(sensorItem.listener);
  92. }
  93. }
  94. }
  95. /**
  96. * 加速度センサー
  97. */
  98. class AccelerometerSensorListner implements SensorEventListener {
  99. @Override
  100. public void onAccuracyChanged(Sensor arg0, int arg1) {
  101. }
  102. @Override
  103. public void onSensorChanged(SensorEvent event) {
  104. String r = String.format(
  105. "--------------------------------\n" +
  106. "3-axis Accelerometer\n"+
  107. "--------------------------------\n" +
  108. "minus Gx on the x-axis : %f\n" +
  109. "minus Gy on the y-axis : %f\n" +
  110. "minus Gz on the z-axis : %f"
  111. ,event.values[0]
  112. ,event.values[1]
  113. ,event.values[2]
  114. );
  115. txtResult.setText(r);
  116. }
  117. }
  118. /**
  119. * 傾きセンサー
  120. * @see SensorManager.getOrientation()
  121. */
  122. class OrientationSensorListener implements SensorEventListener {
  123. @Override
  124. public void onAccuracyChanged(Sensor arg0, int arg1) {
  125. }
  126. @Override
  127. public void onSensorChanged(SensorEvent event) {
  128. String r = String.format(
  129. "--------------------------------\n" +
  130. "Orientation sensor\n"+
  131. "--------------------------------\n" +
  132. "Azimuth(0=N,90=E,180=S,270=W) : %f\n" +
  133. "Pitch (X axis -180 to 180) : %f\n" +
  134. "Roll (Y axis -90 to 90) : %f"
  135. ,event.values[0]
  136. ,event.values[1]
  137. ,event.values[2]
  138. );
  139. txtResult.setText(r);
  140. }
  141. }
  142. /**
  143. * 磁界センサー
  144. */
  145. class MagneticFieldSensorListener implements SensorEventListener {
  146. @Override
  147. public void onAccuracyChanged(Sensor arg0, int arg1) {
  148. }
  149. @Override
  150. public void onSensorChanged(SensorEvent event) {
  151. String r = String.format(
  152. "--------------------------------\n" +
  153. "3-axis Magnetic field sensor\n"+
  154. "--------------------------------\n" +
  155. "X axis : %f μT\n" +
  156. "Y axis : %f μT\n" +
  157. "Z axis : %f μT"
  158. ,event.values[0]
  159. ,event.values[1]
  160. ,event.values[2]
  161. );
  162. txtResult.setText(r);
  163. }
  164. }
  165. /**
  166. * 輝度センサー
  167. */
  168. class LightSensorListener implements SensorEventListener {
  169. @Override
  170. public void onAccuracyChanged(Sensor sensor, int accuracy) {
  171. }
  172.  
  173. @Override
  174. public void onSensorChanged(SensorEvent event) {
  175. String r = String.format(
  176. "--------------------------------\n" +
  177. "light sensor\n"+
  178. "--------------------------------\n" +
  179. "%f lux"
  180. ,event.values[0]
  181. );
  182. txtResult.setText(r);
  183. }
  184. }
  185. /**
  186. * 近接センサー
  187. */
  188. class ProximitySensorListener implements SensorEventListener {
  189. @Override
  190. public void onAccuracyChanged(Sensor sensor, int accuracy) {
  191. }
  192.  
  193. @Override
  194. public void onSensorChanged(SensorEvent event) {
  195. String r = String.format(
  196. "--------------------------------\n" +
  197. "proximity sonsor\n"+
  198. "--------------------------------\n" +
  199. "%f cm"
  200. ,event.values[0]
  201. );
  202. txtResult.setText(r);
  203. }
  204. }
  205. /**
  206. * @see http://developer.android.com/reference/android/hardware/SensorEvent.html
  207. */
  208. class SensorItem {
  209. private int sensorType;
  210. private String sensorName;
  211. public SensorEventListener listener;
  212. public int getSensorType() {
  213. return sensorType;
  214. }
  215.  
  216. /**
  217. * センサーごとにリスナーを生成
  218. * @param sensorType
  219. */
  220. public void setSensorType(int sensorType) {
  221. this.sensorType = sensorType;
  222. switch(this.sensorType) {
  223. case Sensor.TYPE_ACCELEROMETER:
  224. this.listener = new AccelerometerSensorListner();
  225. break;
  226. case Sensor.TYPE_ORIENTATION:
  227. this.listener = new OrientationSensorListener();
  228. break;
  229. case Sensor.TYPE_MAGNETIC_FIELD:
  230. this.listener = new MagneticFieldSensorListener();
  231. break;
  232. case Sensor.TYPE_LIGHT:
  233. this.listener = new LightSensorListener();
  234. break;
  235. case Sensor.TYPE_PROXIMITY:
  236. this.listener = new ProximitySensorListener();
  237. break;
  238. default:
  239. this.listener = new SensorEventListener() {
  240. @Override
  241. public void onSensorChanged(SensorEvent event) {
  242. }
  243. @Override
  244. public void onAccuracyChanged(Sensor sensor, int accuracy) {
  245. txtResult.setText("No Sensor Listener.");
  246. }
  247. };
  248. break;
  249. }
  250. }
  251. public String getSensorName() {
  252. return sensorName;
  253. }
  254. public void setSensorName(String sensorName) {
  255. this.sensorName = sensorName;
  256. }
  257. @Override
  258. public String toString() {
  259. return getSensorName();
  260. }
  261. }
  262. }

Follow me!

コメントを残す

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