LoginSignup
1
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-03-13

はじめに

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0