担当:リンゴスター( ̄▽ ̄)&SEGA(>З<)

☆目次

ぼくらのマシン。

これがぼくらのマシンです。

今回のマシーンはローヴァーボットのドライブベースとダブルバンパーを使い、マシーン製作の時間を大幅に短縮しました。

光センサーは非常に簡単に取り付け、複雑な構造には一切しませんでした。

授業中に、黒い線に沿って動くロボットのプログラムは完成していたので、タッチセンサーを含めたプログラムを考えるだけと比較的簡単にできました。

前回同様、本体の上には操縦士:メカ崎くんが搭乗しています。

ではそのプログラムを見てください。



プログラム1 「接触したら反転」(by SEGA) を書きたい

task main()
{
 SetSensor(SENSOR_1,SENSOR_LIGHT);    
 SetSensor(SENSOR_2,SENSOR_TOUCH);
 SetSensor(SENSOR_3,SENSOR_LIGHT);
 OnFwd(OUT_A+OUT_C);            //前進
 while(true){               //{}の中のことが起きたらその都度繰り返す
 if(SENSOR_1 < 40){            //もしセンサー1(線の左側にある光センサー)が黒線上にいるならば…
 OnFwd(OUT_C);              //右タイヤ前回転
 repeat(3){
 OnRev(OUT_A);              //左タイヤ後回転を
 Wait(5);                  5/100秒という短い時間で動かすことを繰り返すことで細かな曲がりを実現
 Off(OUT_A);
    }
 }
 if
 (SENSOR_3 < 40){             //もしセンサー3(線の右側にある光センサー)が黒線上にいるならば…
 OnFwd(OUT_A);              //左タイヤ前回転              
 repeat(3){
 OnRev(OUT_C);              //右タイヤ後回転 
 Wait(5);
 Off(OUT_C);
 }
 }
 if(SENSOR_2 == 1){            //センサー2(タッチセンサー)がモノに接触したら…
 OnRev(OUT_A+OUT_C);           //ちょっと下がる
 Wait(50);
 Off(OUT_A+OUT_C);
 OnFwd(OUT_A);              //180°回転
 OnRev(OUT_C);
 Wait(230);                
 Off(OUT_A+OUT_C);
 OnRev(OUT_A+OUT_C);           //ちょっと下がる(もしカーブで回転してすぐ前進すると線から外れた状態になることがあるから)
 Wait(50);
 Off(OUT_A+OUT_C);
 }
 else{
 OnFwd(OUT_A+OUT_C);           //while内の上記のことが発生しなければ前進
 }
 }}

プログラム2 「接触したら右側を追い越す」(by SEGA) を書きたい

task main()
{
 SetSensor(SENSOR_1,SENSOR_LIGHT);
 SetSensor(SENSOR_2,SENSOR_TOUCH);
 SetSensor(SENSOR_3,SENSOR_LIGHT);
 OnFwd(OUT_A+OUT_C);           
 while(true){
 if(SENSOR_1 < 40){
 OnFwd(OUT_C);
 repeat(3){
 OnRev(OUT_A);
 Wait(5);
 Off(OUT_A);
    }
 }
 if
 (SENSOR_3 < 40){
 OnFwd(OUT_A);
 repeat(3){
 OnRev(OUT_C);
 Wait(5);
 Off(OUT_C);               //ここまでプログラム1と同じ
 }
 }
 if(SENSOR_2 == 1){            //もしタッチセンサーがモノに接触したら…
 OnRev(OUT_A+OUT_C);           //ちょっと下がる
 Wait(50);
 Off(OUT_A+OUT_C);
 OnFwd(OUT_A);              //その場で90°回転(右を向いた)
 OnRev(OUT_C);
 Wait(100);
 OnFwd(OUT_A+OUT_C);           //前進
 Wait(150);
 OnFwd(OUT_C);              //90°回転(前を向いた)
 OnRev(OUT_A);
 Wait(100);
 OnFwd(OUT_A+OUT_C);           //前進(モノの右側を通っていく)
 Wait(200);
 OnFwd(OUT_C);              //90°回転(左を向いた)
 OnRev(OUT_A);               
 Wait(100);
 OnFwd(OUT_A+OUT_C);            //前進(線に再び乗る)
 Wait(150);
 OnFwd(OUT_A);               //90°回転(前を向いた)回避終了。
 OnRev(OUT_C);
 Wait(100);
 Off(OUT_A+OUT_C); 
 }
 else{
 OnFwd(OUT_A+OUT_C);             
 }
 }}

プログラム3 「接触したら反転」(by リンゴスター) を書きたい

task main()
{
	SetSensor(SENSOR_1,SENSOR_LIGHT);
	SetSensor(SENSOR_3,SENSOR_LIGHT);
	SetSensor(SENSOR_2,SENSOR_TOUCH);    //センサー類を定義
	
	OnFwd(OUT_A+OUT_C);          //前進
	while(true)
	{
		if(SENSOR_3 < 40)      //もしセンサ−3(右側)が黒線の上に来たら
		{
			OnFwd(OUT_A);
			Off(OUT_C);	
			OnRev(OUT_C);        //右に修正
			Wait(5);	   //Waitを使うことで多少滑らかに
		}
		
		if(SENSOR_1 < 40)            //もしセンサー1(左側)が黒線の上に来たら
		{
			OnFwd(OUT_C);
			Off(OUT_A);
			OnRev(OUT_A);	   //左に修正	
			Wait(5);	
		}
		
		if(SENSOR_2 == 1)      //もしセンサー2が障害物に当たったら
		{
			OnRev(OUT_A+OUT_C);
			Wait(50);            //後ろに下がる
			OnFwd(OUT_A);
			Wait(100);
			OnRev(OUT_C);
			Wait(100);      //反転
			OnRev(OUT_A+OUT_C);
			Wait(50);      //後ろに下がる(最初に下がった際の誤差をなくすため)
		}
		
		else
		{
		OnFwd(OUT_A+OUT_C);
		}
		
	}
}

プログラム4 「接触したら右側を追い越す」(by リンゴスター) を書きたい

task main()
{
	SetSensor(SENSOR_1,SENSOR_LIGHT);
	SetSensor(SENSOR_3,SENSOR_LIGHT);
	SetSensor(SENSOR_2,SENSOR_TOUCH);
	
	OnFwd(OUT_A+OUT_C);
	while(true)
	{
		if(SENSOR_3 < 40)
		{
			OnFwd(OUT_A);
			Off(OUT_C);	
			OnRev(OUT_C);
			Wait(5);	
		}
		
		if(SENSOR_1 < 40)
		{
			OnFwd(OUT_C);
			Off(OUT_A);
			OnRev(OUT_A);		
			Wait(5);	
		}              //ここまではプログラム3と同じ
		
		if(SENSOR_2 == 1)      //センサ−2に障害物が当たったら(仮に進行方向を↑とする)
		{
			OnRev(OUT_A+OUT_C); 
			Wait(20);      //後ろに下がる
			OnFwd(OUT_A);
			Wait(50);
			OnRev(OUT_C);
			Wait(50);      //右に90度回転(→を向く)
			OnFwd(OUT_A+OUT_C);
			Wait(100);      //移動(→)
			OnFwd(OUT_C);
			Wait(100);
			OnRev(OUT_A);
			Wait(100);      //左に90度回転(↑を向く)
			OnFwd(OUT_A+OUT_C);
			Wait(150);      //障害物を追い越し中(↑)
			OnFwd(OUT_C);
			Wait(100);
			OnRev(OUT_A);
			Wait(100);      //左に90度回転(←を向く)
			OnFwd(OUT_A+OUT_C);
			Wait(100);      //移動(←)
			OnFwd(OUT_A);
			Wait(100);
			OnRev(OUT_C);
			Wait(100);      //右に90度回転(↑を向く)
		}
		
		else
		{
		OnFwd(OUT_A+OUT_C);
		}
		
	}
}

工夫と課題と反省と

コメントをどうぞ!



トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-02-16 (金) 22:48:45