この記事は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(これをみながら進めていくのがオススメです。)
#1.コードの構造
◯今回使うプログラムは大体こんな形です。
まずは、この形についての説明です。
//プログラムに使う材料を準備する
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 :クラス
関連のあるフィールドとメソッドをまとめたものです。
(例)
public class 人間{
//フィールド
float 身長;
float 体重;
float 歌唱力;
//メソッド
public void 寝る(){};
public void 食べる(){};
public void 話す(){};
public void 歌う(){};
}
Point : staticメソッド
クラスをインスタンス化しなくても呼び出すことができるメソッド(関数)のことです。
参考記事
mainメソッドとその引数(args)、戻り値について解説
Javaのstaticメソッドを丁寧に解説! 活用例や考え方も一緒に学ぼう!
Point :インスタンス
クラスを具体化したもの(オブジェクト)です。
インスタンスは、クラスのもつフィールドやメソッドを持っています。
インスタンスは1つのクラスから複数つくることができます。
Point : インスタンスの生成
クラスからオブジェクトをつくることです。
インスタンスの生成は次のようにして行います。
型 参照型変数 = new クラス(コンストラクタ)
のようにします。
コンストラクタによってクラスから個性を持ったオブジェクトを作れるようになります。
(例) クラス人間から剛田武をつくる
人間 剛田武 = new 人間(身長 = 157,体重 = 70,歌唱力 = 0);
[参考記事] : インターフェースを実装!Javaでimplementsを使う方法
Point : 参照型変数
オブジェクトを参照するクラス型変数のこと。
ここでいうオブジェクトとはクラスのインスタンス、つまり、 = の右側のnew以下のこと。
Point : ドット(.)
ドット(.)は、~の中にいくという意味です。
ドットを使うと、オブジェクトの中のフィールドやメソッドにアクセスできます。
参照型変数.メソッド()
とあった場合、参照型変数がオブジェクトのある場所を示し、そこからオブジェクトの中のものにアクセスするイメージです。
剛田武.歌う();
#2.Lモーターの制御
##2-0 . Lモーターを一定時間回転させるプログラム
◯Lモータを5秒間回転させて止めるプログラム
//必要なもの(材料)を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メソッドを丁寧に解説! 活用例や考え方も一緒に学ぼう!
staticなmethodのメリットとは
Point : setSpeed()
モーターの回転スピードを決めるメソッド。
引数には1秒間に回転させたい角度を指定する。
Point : forward()
モーターを正の方向に回転させるメソッド。
停止させるメソッドがない場合は回転し続ける。
##2-1 . Lモーターを一定角度回転させるプログラム
◯モータを1080度回転させるプログラム
//必要なもの(材料)を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モーターを徐々に加速していくプログラムです。
//必要なもの(材料)を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秒おきにスピードを増加させていくプログラム
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が足されて(引かれて)いきます。
for(int i = 初期値;i < しきい値; i += 増減分){
処理
}
##2-4 . whileループを使うプログラム
◯Lモーターを2秒おきに加速していくプログラムです。
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ループ
条件を設定して、その条件が真の間は処理を繰り返す仕組みです。
while(条件){
処理;
}
##2-5 . if,elseを使うプログラム
◯Lモーターを2秒おきに加速していくプログラムです。
ただし、もしインテリジェントブロックの中央のボタンが押されたら、ループを終了します。
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を行うという仕組みです。
if(条件){
処理1;
}else{
処理2;
}
ifを使った文は他にも以下のようなものがあります。
if(条件){
処理;
}
if(条件a){
処理1;
}else if(条件b){
処理2;
if(条件a){
処理1;
}else if(条件b){
処理2;
}else{
処理3;
}
Point : Button.getButtons()
押されたボタンに対応する整数値を返すstaticメソッドです。
インテリジェントブロックのボタンには、それぞれ数値が割り振られています。
ボタンと整数値の対応表
if(Button.getButtons() == 2)
は、対応表より、中央のボタンが押されたならばということを意味します。
Point : break
ループを終了させるための文です。
#3.Mモーターの制御
EV3MediumRegulatedMotorクラスを使うこと以外はLモーターと変わりません。
//インスタンスの生成
RegulatedMotor m_a = new EV3MediumRegulatedMotor(MotorPort.A);
#最後に
読んで頂きありがとうございました!!
次回は複数のモーターの制御について書いていきたいと思います!
より良い記事にしていきたいので
◯こうした方がわかりやすい
◯ここがわかりにくい
◯ここが間違っている
◯ここをもっと説明して欲しい
などの御意見、御指摘のほどよろしくお願い致します。