はじめに
この記事はleJOSの開発環境が整っていることが前提にしています。
詳しくはこちらの記事を参考にして下さい。
概要
モーターが回転開始した時や、停止した時のイベントを取得する方法をサンプルコードで説明します。
addEventListenerメソッドを使って実装します。
モーターの回転開始、停止イベント
import lejos.hardware.Button;
import lejos.hardware.motor.EV3LargeRegulatedMotor;
import lejos.hardware.port.MotorPort;
import lejos.robotics.RegulatedMotor;
import lejos.robotics.RegulatedMotorListener;
public class Ev3Motor {
private static RegulatedMotor m;
public static void main(String[] args) {
m = new EV3LargeRegulatedMotor(MotorPort.A);
m.addListener(new RotateStateEvent());
m.rotate(360);
Button.waitForAnyPress();
}
}
class RotateStateEvent implements RegulatedMotorListener{
@Override
public void rotationStarted(RegulatedMotor motor, int tachoCount, boolean stalled, long timeStamp) {
System.out.println("ROTATE");
}
@Override
public void rotationStopped(RegulatedMotor motor, int tachoCount, boolean stalled, long timeStamp) {
System.out.println("STOP");
}
}
サンプルプログラムではRegulatedMotorListenerインターフェースを継承したRotateStateEventクラスのインスタンスをaddEventListenerメソッドの引数に与えています。
RegulatedMotorListenerインターフェースにはモーターが回転開始した時に発火するrotationStartedメソッドと、モーターが回転停止した時に発火するrotationStoppedメソッドが定義されています。
それぞれのメソッド内に実現したい処理を実装しましょう。
サンプルプログラムではLCDにイベントが発火すると"ROTATE"もしくは"STOP"を出力するように実装しました。
ボタン押下イベントを取得する
同じ要領でEV3本体のボタンの押下イベントを取得することができます。
例えばEV3本体の中心ボタンの押下イベントを登録するにはaddKeyListenerメソッドを使って以下のように書きます。
Button.ENTER.addKeyListener(new ButtonEvent(m));
サンプルプログラムでは、引数にlejos.hardware.KeyListenerインターフェースを継承したButtonEventクラスのインスタンスを渡しています。ButtonEventクラス内にボタンが押された時に発火するkeyPressedメソッドと、ボタンが離された時に発火するkeyReleasedイベントを実装します。
ボタンの押下状態によってモーターの回転方向を切り替えるサンプルプログラムを以下に示します。
import lejos.hardware.Button;
import lejos.hardware.Key;
import lejos.hardware.motor.EV3LargeRegulatedMotor;
import lejos.hardware.port.MotorPort;
import lejos.robotics.RegulatedMotor;
import lejos.robotics.RegulatedMotorListener;
import lejos.hardware.KeyListener;
public class Ev3Motor {
private static RegulatedMotor m;
public static void main(String[] args) {
m = new EV3LargeRegulatedMotor(MotorPort.A);
m.addListener(new RotateStateEvent()); //モーター回転状態イベントの登録
Button.UP.addKeyListener(new ButtonEvent(m)); //ボタン押下状態イベントの登録
Button.DOWN.addKeyListener(new ButtonEvent(m));
Button.ESCAPE.addKeyListener(new ButtonEvent(m));
while(true){}
}
}
class RotateStateEvent implements RegulatedMotorListener{ //モーター回転状態変化イベント
@Override
public void rotationStarted(RegulatedMotor motor, int tachoCount, boolean stalled, long timeStamp) { //回転開始時のイベント
System.out.println("ROTATE");
}
@Override
public void rotationStopped(RegulatedMotor motor, int tachoCount, boolean stalled, long timeStamp) { //回転停止時のイベント
System.out.println("STOP");
}
}
class ButtonEvent implements KeyListener{ //ボタン押下状態イベント
private RegulatedMotor _Motor;
public ButtonEvent(RegulatedMotor Motor) {
_Motor = Motor;
}
@Override
public void keyPressed(Key k) { //モーターを押した時のイベント
switch (k.getId()){
case Button.ID_UP:
System.out.println("UP");
_Motor.forward();
break;
case Button.ID_DOWN:
System.out.println("DOWN");
_Motor.backward();
break;
}
}
@Override
public void keyReleased(Key k) { //ボタンを離した時のイベント
switch (k.getId()){
case Button.ID_UP:
_Motor.stop();
break;
case Button.ID_DOWN:
_Motor.stop();
break;
case Button.ID_ESCAPE:
System.out.println("ESCAPE");
_Motor.stop();
System.exit(0);
break;
}
}
}