goo blog サービス終了のお知らせ 

marunomaruno-memo

marunomaruno-memo

Lego Mindstoms NXT - leJOS - (16) 光センサーの調整

2010年03月24日 | LEGO
◆ Lego Mindstoms NXT - leJOS - (16) 光センサーの調整
================================================================================

■光センサー調整を調整する

光センサーから取得する値は、ロボットを動かす回りの環境によって、異なります。

また、センサー一般にいえることですが、センサー自体の性能によっても、取れる値の範
囲が違ってきます。たとえば、NXT標準の光センサーは10ビットなので、0~1023までの値
を取得することができますが、8ビットのセンサーや、12ビットのセンサーの場合ですと、
取れる値の範囲は、それぞれ0~255、0~4095と、違う範囲の値になってしまいます。
もちろん、ハードウェアが違えば、プログラムも違ってきますが、このようなセンサーの
値などは標準的にパーセントで取得できると、どの環境、どのハードウェアでも同じしき
い値でプログラミングできるようになります。

つぎのプログラムは、まず、暗いところと、明るいところの光量を取得し、それぞれを光
量の最小値、最大ととして設定します。そして、任意のところの光量を測定して表示しま
す。


□calibrateLow()とcalibrateHigh()を使う

これらのメソッドは、直前にreadValue()メソッドで読んだ光量をもとに、最小値、最大
値を設定します。これの後、readValue()メソッドを実行した結果は、0~100の間に収まる
ようになります。

---
import lejos.nxt.Button;
import lejos.nxt.LightSensor;
import lejos.nxt.SensorPort;

/**
 * 「トライボット」使用
 * 光センサーを調整する。
 * 
 * @author marunomaruno
 * @version 1.0, 2010/03/15
 * @since 1.0
 */
public class LightSensor13 {
    public static void main(String[] args) throws Exception {
        // 光センサーオブジェクトをポート3で生成する。
        LightSensor lightSensor = new LightSensor(SensorPort.S3);

        // センサーが安定するまで少し待つ
        Thread.sleep(100);

        // 最小値を設定する。
        System.out.println("Press Button if dark.");
        Button.waitForPress();
        int lowValue = lightSensor.readValue();                          // (1)
        lightSensor.calibrateLow();                                      // (2)
        System.out.println(lowValue + " " + lightSensor.readValue() + " " + 
                                            lightSensor.readNormalizedValue());

        // 最大値を設定する。
        System.out.println("Press Button if bright.");
        Button.waitForPress();
        
        int highValue = lightSensor.readValue();
        lightSensor.calibrateHigh();                                    // (3)
        System.out.println(highValue + " " + lightSensor.readValue() + " " + 
                                             lightSensor.readNormalizedValue());

        // 値を取得
        System.out.println("Press Button.");
        Button.waitForPress();
        System.out.println(lightSensor.readValue() + " " + 
                           lightSensor.readNormalizedValue());

        // プログラムを終える
        System.out.println("Press Button to exit.");
        Button.waitForPress();
    }
}
---

□ int lowValue = lightSensor.readValue();            // (1)

readNormalizedValue()メソッドによって、実際の値を取得します。
このメソッドは、NXTの場合は、0~1023までの範囲の値を取得します。
APIによると、145 (暗い) から 890 (太陽光)の範囲とのことです。


□ lightSensor.calibrateLow();                                // (2)

calibrateLow()メソッドで、このメソッドの直前にreadValue()メソッドで読み取った値
を、次にreadValue()メソッドで読んだときに 0 と読めるように設定します。


□ lightSensor.calibrateHigh();                              // (3)

calibrateHigh()メソッドで、このメソッドの直前にreadValue()メソッドで読み取った値
を、次にreadValue()メソッドで読んだときに 100 と読めるように設定します。


■setLow()とsetHigh()を使う

これらのメソッドは、直前にreadNormalizedValue()メソッドで読んだ光量をもとに、最
小値、最大値を設定します。これの後、readValue()メソッドを実行した結果は、0~100の
間に収まるようになります。

---
import lejos.nxt.Button;
import lejos.nxt.LightSensor;
import lejos.nxt.SensorPort;

/**
 * 「トライボット」使用
 * 光センサーを調整する。
 * 
 * @author marunomaruno
 * @version 1.0, 2010/03/15
 * @since 1.0
 */
public class LightSensor13 {
    public static void main(String[] args) throws Exception {
        // 光センサーオブジェクトをポート3で生成する。
        LightSensor lightSensor = new LightSensor(SensorPort.S3);

        // センサーが安定するまで少し待つ
        Thread.sleep(100);

        // 最小値を設定する。
        System.out.println("Press Button if dark.");
        Button.waitForPress();
        int lowValue = lightSensor.readNormalizedValue();            // (1)
        lightSensor.setLow(lowValue);                                // (2)
        System.out.println(lowValue + " " + lightSensor.readValue());

        // 最大値を設定する。
        System.out.println("Press Button if bright.");
        Button.waitForPress();
        int highValue = lightSensor.readNormalizedValue();
        lightSensor.setHigh(highValue);                              // (3)
        System.out.println(highValue + " " + lightSensor.readValue());

        // 値を取得
        System.out.println("Press Button.");
        Button.waitForPress();
        System.out.println(lightSensor.readNormalizedValue() + " " + 
                           lightSensor.readValue());

        // プログラムを終える
        System.out.println("Press Button to exit.");
        Button.waitForPress();
    }
}
---

□ int lowValue = lightSensor.readNormalizedValue();            // (1)

readNormalizedValue()メソッドによって、実際の値を取得します。
このメソッドは、NXTの場合は、0~1023までの範囲の値を取得します。
APIによると、145 (暗い) から 890 (太陽光)の範囲とのことです。


□ lightSensor.setLow(lowValue);                                // (2)

setLow()メソッドで、readNormalizedValue()メソッドで読み取った値を、readValue()メ
ソッドで読んだときに 0 と読めるように設定します。


□ lightSensor.setHigh(highValue);                              // (3)

setHigh()メソッドで、readNormalizedValue()メソッドで読み取った値を、readValue()
メソッドで読んだときに 100 と読めるように設定します。


■光センサー調整ユーティリティ

光センサーを調整する部分をユーティリティ化します。

---
import lejos.nxt.Button;
import lejos.nxt.LightSensor;

/**
 * 「トライボット」使用
 * 光センサーを調整するユーティリティ。
 * 
 * @author marunomaruno
 * @version 1.0, 2010/03/15
 * @since 1.0
 */
public class Calibrator01 {

    /**
     * 光センサーを調節する。
     * 調節し終わったら、いずれかのボタンの押下をうながし、待ち状態になる。
     * @param lightSensor 光センサー
     */
    public static void calibrate(LightSensor lightSensor) {    // (1)
        // 最小値を設定する。
        System.out.println("Press Button if dark.");
        Button.waitForPress();
        int lowValue = lightSensor.readNormalizedValue();
        lightSensor.setLow(lowValue);
        System.out.println(lowValue + " " + lightSensor.readValue());

        // 最大値を設定する。
        System.out.println("Press Button if bright.");
        Button.waitForPress();
        int highValue = lightSensor.readNormalizedValue();
        lightSensor.setHigh(highValue);
        System.out.println(highValue + " " + lightSensor.readValue());

        // スタートする。
        System.out.println("Press Button to start.");
        Button.waitForPress();
    }

}
---

□ public static void calibrate(LightSensor lightSensor) {    // (1)

光センサを調整するメソッドです。


■このユーティリティを使うプログラム

---
import lejos.nxt.Button;
import lejos.nxt.LightSensor;
import lejos.nxt.SensorPort;

/**
 * 「トライボット」使用
 * 光センサーを調整する。このとき、光センサー調整クラスを使う。
 * 
 * @author marunomaruno
 * @version 1.0, 2010/03/15
 * @since 1.0
 */
public class LightSensor14 {
    public static void main(String[] args) throws Exception {
        // 光センサーオブジェクトをポート3で生成する。
        LightSensor lightSensor = new LightSensor(SensorPort.S3);

        // センサーが安定するまで少し待つ
        Thread.sleep(100);

        // 光センサーを調整する
        Calibrator01.calibrate(lightSensor);                    // (1)
        
        // 値を取得
        System.out.println(lightSensor.readNormalizedValue() + " " + 
                           lightSensor.readValue());

        // プログラムを終える
        System.out.println("Press Button to exit.");
        Button.waitForPress();
    }
}
---

□ Calibrator01.calibrate(lightSensor);                    // (1)

光センサを調整するユーティリティを使います。staticメソッドなので、クラス名.メソ
ッド名で呼び出します。

                                                                           以上




最新の画像もっと見る

コメントを投稿

サービス終了に伴い、10月1日にコメント投稿機能を終了させていただく予定です。