Edited at

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

More than 1 year has passed since last update.


はじめに

この記事はleJOSの開発環境が整っていることが前提にしています。

詳しくはこちらの記事を参考にして下さい。


【leJOS】mindstorm-EV3をJavaでプログラミングしよう【環境構築前編】

【leJOS】mindstorm-EV3をJavaでプログラミングしよう【環境構築後編】



概要

leJOSではremoteEv3クラスを使ってWiFi経由でEv3をリモートコントロールすることが可能です。

本記事ではリモートからEv3のセンサー値を取得する方法を解説します。

モーターのリモートコントロール方法についてはこの記事を参考にして下さい。


【leJOS】JavaでEV3のモーターをリモートコントロールしよう



サンプルプログラム

コンソール上にセンサーの値を標準出力します。

EV3本体のポート1にタッチセンサー、ポート2に超音波センサー、ポート3にカラーセンサー、ポート4にジャイロセンサーを接続して下さい。

IMG_8616.JPG

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


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型で設定します。

        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型の配列として受け取ることが出来ます。

TouchSensor.fetchSample();

最後にセンサーへのアクセスをcloseメソッドを使って必ず閉じるようにしましょう。

”Can not create SampleProvider”というエラーが出ている時はこれが正しく動作していないことが原因です。

TouchSensor.close();

UltraSonicSensor.close();
ColorSensor.close();
GyroSensor.close();


参考


https://sourceforge.net/p/lejos/wiki/Remote%20access%20to%20an%20EV3/



まとめ

前記事とあわせてEv3のモーターやセンサーをリモートコントロールすることが可能になりました。


【leJOS】JavaでEV3のモーターをリモートコントロールしよう


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