2009a/A1/課題1左

目次

ライントレースロボットを作ろう

条件は下の3つのどれかを満たせて線の上を走るロボット
1交差点上に牛乳パックを置き、それを迂回する。
2パックを動かして元の位置に戻す。
3パックを次の交差点まで運ぶ。

コース

コースはデザイン重視で作ったため交差同士の距離が近かったり、コースの感覚が近かったりと難易度があがってしまいました。

コースとしての面白みは無い気もするけど後戻りができないのでコレに決定!

course.jpg

ロボット

body.jpg

本体やタイヤなどの基本パーツは教科書通りの物を使用。

タッチセンサーの部分は重さと力のモーメントを利用するために、上から長めになるように作成。

下の突起物二つはパックを中心で捉えられるように設置。

パックを動かす部分の棒の先端にタイヤを装着することによってパックが離れないように。 front.jpeg

プログラミング

迂回バージョン(だる))

e.jpg

#define turnR OnFwd(c);OnRev(a);Wait(105);Off(a+c);   :右に90度方向転換 
#define turnL OnFwd(a);OnRev(c);Wait(83);Off(a+c);  :左に90度方向転換 
#define a OUT_A 
#define c OUT_C
#define THRESHOLD 45   :明るさが45以下の時に反応
task main(){
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_2,SENSOR_TOUCH);
SetSensor(SENSOR_3,SENSOR_LIGHT);
int x; x=0;
while(true)
{if(SENSOR_2==1)   ;タッチセンサーが反応した時にパックを迂回
{OnRev(a+c);Wait(10);
 turnL;
 OnFwd(a+c);Wait(120);
 turnR;
OnFwd(a+c);Wait(250);
OnFwd(c);OnRev(a);Wait(120);Off(a+c);;
OnFwd(a+c);Wait(150);
Off(a+c) ;}
if (SENSOR_1>THRESHOLD){   左右の光センサーが白を探知しているときに前進
if (SENSOR_3>THRESHOLD){
OnFwd(a+c);}

else{   :左の光センサーが白、右のセンサーが黒を探知したときに少し右に回転
OnFwd(a);
Wait(5);
Off(a);OnRev(c);Wait(1);Off(c);}}

else{
if(SENSOR_3>THRESHOLD){OnFwd(c);Wait(5);Off(c);OnRev(a);Wait(1);Off(a);}   :左センサーが黒、右のセンサー      が白を探知したときに少し左に回転 

else{OnFwd(a+c);Wait(10);Off(a+c);x = x + 1;}}   :左右のセンサーが黒を探知したときに少しすすんでカウント数を1プラス

if(x >= 6)   :カウントが6回(コースを1週)になった時に停止
break;}}

パックをその場で動かして元の位置に戻して進むバージョン(わかば)

#define a OUT_A
#define c OUT_C
#define THRESHOLD 45   :明るさが45以下の時に反応
task main()
{
	SetSensor(SENSOR_1,SENSOR_LIGHT);
	SetSensor(SENSOR_2,SENSOR_TOUCH);
	SetSensor(SENSOR_3,SENSOR_LIGHT);
	int x;
	x=0;   :カウンター
	 while(true){
		
 		 if(SENSOR_2==1){   :タッチセンサーが反応したとき
		OnFwd(a+c);Wait(120);Off(a+c);      :回転したときパックが元の位置に戻るように前進
		OnFwd(c);OnRev(a);Wait(200);Off(a+c);   :180°回転
		OnFwd(a);OnRev(c);Wait(100);Off(a+c);}  :元の向きに回転
               
		if (SENSOR_1>THRESHOLD){    :左が白のとき
			
                       if (SENSOR_3>THRESHOLD){     :両方白のとき  
				OnFwd(a+c);}
											
			else{                       :右が黒のとき、右に曲がる
				OnFwd(a);
				Wait(7);
				Off(a);
				OnRev(c);
				Wait(1);
				Off(c);
			}
		}
		else{        :左が黒のとき
	
			if(SENSOR_3>THRESHOLD){  :右が白のとき、左に曲がる     
				OnFwd(c);
				Wait(7);
				Off(c);
				OnRev(a);
				Wait(1);
				Off(a);
				}
				
			else{   :交差点の上
				OnFwd(a+c);
				Wait(10);
				Off(a+c);
				 
				x = x + 1;   :交差点ごとにカウント
				}
		}           
	if(x >= 6)break;     :カウントが一周分すると終了			
	}	
}	

まとめ

・だる なんと言ってもコースの難易度がやたらと高った。 ロボットは感度が悪いようでパックに反応してくれなかったけど、テコの原理を使ったらなんとか反応してくれました。

・わかば う〜んコースがあり得ない、失敗しました。 ロボットも感度が悪く反応も鈍かったですけどパックを元の位置に戻す動きが成功したとき感動しました。

*コメントください*

  • 終了の条件を、if(x == 6)にしてしまうと、なんらかの原因でxが6をとばして7になってしまったとき、永遠に終わらないプログラムになってしまいますので、(x >= 6)の方が良いと思います。迂回バージョンの方にはインデント(見やすくするための字下げ)が欲しいところ。あと、どのプログラムを誰が作成したのかもかいてください。 -- こさか? 2009-07-17 (金) 04:10:13
  • プログラムの内容には問題ありませんが、可読性が低いです。インデントは、if文などで{カッコ}に入っている内容がどこまでかを解りやすくするために入れますので、同じカッコに入っている内容の文が同じインデントで始まるように、通常半角4文字程度のスペースを入れます。また、始まりの{と終わりの}が同じインデントになるようにします。 -- こさか? 2009-07-23 (木) 22:47:16
  • 追記:半角4文字のスペースというのは、大体の場合tab文字1文字分のことです。 -- こさか? 2009-07-23 (木) 22:48:49
  • コンパクトにまとめられていると思います。180°回転するときとそこから逆回転してまた戻るときに秒数が違うのは何故でしょうか? -- FI? 2009-07-26 (日) 20:22:59

コメント欄がなかったので直接書き込みます。ifでセンサーの反応を判別しているところを、センサーが白か黒か(もしくは触っていないか触っているか)について、「無反応なら0を、反応なら1を返す関数」にしてみると、もっとスリム化できるかもしれません。(こさか)


添付ファイル: filefront.jpeg 224件 [詳細] filee.jpg 44件 [詳細] filebody.jpg 227件 [詳細] filecourse.jpg 248件 [詳細] filecourse 137件 [詳細] filefront 137件 [詳細] filebody 139件 [詳細] file20090626134830-2.jpg 144件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-07-26 (日) 20:22:59