marunomaruno-memo

marunomaruno-memo

Lego Mindstoms NXT - leJOS - (5) タッチセンサー

2008年07月29日 | LEGO
◆ Lego Mindstoms NXT - leJOS - (5) タッチセンサー

それでは、今度はタッチセンサーを使ってみましょう。

NXT には、つぎのセンサーがあります。ここに記述されているのは、
NXT ブロックにセンサーを取り付ける上での標準のポートです。

・タッチセンサー (ポート 1)
・音センサー (ポート 2)
・光センサー + ライト (ポート 3)
・超音波センサー (ポート 4)
・回転センサー (モーターA、B、C)


■ タッチセンサー

まずは、タッチセンサーの動きを確認するプログラムを作ります。

------------------------------------------------------
import lejos.navigation.Pilot;
import lejos.nxt.Motor;
import lejos.nxt.SensorPort;
import lejos.nxt.TouchSensor;

/**
 * モーターを前進させた後、タッチしたら終了する。
 * 
 * @author marunomaruno
 * @version 1.0, 2008/06/04
 * @since 1.0
 */
public class TouchSensor01 {

    public static void main(String[] args) {

        // タッチセンサーオブジェクトをポート1で生成する
        TouchSensor touchSensor = new TouchSensor(SensorPort.S1);  // (1)
        
        // パイロットのオブジェクトを生成する
        Pilot pilot = new Pilot(5.6f, 13f, Motor.C, Motor.B);

        // 前進回転する
        pilot.forward();

        // 押されるまでループする
        while (!touchSensor.isPressed())                           // (2)
            ;

        // 停止する
        pilot.stop();
    }
}

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



□ TouchSensor touchSensor = new TouchSensor(SensorPort.S1); // (1)

タッチセンサーオブジェクトをポート 1 で生成します。
Java なので、センサーなどもオブジェクトとして生成しないと使
えません。

TouchSensor クラスには次のようなコンストラクターやメソッドが
あります。


□ コンストラクター
---
TouchSensor(ADSensorPort port)
ポートを指定して、タッチセンサーのオブジェクトを生成しま
す。
---


□ メソッド
---
boolean isPressed()
センサーが押されたら true を返します。
---


なお、センサーポートは SensorPort クラスの定数で提供されてい
ます。

□ ポートを表す定数
---
static SensorPort[] PORTS センサーポートの定数が、S1, S2, S3,
S4 の順に入っている配列
static SensorPort S1 センサーポート 1
static SensorPort S2 センサーポート 2
static SensorPort S3 センサーポート 3
static SensorPort S4 センサーポート 4

---
PORTS は、配列で、S1 ~ S4 の値を持ちます。


□ while (!touchSensor.isPressed()); // (2)

タッチセンサーが押されたかどうかは、isPressed メソッドを使う
ことでわかります。この値が true のときにタッチされたことにな
るので、while ループで、false の間ループさせます。当然、この
間はモーターが動き続けることになります。



■ トライボットの「バンパー」のプログラム

これは、トライボットの 2 番目の工程で作った「バンパー (タッ
チセンサー)」のプログラムです。ただし、後退する時間は回転数
ではなく、0.5 秒という時間で行っています。


------------------------------------------------------
import lejos.navigation.Pilot;
import lejos.nxt.Motor;
import lejos.nxt.SensorPort;
import lejos.nxt.TouchSensor;
import u.NxtUtil;

/**
 * 「トライボット」使用
 * 前進し、そこでタッチしたものをつかみ、後退する。
 * 
 * @author marunomaruno
 * @version 1.0, 2008/06/04
 * @since 1.0
 */
public class Bumper01 {

    public static void main(String[] args) {

        // タッチセンサーオブジェクトをポート1で生成する。
        TouchSensor touchSensor = new TouchSensor(SensorPort.S1);

        // パイロットのオブジェクトを生成する
        Pilot pilot = new Pilot(5.6f, 13f, Motor.C, Motor.B);

        // タッチするまで前進
        pilot.forward();
        while (!touchSensor.isPressed())
            ;
        pilot.stop();
        
        // アームを閉じる
        Motor.A.backward();
        NxtUtil.pause(500);
        Motor.A.stop();

        // 0.5 秒後退
        pilot.backward();
        NxtUtil.pause(500);
        pilot.stop();
    }
}

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




■ 前進した分だけ後退する

今度は、前進した分だけ後退するようにします。
これには、前進した分の時間を計測して、これを後退するときの待
ち時間に設定すればいいです。前進した分の時間は、
停止した時刻 - 前進を始めた時刻
で取得できます。この、時刻を取得するのが、System クラスの
currentTimeMillis メソッドです。


------------------------------------------------------
import lejos.navigation.Pilot;
import lejos.nxt.Motor;
import lejos.nxt.SensorPort;
import lejos.nxt.TouchSensor;
import u.NxtUtil;

/**
 * 「トライボット」使用
 * 前進し、そこでタッチしたものをつかみ、前進した分、後退する。
 * 
 * @author marunomaruno
 * @version 1.0, 2008/06/04
 * @since 1.0
 */
public class Bumper02 {

    public static void main(String[] args) {

        // タッチセンサーオブジェクトをポート1で生成する。
        TouchSensor touchSensor = new TouchSensor(SensorPort.S1);

        // パイロットのオブジェクトを生成する
        Pilot pilot = new Pilot(5.6f, 13f, Motor.C, Motor.B);

        // タッチするまで前進
        long startTime = System.currentTimeMillis();    // (1)
        pilot.forward();
        while (!touchSensor.isPressed())
            ;
        pilot.stop();
        long forwardingTime = System.currentTimeMillis() - startTime; // (2)
        
        //    アームを閉じる
        Motor.A.backward();
        NxtUtil.pause(500);
        Motor.A.stop();

        // 前進分後退
        pilot.backward();
        NxtUtil.pause(forwardingTime);
        pilot.stop();
    }
}
------------------------------------------------------



以上