2017年5月17日
- EV3技術情報
- Java
- TETRIX技術情報
- ソフトウェア
- ソフトウェア
TETRIXをJava(leJOS)で動かすには-エンコーダー付きDCモータを動かす
Java(leJOS)で作成したプログラムで、TETRIXのエンコーダー付きDCモータを制御する方法を紹介します。
なお、DCモータの基本的な制御方法はこちらを、
180度サーボモータの制御方法はこちらご覧ください。
エンコーダーの取り付け方法はこちらをご覧ください。
※ここでは、TETRIXをEV3と接続して制御する方法を紹介します。
※EV3のJava言語プログラミング環境については、「教育版EV3 Javaプログラミングガイド」をご参照ください。
※ここで紹介する内容は、leJOS EV3 バージョン 0.9.1-betaを用いて動作を確認したものです。
※ここで紹介する内容は、仕様変更前のDCモーターコントローラー(商品型番:PI-W34303)とDCギアモーター(商品型番:PI-W39530)を使用したものです。仕様変更後のTETRIX MAX DC Motor Expansion Controller(商品型番:PI-W44354)とTETRIX TorqueNADOモーター(商品型番:PI-W44260)では動作しませんのでご注意ください。
仕様変更前後の製品についてはこちらをご覧ください。
◆ロボット
・DCモーターコントローラーはEV3のセンサーポート1に接続します。
・DCモーターコントローラーのMotor1にDCモータを接続します。
・エンコーダーのコネクターケーブルは、DCモーターコントローラーのEnc.1に接続します。
◆サンプルプログラム
このプログラムは、DCモータを角度を指定して制御します。
1 | import lejos.hardware.Button; |
---|---|
2 | import lejos.hardware.device.tetrix.TetrixControllerFactory; |
3 | import lejos.hardware.device.tetrix.TetrixEncoderMotor; |
4 | import lejos.hardware.device.tetrix.TetrixMotorController; |
5 | import lejos.hardware.lcd.LCD; |
6 | import lejos.hardware.port.SensorPort; |
7 | import lejos.utility.Delay; |
8 | |
9 | public class Encoder { |
10 | |
11 | public static void main(String[] args) { |
12 | |
13 | // DC Motor Controller |
14 | TetrixControllerFactory cf = new TetrixControllerFactory(SensorPort.S1); |
15 | TetrixMotorController mc = cf.newMotorController(); |
16 | |
17 | // DCモータ(エンコーダー付き) |
18 | TetrixEncoderMotor mot1 = mc.getEncoderMotor(TetrixMotorController.MOTOR_1); |
19 | |
20 | // リセット |
21 | mot1.resetTachoCount(); |
22 | |
23 | // 正転 |
24 | mot1.setPower(50); |
25 | mot1.forward(); |
26 | Delay.msDelay(1000); |
27 | mot1.stop(); |
28 | |
29 | // 回転角度を表示 |
30 | LCD.clear(); |
31 | LCD.drawString("tacho = " + mot1.getTachoCount(), 0, 5); |
32 | Button.waitForAnyPress(); |
33 | LCD.clear(); |
34 | LCD.refresh(); |
35 | |
36 | // 0度(スタート時)の位置まで回転 |
37 | mot1.setPower(10); |
38 | mot1.rotateTo(0, false); |
39 | |
40 | // 720度の位置まで回転 |
41 | mot1.rotateTo(720, false); |
42 | // 360度回転 |
43 | mot1.rotate(360, false); |
44 | |
45 | // 回転角度を表示 |
46 | LCD.drawString("tacho = " + mot1.getTachoCount(), 0, 5); |
47 | Button.waitForAnyPress(); |
48 | LCD.clear(); |
49 | LCD.refresh(); |
50 | } |
51 | } |
最初にエンコーダーのカウントをリセットしています。(21行目)
DCモータをパワー50でプラス方向に1秒間回転させ(24~27行目)、それによって回転した角度をEV3の液晶画面に表示します。(31行目)
次にDCモーターコントローラーを0度(1秒間回転する前)の位置までパワー10で回転させます。(37・38行目)ここでDCモータは0度の位置まで回転するため、マイナス方向に回転します。
続いてDCモータを720度の位置まで回転させます。(41行目)回転する前のDCモータは0度の位置にあるため、プラス方向に720度回転します。
最後にDCモータを360度回転させ(43行目)、現在の回転角度をEV3の液晶画面に表示します。(46行目)
rotateToメソッドは、回転量を0度の位置からの絶対値で指定しますが(41行目)、rotateメソッドは回転量を現在地からの相対値で指定します。(43行目)
※サンプルプログラムは一例として紹介しています。誤り等が含まれていた場合はご了承ください。
◆メソッド サンプルプログラムの中で使用している主なエンコーダー付きDCモータ関連のメソッドは以下のとおりです。
public void resetTachoCount() |
エンコーダーの値をリセットする。 |
public int getTachoCount() |
エンコーダーの値を取得する。 |
public void rotateTo(int limitAngle, boolean immediateReturn) |
DCモータを指定した位置(角度)まで回転させます。
引数limitAngleにはどの位置(角度)まで回転させるかを指定します。角度はエンコーダーの0度の位置からの絶対値で指定します。単位は「度」です。
引数immediateReturnは、trueを指定した場合DCモータの回転完了を待たず次の処理へ移ります。falseを指定した場合DCモータの回転完了を待って次の処理へ移ります。 |
public void rotate(int degrees, boolean immediateReturn) |
DCモータを指定した角度だけ回転させます。
引数degreesには回転させる角度を指定します。角度は現在位置からの相対値で指定します。単位は「度」です。
引数immediateReturnは、trueを指定した場合DCモータの回転完了を待たず次の処理へ移ります。falseを指定した場合DCモータの回転完了を待って次の処理へ移ります。 |
詳しくは以下のページをご覧ください。
http://www.lejos.org/ev3/docs/lejos/hardware/device/tetrix/TetrixEncoderMotor.html
(2017/05/09現在)