1.モータの制御(1)
TOP
3.タッチセンサーの使用

2.モータの制御(2)

最初に作成したプログラムは簡単でした。これを改良しながら、brickOSのプログラミングに慣れていきましょう。

1.ロボットが曲がる

ロボットを正方形に動かしてみましょう。正方形を描くためにはロボットは前進・右折・の繰り返しをしなければなりません。これにはfor文が最適です。また90度曲がるためには何秒間モーターを回すかが問題となります。こんなとき有用なのがマクロです。
次のプログラムを作成してください。ここでは作成ファイル名をsecond_program1.cとします。
作成したプログラムsecond_program1.c
/*****************************/
/* Square Program            */
/*                           */
/* programed by Yuki Akahori */
/*       Ver 1.0  2002 11 13 */
/*****************************/

#include <dmotor.h>
#include <unistd.h> // sleep() is included

#define MOVE_TIME 1000 // Time for a straight move
#define TURN_TIME 1450 // Time for turning 90 degrees

int main(int argc, char *argv[]) {
	int count;
	motor_a_speed(MAX_SPEED);
	motor_c_speed(MAX_SPEED);

	for(count=0;count<4;count++){ // repeats 4 times
		motor_a_dir(fwd);
		motor_c_dir(fwd);
		msleep(MOVE_TIME);

		motor_c_dir(rev);
		msleep(TURN_TIME);

		motor_a_dir(brake);
		motor_c_dir(brake);
	}
	return 0;
}
床の素材や電池の消耗、構造などにより、おそらく90度の回転しないと思います。このmsleep関数内の定数を変えるのではなく、定数をプログラムの先頭に定義しておいて、その定義を変えるのが一般的です。このようなマクロの使用やコメントの使用などでプログラムはずっと見やすく、判り易くなります。

2.ロボットがランダムに動く

ロボットをランダムに動かしてみましょう。前進・後退・左折・右折をランダムに行うようにプログラムを組んでみましょう。これにはrandom文が最適です。条件を判別するにはif文を使えばよいでしょう。
次のプログラムを作成してください。ここでは作成ファイル名をsecond_program2.cとします。
作成したプログラムsecond_program2.c
#include <stdlib.h> // random() is included
#include <dmotor.h>
#include <unistd.h> // sleep() is included

#define MOVE_TIME 1000 
#define TURN_TIME 1450 

int main(int argc, char *argv[]) {
	int flag;
	motor_a_speed(MAX_SPEED);
	motor_c_speed(MAX_SPEED);

	while(1){
		srandom(random()); // initialize
		flag=random()%4;

		if(flag==0){
			motor_a_dir(fwd);
			motor_c_dir(fwd);
			msleep(MOVE_TIME);
		}
		else if(flag==1){
			motor_a_dir(fwd);
			motor_c_dir(rev);
			msleep(TURN_TIME);
		}
		else if(flag==2){
			motor_a_dir(rev);
			motor_c_dir(fwd);
			msleep(TURN_TIME);
		}
		else{
			motor_a_dir(rev);
			motor_c_dir(rev);
			msleep(MOVE_TIME);
		}
	}
	return 0;
}
gccではランダム数値を発生させる関数としてrand()がありましたが、brickOSではほぼ同等の役割をするrandom関数が提供されています。それはstdlib.hに定義されていますがgccで参照されるファイルとは別物です。brickOSフォルダ直下のincludeフォルダ内にあるのがそうです。rand()は呼び出すたびに値が変化しますがrandom()はsrandom()の引数(乱種といいます)を変化させてやらなければ値が変化しません。なので少々扱いが異なります。

3.まとめ

 この章ではbrickOSのプログラムを改良しました。C言語の経験があれば容易に理解できたと思います。しかし、C言語で標準に提供されていたAPIとは異なる部分があるのでbrcikOSのAPIについては後で詳しく解説します。

4.課題

 MOVE_TIME と TURN_TIME を調整して、50cmの正方形を描いて走行するようにせよ。
1.モータの制御(1)
TOP
3.タッチセンサーの使用