2.モータ制御(2)
TOP
4.強制終了

3.タッチセンサーの使用

MINDSTORMSの大きな特徴にセンサーが使用できることがあります。しかも、センサーでロボットの制御ができます。センサーの種類はタッチセンサー、光センサーが付属していますがそのほか追加パーツとして温度センサー、角度センサーなどがあります。ここでは付属しているタッチセンサーについて触れていきます。

1.センサーの取り付け

2.センサー入力を待つ

 まず、障害物にあたるまで前進する簡単なロボットを作成しましょう。
次のプログラムを作成してください。ここでは作成ファイル名をtssensor1.cとします。
作成したプログラムtssensor1.c
#include <dmotor.h>
#include <dsensor.h>
#include <unistd.h> // wakeup function is included

wakeup_t sensor_press_wakeup(wakeup_t data); // wakeup_function

int main(int argc, char *argv[]){

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

	motor_a_dir(fwd);
	motor_c_dir(fwd);

	wait_event(&sensor_press_wakeup,0);
	
	motor_a_dir(brake);
	motor_c_dir(brake);

	return 0;
}

wakeup_t sensor_press_wakeup(wakeup_t data) {
	return SENSOR_1<0xf000;
} 
『dsensor.h』でポート番号を指定することができます。今はタッチセンサがポート1に接続されていますが、ポート2はSENSOR_2で、ポート3はSENSOR_3で指定できます。タッチセンサー用の関数はbrickOSでは特に提供されていません。センサの状態はマクロで直接16bitの値として取得します。値はセンサーONのときに小さく、センサーOFFのときに大きくなります。このプログラムでは0xf000以下をセンサーON(接触)として利用しています。
センサーが反応するまで待機する関数として『wait_event()』が使われています。まず、別途にウェイクアップ関数(ここでは『wakeup_t sensor_press_wakeup(wakeup_t data)』がそれにあたる)を定義しておきます。このwait_event関数が呼ばれたとき、処理がウェイクアップ関数に渡り、ウェイクアップ関数が正常終了する(戻り値が正の値となる)までループさせ、正常終了したときに処理を戻すという動作をします。ここでは条件『SENSOR_1<0xf000』(つまり、タッチセンサーがON)が真のとき、正常終了ということになります。詳しいことは後でタスクの項で説明します。
wakeup_t 型は、unsigned long に指定されています。条件文が真のときの戻り値は 1 ですので、上記の sensor_press_wakeup の戻り値は 1 になります。

3.ロボットが障害物を避ける

 障害物にぶつかったときロボットが後退・方向転換をしてから前進するようにプログラムを改良しましょう。
次のプログラムを作成してください。ここでは作成ファイル名をtssensor2.cとします。
作成したプログラムtssensor2.c
#include <dmotor.h>
#include <dsensor.h>
#include <unistd.h>

wakeup_t sensor_press_wakeup(wakeup_t data);

int main(int argc, char *argv[]){

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

	while(1){
		motor_a_dir(fwd);
		motor_c_dir(fwd);

		wait_event(&sensor_press_wakeup,0);

		motor_a_dir(rev); // reverse
		motor_c_dir(rev);
		msleep(700);

		motor_a_dir(fwd); // turn right
		motor_c_dir(rev);
		msleep(700);
	}

	return 0;
}

wakeup_t sensor_press_wakeup(wakeup_t data) {
	return SENSOR_1<0xf000;
} 

4.課題

 タッチセンサーを2個使ってバンパーをつくり、反応したセンサーによって曲がる方向を変えるようなプログラムを組んでみましょう。ここではバンパーはマニュアル記載のダブルバンパー(p30-33)を使用し、タッチセンサーはポート1、3に接続します。

ダブルバンパーでどちらのセンサーに反応したかを区別するには、wakeup 関数を次のように記述することで、戻り値で区別させることができます。
wakeup_t sensor_press_wakeup(wakeup_t data) {
	int a=0;
	if(SENSOR_1<0xf000){a=1;}
	if(SENSOR_3<0xf000){a=3;}
	retrun a;
}

5.まとめ

 この章ではタッチセンサーの使い方について学習しました。タッチセンサーはセンサーの中でも一番使用頻度が高いものだと思います。ここまで学習したことを駆使すればかなりいろいろなものが作れると思います。
2.モータの制御(2)
TOP
4.強制終了