LoginSignup
1
1

More than 5 years have passed since last update.

【leJOS】モーター回転開始、停止時のイベント処理を実装する

Last updated at Posted at 2017-03-13

はじめに

この記事はleJOSの開発環境が整っていることが前提にしています。
詳しくはこちらの記事を参考にして下さい。

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

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

概要

モーターが回転開始した時や、停止した時のイベントを取得する方法をサンプルコードで説明します。
addEventListenerメソッドを使って実装します。

モーターの回転開始、停止イベント

Ev3Motor.java
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イベントを実装します。

ボタンの押下状態によってモーターの回転方向を切り替えるサンプルプログラムを以下に示します。

スクリーンショット 2017-02-09 20.59.39.png

Ev3Motor.java
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;
        }
    }

}

参考

【leJOS】JavaでEV3のモーターを制御しよう

1
1
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
1