【leJOS】JavaでEV3のセンサー値をリモートから取得する

## はじめに
この記事はleJOSの開発環境が整っていることが前提にしています。
詳しくはこちらの記事を参考にして下さい。
>
[【leJOS】mindstorm-EV3をJavaでプログラミングしよう【環境構築前編】
](http://qiita.com/murotani/items/2790f1ef5afed3a5d13c)

>
[【leJOS】mindstorm-EV3をJavaでプログラミングしよう【環境構築後編】](http://qiita.com/murotani/items/0972e6f36676c61e3f57)

## 概要
leJOSではremoteEv3クラスを使ってWiFi経由でEv3をリモートコントロールすることが可能です。
本記事ではリモートからEv3のセンサー値を取得する方法を解説します。
モーターのリモートコントロール方法についてはこの記事を参考にして下さい。
>
[【leJOS】JavaでEV3のモーターをリモートコントロールしよう](http://qiita.com/murotani/private/a521e646032e08279ae0)

##サンプルプログラム
コンソール上にセンサーの値を標準出力します。
EV3本体のポート1にタッチセンサー、ポート２に超音波センサー、ポート３にカラーセンサー、ポート４にジャイロセンサーを接続して下さい。
![IMG_8616.JPG](https://qiita-image-store.s3.amazonaws.com/0/149019/81ca0697-7680-8f85-d484-f3dc92bb2c00.jpeg)

以下のプログラムをPC上で実行します。（Ev3にプログラムをデプロイする必要はありません）

```java:RemoteEv3Sensor.java

import java.net.MalformedURLException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import lejos.remote.ev3.RMISampleProvider;
import lejos.remote.ev3.RemoteEV3;

public class RemoteEv3Sensor {

	public static void main(String[] args) throws RemoteException {
		RemoteEV3 ev3 = null;
		RMISampleProvider TouchSensor = null;
		RMISampleProvider UltraSonicSensor = null;
		RMISampleProvider ColorSensor = null;
		RMISampleProvider GyroSensor = null;
		
		try {
			//EV3に接続、引数にEV3のIPアドレス
			ev3 = new RemoteEV3("192.168.2.91");	
			ev3.setDefault();
		} catch (RemoteException | MalformedURLException | NotBoundException e) {
			e.printStackTrace();
		} 
		
		TouchSensor = ev3.createSampleProvider("S1", "lejos.hardware.sensor.EV3TouchSensor","Touch");
		UltraSonicSensor = ev3.createSampleProvider("S2", "lejos.hardware.sensor.EV3UltrasonicSensor","Distance");
		ColorSensor = ev3.createSampleProvider("S3", "lejos.hardware.sensor.EV3ColorSensor","RGB");
		GyroSensor = ev3.createSampleProvider("S4", "lejos.hardware.sensor.EV3GyroSensor","Angle");
		
		try{
			System.out.println("TouchSensor");
			printData(TouchSensor.fetchSample());
			System.out.println("UltraSonicSensor");
			printData(UltraSonicSensor.fetchSample());
			System.out.println("ColorSensor");
			printData(ColorSensor.fetchSample());
			System.out.println("GyroSensor");
			printData(GyroSensor.fetchSample());
		}finally{
			TouchSensor.close();
			UltraSonicSensor.close();
			ColorSensor.close();
			GyroSensor.close();
		}
	}
	
	public static void printData(float[] sample){
		for(float data: sample) {
	         System.out.println(data);
	    }
	}
}
```
###実行結果
標準出力にそれぞれのセンサーのデータが出力されます。
タッチセンサーは押下状態を表す0か1の値、超音波センサーは対象物までの距離値(m)、カラーセンサーは対象物のR,B,G値、ジャイロセンサーは角度値(°)が出力されます。

```
TouchSensor
0.0
UltraSonicSensor
0.076000005
ColorSensor
0.0
0.0
0.0
GyroSensor
-0.0

```

###解説
リモートのセンサーにアクセスするにはcreateSampleProviderメソッドを利用します。
第一引数に接続先のポート、第二引数にセンサーの名前、第三引数にセンサーの取得モードをそれぞれString型で設定します。


```java
		TouchSensor = ev3.createSampleProvider("S1", "lejos.hardware.sensor.EV3TouchSensor","Touch");
		UltraSonicSensor = ev3.createSampleProvider("S2", "lejos.hardware.sensor.EV3UltrasonicSensor","Distance");
		ColorSensor = ev3.createSampleProvider("S3", "lejos.hardware.sensor.EV3ColorSensor","RGB");
		GyroSensor = ev3.createSampleProvider("S4", "lejos.hardware.sensor.EV3GyroSensor","Angle");
```

センサーの値はfetchSampleメソッドを利用することでfloat型の配列として受け取ることが出来ます。

```java
TouchSensor.fetchSample();
```

最後にセンサーへのアクセスをcloseメソッドを使って必ず閉じるようにしましょう。
”Can not create SampleProvider”というエラーが出ている時はこれが正しく動作していないことが原因です。

```java
TouchSensor.close();
UltraSonicSensor.close();
ColorSensor.close();
GyroSensor.close();
```

##参考
>
[https://sourceforge.net/p/lejos/wiki/Remote%20access%20to%20an%20EV3/](https://sourceforge.net/p/lejos/wiki/Remote%20access%20to%20an%20EV3/)

##まとめ
前記事とあわせてEv3のモーターやセンサーをリモートコントロールすることが可能になりました。
>
[【leJOS】JavaでEV3のモーターをリモートコントロールしよう](http://qiita.com/murotani/private/a521e646032e08279ae0)

次回はこれらを使ってPC上で動くGUIアプリケーションを開発してみたいと思います。