4.ロータリーエンコーダの使用 TOPへ 6.サウンドセンサの使用

5.超音波センサの使用


ここではNXTで新たに加えられた超音波センサについて学習します。 超音波センサは何かの物があるかを調べたり、その距離を測ることができ、ロボットの動きの幅が広がります。


1.超音波センサの取り付け

これまでのロボットを引き継ぎ、その前部に超音波センサを取り付けます。
ここでは、以下に記載されているものを用います。
sonar1.png(14875 byte)
【作り方】
sonar_01.png(6204 byte) sonar_02.png(7003 byte) sonar_03.png(8668 byte) sonar_04.png(9714 byte) sonar_05.png(9620 byte)

今回は超音波センサを入力ポート2に接続します。


2.障害物の手前で止まる

ここでは前方に置かれた障害物に衝突する前に停止するロボットのプログラムを作成します。
次のプログラムを作成してください。ここでは、sonar1.cとします。
sonar1.c
#include "nxtlib.h"

#define STRUCTURE 20

task main(){
	SetSensorSonar(S2);

	motor[motorB] = 100;
	motor[motorC] = 100;
	while(SensorValue(S2) > STRUCTURE){
		wait1Msec(1);
	}

	motor[motorB] = 0;
	motor[motorC] = 0;
}

今回新たに用いた関数について説明します。
SetSensorSonar(S2)
入力ポート2に超音波センサを設定します。
このAPIは nxtlib.h に記述されています。

超音波センサの場合は、SensorValue()によって得られる値はcm単位です。
従って、このプログラムでは前方の障害物までの距離が20cmになると停止します。 しかし、実際は超音波による測定に時間がかかるので、20cmより進んだところで停止します。


3.障害物に対して一定距離をとり続ける

応用として、前方に置かれた障害物に対し一定の距離をとり続けるロボットのプログラムを作成します。 プログラムの構造としては、先ほどのプログラムに回避動作を加えただけですので、理解しやすいと思います。
次のプログラムを作成してください。ここでは、sonar2.cとします。
sonar2.c
#include "nxtlib.h"

#define STRUCTURE 25
#define SPEED 50

task main(){
	SetSensorSonar(S2);

	nSyncedMotors = synchBC;
	nSyncedTurnRatio = 100;
	nMotorEncoder[motorB] = 0;

	while(true){
		motor[motorB] = SPEED;
		while(SensorValue(S2) > STRUCTURE){
			wait1Msec(1);
		}

		motor[motorB] = -1 * SPEED;
		while(SensorValue(S2) < (STRUCTURE + 10)){
			wait1Msec(1);
		}
	}
}

このプログラムでは前方の障害物までの距離が25cm以下になると後退を始めます。 そして、距離が35cm以上になるまで後退を続け、35cm以上になったら前進します。 比較的ゆっくりのスピードで動く障害物には対応できますが、 それ以上では超音波センサの測定に時間が掛かり対応できない可能性があります。


4.課題

前方にある障害物を超音波センサを用いて回避するプログラムを作成しなさい。 出来るならば、障害物の幅に関わらず回避できるように回避行動の前にいったんチェックするようなプログラムを作成しなさい。



4.ロータリーエンコーダの使用 TOPへ 6.サウンドセンサの使用