Java
leJOS
EV3

【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アプリケーションを開発してみたいと思います。