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

## はじめに
この記事はleJOSの開発環境が整っていることが前提にしています。
詳しくはこちらの記事を参考にして下さい。
>
[【leJOS】mindstorm-EV3をJavaでプログラミングしよう【環境構築前編】
](http://qiita.com/murotani/items/2790f1ef5afed3a5d13c)

>
[【leJOS】mindstorm-EV3をJavaでプログラミングしよう【環境構築後編】](http://qiita.com/murotani/items/0972e6f36676c61e3f57)

## 概要

leJOSでEV3のモーターを制御するAPIの一部を紹介します。
基本的なモーター制御は紹介するメソッドだけ抑えておけば実現できるでしょう。
また、具体的にどのようにAPIを利用すればいいのかを簡単なサンプルプログラムで示したいと思います。

## API
LモーターをEV3本体のポートAに接続しましょう。
（Lモーター）
![](http://www.afrel.co.jp/cms/wp-content/uploads/2013/04/45502_LargeMotor.jpg)


###EV3LargeRegulatedMotorクラス
Lモーターの制御にはEV3LargeRegulatedMotorクラスが利用できます。

```java
RegulatedMotor m = new EV3LargeRegulatedMotor(MotorPort.A);
```

###メソッド
主に利用するメソッドを紹介します。
####addListener

```
public void　addListener(RegulatedMotorListener listener)
```
モーターの回転開始、停止のイベントを登録できます。
####removeListener

```
public　void　removeListener()
```
イベントを削除します。

####forward

```
public void　forward();
```
モーターを正回転させます。
stopが呼ばれるまで停止しません。



####backward

```
public void　backward()
```
モーターを逆回転させます。
stopが呼ばれるまで停止しません。

####stop

```
public void　stop()
```
モーターを停止させます。

####rotate

```
public void rotate(int angle)
```
現在位置から相対的に、引数に指定した角度分回転します。

####rotateTo

```
public void rotateTo(int limitAngle)
```
引数に指定した絶対角度まで回転します。

####close

```
public void　close()
```
モーターへのアクセスを閉じ、リソースを解放します。


####flt

```
public void flt()
```
モーターをフロートモードに設定します。
制動なしでモーターが停止するため、モーターの位置は維持されません。

####getSpeed

```
public int getSpeed()
```
現在の回転速度を返します。
####getRotationSpeed

```
public int getRotationSpeed()
```
現在の加速度を返します。
####getAcceleration

```
public int getAcceleration()
```
現在の角速度(degree/s/s)を返します。

####getPosition

```
public float getPosition()
```
モーターの現在位置の角度を返します。

####getLimitAngle

```
public int getLimitAngle()
```
モーターが回転する最大位置角度を返します。
####getMaxSpeed

```
public float getMaxSpeed()
```
モーターに設定できる最大の回転速度を返す。



####isMoving

```
public boolean isMoving()
```

モーターが回転しているなら真を返します。

####isStalled

```
public boolean isStalled()
```
モーターが停止しているなら真を返します。
####lock

```
public void　lock(int power)
```
モータはfltメソッドを使用してフロートモードに設定されていない限り、ポジションを保持しようとします。
引数に保持する力の強さを1〜100の間で設定します。

####setSpeed

```
public void setSpeed(int speed)
```
モーターの回転速度を設定します。
####setAcceleration

```
public void setAcceleration(int acceleration)
```
引数に渡したモーターの角速度を設定します。
デフォルトでは(6000degree/s/s)になっています。

### Mモーター
Mモーターの制御にはEV3MediumRegulatedMotorクラスを利用します。
使えるメソッドはEV3LargeRegulatedMotorクラスと基本的に殆ど変わりはないので説明は割愛します。
（Mモーター）
![](http://www.afrel.co.jp/cms/wp-content/uploads/2013/04/45503_MediumMotor.jpg)

## サンプルプログラム
回転速度などを変化させてモーターを動かすだけの簡単なサンプルプログラムです。

```java:Ev3MotorSample.java
import lejos.hardware.motor.EV3LargeRegulatedMotor;
import lejos.hardware.port.MotorPort;
import lejos.robotics.RegulatedMotor;
import lejos.utility.Delay;

public class Ev3MotorSample {

	public static void main(String[] args) {
		RegulatedMotor m = new EV3LargeRegulatedMotor(MotorPort.A);
		
		m.forward();
		Delay.msDelay(2000);
		m.stop();
		
		m.backward();
		Delay.msDelay(2000);
		m.stop();
		
		m.setSpeed((int) m.getMaxSpeed());
		
		m.forward();
		Delay.msDelay(2000);
		m.stop();
		
		m.backward();
		Delay.msDelay(2000);
		m.stop();
		
		m.setAcceleration(3000);
		m.rotate(720);
		m.setAcceleration(6000);
		m.rotate(-720);
	}

}
```
クリックで動画再生
[![YouTube](https://i.ytimg.com/vi/g2Ik5AZYCP0/hqdefault.jpg)](https://www.youtube.com/watch?v=g2Ik5AZYCP0)


## 参考
紹介したAPIは一部のみです。より詳しい情報を知りたい方は公式ドキュメントを参考にしましょう。
>
[https://sourceforge.net/p/lejos/wiki/Motors/](https://sourceforge.net/p/lejos/wiki/Motors/)
>
[http://www.lejos.org/ev3/docs/](http://www.lejos.org/ev3/docs/)