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現在)
