4. 強制終
TOP
6.ローテーションセンサーの使用

5.光センサーの使用

タッチセンサーに引き続いて、ここでは付属している光センサーについて触れていきます。ライントレースロボットの作成には、このようなセンサーが不可欠です。光センサーはbrickOSによりAPIが提供されているので、その説明もしていきます。

1.センサーの取り付け

2.ライントレースロボットの作成

 光センサーでは光の量を測ることができます。付属の光センサーには発光ダイオード組み込まれているため、もので反射される光を利用することができます。このロボットをテストするために、RIS2.0付属のテストパッド(黒いラインが引いてある大きな紙)を用います。プログラムの考え方としては、ライトはいつも黒い線の上にあり、ラインから離れる(反射光が強くなる)と、方向を訂正するようなものとします。今回はロボットが時計回り(右回り)に前進するようにします。
次のプログラムを作成してください。ここでは作成ファイル名をirsensor1.cとします。
作成したプログラムirsensor1.c
#include <dmotor.h>
#include <dsensor.h>
#include <unistd.h>

#define LIGHTSENS       SENSOR_2
#define DARK_THRESH     0x21 // black line value
#define BRIGHT_THRESH   0x2b // white value

static wakeup_t dark_found(wakeup_t data) { // black line is found
	return LIGHT(LIGHTSENS)<(unsigned short)data;
}

static wakeup_t bright_found(wakeup_t data) {  // white is found
	return LIGHT(LIGHTSENS)>(unsigned short)data;
}

int main(int argc, char *argv[]) {
	ds_active(&LIGHTSENS);

	motor_a_speed(MAX_SPEED/3);
	motor_c_speed(MAX_SPEED/3);

	while(1){
		wait_event(bright_found,BRIGHT_THRESH); // white is found
		motor_a_dir(rev);
		motor_c_dir(fwd);
		cputw(LIGHT(LIGHTSENS));

		wait_event(dark_found,DARK_THRESH); // black line is found
		motor_a_dir(fwd);
		motor_c_dir(fwd);
		cputw(LIGHT(LIGHTSENS));
	}
	return 0;
}
タッチセンサーと同じく『dsensor.h』に光センサーのAPIが記述されています。光センサーの値は16bitですが、マクロにより約147段階に調整されているようです。値は暗いときに小さく、明るいときに大きくなります。このプログラムでは0x21以下を暗い(黒)、0x2b以上を明るい(白)として利用しています。また、ウェイクアップ関数として色が『黒⇒白』と『白⇒黒』の二つを定義しています。ここでは光センサー用のAPIを2つほど使っています。『ds_active(&LIGHTSENS)』は光センサー内蔵の発光ダイオードをONにしてその反射光を読み取る設定(アクティブモード)です。逆に周りの光の強さを読み取る設定(パッシブモード)にすることもできます。二つ目の『LIGHT(LIGHTSENS)』は引数に光センサーのセンサー番号を指定し、光の強さに応じた値を返す関数です。しかし、この値はその場の照明などにより左右されるのでこのままではうまくいかないかもしれません。RCX純正のファームウェアならば、Viewボタンを押すことにより各ポートの値を読み取れましたが、はじめにも書いたようにbrickOSは最小限の機能しかないのでそれができません。そこで、光センサーの値をLCDディスプレイに出力するプログラムをのせておきますので使用して下さい。光センサーはポート2に接続しました。
作成したプログラムircheck.c

3.課題

テストパッドの白黒の境界線に沿って、出来るだけ早く周回するプログラムを作成せよ。 ただし、強制終了を参考に Run ボタンを押したら、赤外線出力をOFF(passiveモード)にし、即座に停止するタスクを用意せよ。

4.まとめ

 この章では光センサーの使い方について学習しました。光センサーはライントレースの他にも色の判別や自作のロータリーエンコーダーなどさまざに応用できます。RIS2.0付属のマニュアルやCD−ROMに載っているロボットを作成し、プログラムをbrickOSで作成するなどして理解を深めて下さい。
4. 強制終了
TOP
6.ローテーションセンサーの使用