はじめに
この記事はleJOSの開発環境が整っていることが前提にしています。
詳しくはこちらの記事を参考にして下さい。
【leJOS】mindstorm-EV3をJavaでプログラミングしよう【環境構築前編】
【leJOS】mindstorm-EV3をJavaでプログラミングしよう【環境構築後編】
概要
leJOSではremoteEv3クラスを使ってWiFi経由でEv3をリモートコントロールすることが可能です。
本記事ではリモートからEv3のセンサー値を取得する方法を解説します。
モーターのリモートコントロール方法についてはこの記事を参考にして下さい。
【leJOS】JavaでEV3のモーターをリモートコントロールしよう
##サンプルプログラム
コンソール上にセンサーの値を標準出力します。
EV3本体のポート1にタッチセンサー、ポート2に超音波センサー、ポート3にカラーセンサー、ポート4にジャイロセンサーを接続して下さい。
以下のプログラムをPC上で実行します。(Ev3にプログラムをデプロイする必要はありません)
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アプリケーションを開発してみたいと思います。