[ev3×Java]   単一モーターの制御(コードの構造、加速度、forループ、whileループ、if文)

この記事はJavaでev3を操作してみたい人のための記事です。
今回はモーターをいろいろな方法で制御していきたいと思います。

#目次
0 . 用意するもの
1 . コードの構造
2 . Lモーターの制御
　2-0 . Lモーターを一定時間回転させるプログラム
　2-1 . Lモーターを一定角度回転させるプログラム
　2-2 . Lモーターを加速させていくプログラム
　3-3 . forループを使うプログラム
　2-4 . whileループを使うプログラム
　2-5 . if,elseを使うプログラム
3 . Mモーターの制御
最後に


#0.用意するもの
◯ ev3(インテリジェントブロック)
◯ Lモーター/Mモーター
◯ パソコン(eclipse)
◯ bluetooth
◯ microSD
◯ [API Documentation](http://www.lejos.org/ev3/docs/)(これをみながら進めていくのがオススメです。)



---


#1.コードの構造

◯今回使うプログラムは大体こんな形です。
まずは、この形についての説明です。

```templete.java
//プログラムに使う材料を準備する
import package.Class;

//クラスをつくる
public class クラスの名前 {

	//staticメソッドをつくる
    public static void main(String[] args) {

        //インスタンスの生成
        型  参照型変数 = new クラス();
        
        //メソッドを使う
        参照型変数.メソッド();
    }
}
```

---
Point :**import**
プログラムをするのに必要な材料(コードのまとまり)を調達するためのものです。``import package.Class``のように書きます。

例えば、``import lejos.hardware.motor.EV3LargeRegulatedMotor``は、パッケージ``lejos.hardware.motor``のなかの``EV3LargeRegulatedMotor``クラスを調達するという意味です。

---

Point :**クラス**
関連のあるフィールドとメソッドをまとめたものです。
(例)

```.java
public class  人間{
    //フィールド
    float 身長;
    float 体重;
    float 歌唱力;
    //メソッド
    public void 寝る(){};
    public void 食べる(){};
    public void 話す(){};
    public void 歌う(){};
}
```

---

Point : **staticメソッド**
**クラスをインスタンス化しなくても呼び出すことができる**メソッド(関数)のことです。

参考記事
[mainメソッドとその引数(args)、戻り値について解説](https://www.sejuku.net/blog/65082)
[Javaのstaticメソッドを丁寧に解説! 活用例や考え方も一緒に学ぼう!](https://engineer-club.jp/java-static-method)

---

Point　:**インスタンス**
クラスを具体化したもの(オブジェクト)です。
インスタンスは、**クラスのもつフィールドやメソッドを持っています**。
インスタンスは1つのクラスから複数つくることができます。

---

Point : **インスタンスの生成**
クラスからオブジェクトをつくることです。
インスタンスの生成は次のようにして行います。

```.java
型 参照型変数 = new クラス(コンストラクタ)
```
のようにします。
コンストラクタによってクラスから**個性を持ったオブジェクトを作れる**ようになります。

**(例)**　クラス人間から剛田武をつくる

```.java
人間 剛田武 = new 人間(身長 = 157,体重 = 70,歌唱力 = 0);
```

[参考記事]　:　[インターフェースを実装！Javaでimplementsを使う方法](https://techacademy.jp/magazine/17414)

---
Point : **参照型変数**
オブジェクトを参照するクラス型変数のこと。
ここでいうオブジェクトとはクラスのインスタンス、つまり、 = の右側のnew以下のこと。

---

Point : **ドット(.)**
ドット(.)は、**~の中にいく**という意味です。
ドットを使うと、オブジェクトの中のフィールドやメソッドにアクセスできます。
``参照型変数.メソッド()``とあった場合、参照型変数がオブジェクトのある場所を示し、そこからオブジェクトの中のものにアクセスするイメージです。

```.java
剛田武.歌う();
```


---




　

#2.Lモーターの制御

##2-0 . Lモーターを一定時間回転させるプログラム

◯Lモータを5秒間回転させて止めるプログラム

```lmotor00.java
//必要なもの(材料)をimportする
import lejos.hardware.motor.EV3LargeRegulatedMotor;
import lejos.hardware.port.MotorPort;
import lejos.robotics.RegulatedMotor;
import lejos.utility.Delay;

//クラスをつくる
public class lmotor00 {

	//staticメソッドをつくる
    public static void main(String[] args) {

        //インスタンスの生成
        RegulatedMotor l_a = new EV3LargeRegulatedMotor(MotorPort.A);
        
        //1秒間に720度回転する速さに設定する
        l_a.setSpeed(720);
        //モータを正回転させる
        l_a.forward();
        //5000ミリ秒(5秒)待機する = 処理を継続する
        Delay.msDelay(5000);
        //モータを停止する
        l_a.stop();
    }
}
```

---

Point : **クラス.メソッド**
msDelay()は**staticメソッド**なので、インスタンスを使わずに使うことができます。

[参考記事]
[Javaのstaticメソッドを丁寧に解説! 活用例や考え方も一緒に学ぼう!](https://engineer-club.jp/java-static-method)
[staticなmethodのメリットとは](https://teratail.com/questions/13203)

---

Point : **setSpeed()**
モーターの回転スピードを決めるメソッド。
引数には1秒間に回転させたい角度を指定する。

---

Point : **forward()**
モーターを正の方向に回転させるメソッド。
停止させるメソッドがない場合は回転し続ける。

---

##2-1 . Lモーターを一定角度回転させるプログラム

◯モータを1080度回転させるプログラム

```lmotor01.java
//必要なもの(材料)をimportする
import lejos.hardware.motor.EV3LargeRegulatedMotor;
import lejos.hardware.port.MotorPort;
import lejos.robotics.RegulatedMotor;

//クラスをつくる
public class lmotor01 {

	//staticメソッドをつくる
    public static void main(String[] args) {

        //インスタンスの生成
        RegulatedMotor l_a = new EV3LargeRegulatedMotor(MotorPort.A);
        
        //1秒間に360度回転する速さに設定する
        l_a.setSpeed(360);
        //モータを1080度、負の向きに回転させる
        l_a.rotate(-1080);
    }
}
```
---

Point : **rotate()**
引数で指定した角度分回転する
処理が終わったら回転は停止する

---





##2-2 . Lモーターを加速していくプログラム

◯Lモーターを徐々に加速していくプログラムです。

```lmotor02.java
//必要なもの(材料)をimportする
import lejos.hardware.motor.EV3LargeRegulatedMotor;
import lejos.hardware.port.MotorPort;
import lejos.robotics.RegulatedMotor;

//クラスをつくる
public class lmotor02 {

	//staticメソッドをつくる
    public static void main(String[] args) {

        //インスタンスの生成
        RegulatedMotor l_a = new EV3LargeRegulatedMotor(MotorPort.A);

        //スピードを最大に設定する
        l_a.setSpeed((int) l_a.getMaxSpeed());
        //加速度を100に設定する(初速が遅く、加速していく)
        l_a.setAcceleration(100);
        l_a.rotate(7200);
        //加速度を9000に設定する(一気に加速する)
        l_a.setAcceleration(9000);
        l_a.rotate(-7200);
    }
}
```

---

Point : **加速度**
加速度とは、**単位時間あたりの速度の変化率**のことです。
メソッドsetAcceleration()の引数の単位 **degrees/s/s** は、**1秒[s]間に角速度[degrees/s]がどれだけ変化するか**を表しています。
(例)1秒間に100度ずつ変化する場合

|時間[s]| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|角速度[degrees/s]|0|  100 | 200  |300   |400   |500   |600   | 700  | 800  |  900 | 1000  |
|加速度[degrees/s/s]|0|100   | 100  | 100  | 100  | 100  | 100  | 100  | 100  | 100  | 100  |

---

Point : **getMaxSpeed()**
最大の速度数値を返すメソッド。
最大速度は、充電量にも左右されます。

---
Point : **setAcceleration()**
加速の度合いを決めるメソッド。
値が小さいほどゆっくり加速していきます。

---



##2-3.forループを使うプログラム

◯2秒おきにスピードを増加させていくプログラム


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

//クラスをつくる
public class lmotor03 {

	//staticメソッドをつくる
    public static void main(String[] args) {

        //インスタンスの生成
        RegulatedMotor l_a = new EV3LargeRegulatedMotor(MotorPort.A);
 
        //i < 1000を満たす間、iを100ずつ増加させる
        for(int i = 10 ; i < 1000 ; i += 100) {
        	//スピードをiに設定する
        	l_a.setSpeed(i);
        	l_a.forward();
        	Delay.msDelay(2000);
        }
        //forループを抜けたら、モータを停止する
        l_a.stop();
    }
}
```
---
Point : **forループ**
``i < しきい値``が真の間、処理を繰り返します。
処理の度に、iが足されて(引かれて)いきます。

```.java
for(int i = 初期値;i < しきい値; i += 増減分){
    処理
}
```

---










##2-4 . whileループを使うプログラム

◯Lモーターを2秒おきに加速していくプログラムです。

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

//クラスをつくる
public class lmotor04 {

	//staticメソッドをつくる
    public static void main(String[] args) {

        //インスタンスの生成
        RegulatedMotor l_a = new EV3LargeRegulatedMotor(MotorPort.A);

        //整数型の変数sを定義する
        int s = 0; 
        //s < 1000を満たす間、{}中の処理を繰り返す
        while(s < 1000) {
        	//スピードをsに設定する
        	l_a.setSpeed(s);
        	l_a.forward();
        	Delay.msDelay(2000);
        	//s = s + 100
        	s += 100;
        }
        //whileループを抜けたら、モータを停止する
        l_a.stop();
    }
}
```

Point : **whileループ**
条件を設定して、その条件が真の間は処理を繰り返す仕組みです。

```.java
while(条件){
    処理;
}
```




---

##2-5 . if,elseを使うプログラム

◯Lモーターを2秒おきに加速していくプログラムです。
ただし、**もしインテリジェントブロックの中央のボタンが押されたら**、ループを終了します。


```lmotor05.java
import lejos.hardware.Button;
import lejos.hardware.motor.EV3LargeRegulatedMotor;
import lejos.hardware.port.MotorPort;
import lejos.robotics.RegulatedMotor;
import lejos.utility.Delay;

//クラスをつくる
public class lmotor05 {

	//staticメソッドをつくる
    public static void main(String[] args) {

        //インスタンスの生成
        RegulatedMotor l_a = new EV3LargeRegulatedMotor(MotorPort.A);

        //整数型の変数sを定義する
        int s = 0; 
        //s < 1000を満たす間、{}中の処理を繰り返す
        while(s < 1000) {
        	//もし中央のボタンが押されたら
        	if(Button.getButtons() == 2) {
        		//ループの処理を終了する
        		break;
        	//もし中央のボタンが押されていないならば
        	}else {
            //スピードをsに設定する
        	l_a.setSpeed(s);
        	l_a.forward();
        	Delay.msDelay(2000);
        	//s = s + 100
        	s += 100;
        	}
        }
        //whileループを抜けたら、モータを停止する
        l_a.stop();
    }
}
```

---
Point : **if,else**
もし条件が真ならば処理1を、でなければ処理2を行うという仕組みです。

```.java
if(条件){
    処理1;
}else{
    処理２;
}
```


---

ifを使った文は他にも以下のようなものがあります。

```.java
if(条件){
    処理;
}
```

```.java
if(条件a){
    処理1;
}else if(条件b){
    処理2;
```

```.java
if(条件a){
    処理1;
}else if(条件b){
    処理2;
}else{
    処理3;
}
```

---

Point : **Button.getButtons()**
押されたボタンに対応する整数値を返すstaticメソッドです。
インテリジェントブロックのボタンには、それぞれ**数値が割り振られています**。
[ボタンと整数値の対応表](http://www.lejos.org/ev3/docs/constant-values.html#lejos.hardware.Button.ID_ENTER)
``if(Button.getButtons() == 2)``は、対応表より、**中央のボタンが押されたならば**ということを意味します。

---

Point : **break**
ループを終了させるための文です。

---

#3.Mモーターの制御

EV3MediumRegulatedMotorクラスを使うこと以外はLモーターと変わりません。

```.java
//インスタンスの生成
RegulatedMotor m_a = new EV3MediumRegulatedMotor(MotorPort.A);
```



#最後に

読んで頂きありがとうございました！！
次回は複数のモーターの制御について書いていきたいと思います！

より良い記事にしていきたいので
　◯こうした方がわかりやすい
　◯ここがわかりにくい
　◯ここが間違っている
　◯ここをもっと説明して欲しい
などの御意見、御指摘のほどよろしくお願い致します。