marunomaruno-memo

marunomaruno-memo

Lego Mindstoms NXT - leJOS - (2) NXT 画面とモーター

2008年07月08日 | LEGO
◆ Lego Mindstoms NXT - leJOS - (2) NXT 画面とモーター

leJOS 上で動く Java のプログラムのサンプルをいくつかつくりま
す。
このサンプルにしたがって、API も参照していきます。


■ NXT 画面に "Hello World!" と 5 秒間表示

まずは、NXT 画面に文字列を表示してみましょう。

次のアプリケーションは、前回の稼動確認に使ったものと同じです。
NXT 画面に "Hello World!" と 5 秒間表示されます。

------------------------------------------------------
import lejos.nxt.LCD;                                 // (1)

/**
 * NXT 画面に "Hello World!" を 5 秒間表示するプリケーション。
 * 
 * @author marunomaruno
 * @version 1.0, 2008/06/04
 * @since 1.0
 */
public class HelloWorld {

    public static void main(String[] args) {
        LCD.drawString("Hello World!", 2, 3);         // (2)
        LCD.drawString("12345678901234567890", 0, 5); // (3)
        LCD.refresh();                                // (4)
        try {
            Thread.sleep(5000);                       // (5)
        } catch (InterruptedException e) {
        }
    }
}

------------------------------------------------------


□ import lejos.nxt.LCD; // (1)

lejos.nxt パッケージの LCD クラスをインポートします。


□ LCD.drawString("Hello World!", 2, 3); // (2)

NXT 画面の 3 行目 2 カラム目から "Hello World!" を描画します。
なお、行やカラムは 0 から数えます。


□ LCD.drawString("12345678901234567890", 0, 5); // (3)

NXT 画面の 5 行目 0 カラム目から "1234567890123456" を描画し
ます。
表示されるのは 1 行あたり 16 文字だけです。これよりも長い分
は無視されます。


□ drawString メソッド
---
static void drawString(String str, int x, int y)
画面の座標 (x, y) から文字列 str を表示します。
---

NXT 画面は 16 文字 X 8 行を表示できます。引数 str は表示した
い文字列、x, y は、画面左上を原点 (0, 0) としたときの表示す
る文字列の左下の座標です。

文字列が表示できないときでも、エラーにすることはありません。


□ LCD.refresh(); // (3)

NXT 画面を更新します。


□ Thread.sleep(5000); // (4)

5 秒間、スレッドを停止します。このことにより、NXT 画面上に表
示された文字列がそのまま 5 秒間表示し続けます。なお、sleep
メソッドは、必須例外の InterruptedException をスローするので、
try-catch ブロックで囲っておきます。

この sleep メソッドがないと、NXT 画面には一瞬だけ文字列が表
示されるだけのようです。(★)



□ lejos.nxt.LCD クラス

NXT 画面に対するユーティリティ・クラス。すべてのメソッドがス
タティックです。
座標は、画面左上を原点 (0, 0) とし、右下を (15, 7) としたも
のです。

おもなメソッド一覧
------------------------------------------------------
static void clear() 
    画面をクリアします。

static void drawInt(int i, int x, int y) 
    画面の座標 (x, y) から数値 i を表示します。

static void drawString(String str, int x, int y) 
    画面の座標 (x, y) から文字列 str を表示します。

static void refresh() 
    画面を更新します。

------------------------------------------------------




■ 走らせる

モーターを動かして、トライボットを走らせます。

△ NXC との違い
---
NXC のときは、ファイル名が ForwardAndBackward01.nxc でしたが、
ForwardAndBackward01 だとクラス名が長く、ダウンロードできな
いので、このような名前にしました。
---


------------------------------------------------------
import lejos.nxt.Motor;                       // (1)

/**
 * 「トライボット」使用
 * 1秒間前進し、その後1秒間停止、1秒間後退する。
 * 
 * @author marunomaruno
 * @version 1.0, 2008/06/04
 * @since 1.0
 */
public class ForwardBack01 {

    public static void main(String[] args) {
        // BCモーター前進、1000ミリ秒間
        Motor.B.forward();                    // (2)
        Motor.C.forward();
        try {
            Thread.sleep(1000);               // (3)
        } catch (InterruptedException e) {
        }

        // BCモーター停止、1000ミリ秒間
        Motor.B.stop();                       // (4)
        Motor.C.stop();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
        }

        // BCモーター後退、1000ミリ秒間
        Motor.B.backward();                   // (5)
        Motor.C.backward();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
        }

        // BCモーター停止
        Motor.B.stop();                       // (6)
        Motor.C.stop();
    }
}
------------------------------------------------------



□ import lejos.nxt.Motor; // (1)

必要なクラスをインポートします。


□ Motor.B.forward(); // (2)
Motor.C.forward();

Motor クラスの定数にそれぞれのポートに定義されたモーター定数
(A, B, C) が用意してあります。これらのモーター定数オブジェ
クトを使ってモーターを操作します。

前進するには、forward メソッドを使います。
B, C 2 つのモーターを使っているので、この 2 つとも同じように
前進させる必要があります。


□ メソッド
---
void forward()
前進します。
---


△ NXC との違い
---
NXC では複数のモーターをあらわす定数として、
OUT_AB
OUT_AC
OUT_BC
OUT_ABC
がありましたが、leJOS では用意されていません。
---


□ Thread.sleep(1000); // (3)

1 秒間モーターを動かすために、スリープさせます。これがないと、
すぐに次の文に制御が移ります。その文によっては、モーターも、
一瞬しか動きません。


△ NXC との違い
---
NXC では Off 関数などを使って自分でモーターを止めない限り、
モーターは動き続きます。
---


□ Motor.B.stop(); // (4)
Motor.C.stop();

両方のモーターを停止します。


□ stop メソッド
---
void stop()
モーターを停止します。

---


□ Motor.B.backward(); // (5)
Motor.C.backward();

後退するには backward メソッドを使います。


□ メソッド
---
void backward()
後退します。
---


□ Motor.B.stop(); // (6)
Motor.C.stop();

(3) で記したように、leJOS では、プログラムが終了したらモー
ターも停止するので、この文はなくてもモーターは止まりますが、
書いておいた方が気持ちいいでしょう。



□ Moter クラス

モーターをあらわすクラスです。


□ おもな定数
---
static Motor A: モーターA
static Motor B: モーターB
static Motor C: モーターC
---

□ おもなメソッド
---
void backward()
後退します。

void forward()
前進します。

int getActualSpeed()
実測値のモーター速度 (度 / 秒) を取得します。速度は 100
ミリ秒ごとに測定します。負数は後退しているときです。

int getLimitAngle()
モーターが回転した度数を取得します。

int getMode()
モードを取得します。
1=前進, 2=後退, 3=停止, 4=フルオーティング

int getSpeed()
モーター速度 (度 / 秒) を取得します。

int getStopAngle()

int getTachoCount()
タコメーター数を取得します。

boolean isBackward()
後退しているとき true が返ります。

boolean isForward()
前進しているとき true が返ります。

boolean isMoving()
モーターが動いているとき true が返ります。

boolean isRotating()
モーターが回転しているとき true が返ります。

boolean isStopped()
モーターが停止しているとき true が返ります。

void resetTachoCount()
タコメーター数を 0 にリセットします。

void reverseDirection()
モータの方向を逆にします。

void rotate(int angle)
モーターを angle 度回転します。負数のときは逆回転です。

void rotateTo(int limitAngle)
モーターを limitAngle 度回転します。 getTachoCount() メ
ソッドの返り値は +- 2 度以内になります。負数のときは逆回転で
す。

void setSpeed(int speed)
モーター速度 (度 / 秒) を設定します。0 または正数を指定。
負数のときの動作は不定。

void stop()
モーターを停止します。
---

なお、これらのメソッドのうち、実際にそのメソッドでモーターが
動くのは roate メソッドと rotateTo メソッドの 2 つです。これ
ら以外は、どうやら、モーターに動く方向や速度を設定するだけで、
つぎのメソッドが来てから実際に動くようです。(★)


setSpeed メソッドは速度の指定ですが、これも負数は指定できま
せん。

---
★ rotate メソッドと rotateTo メソッドの違いは? rotateTo メ
ソッドの方が正確なのか? ただ、totateTo メソッドは、leJOS の
サンプルでも使用されていない。
isMoving メソッドと isRotating メソッドの違いもわからない。

---