2010a 目次

課題2:黒い線に沿って動くロボット

各チームで作成したコースを1周するロボットを製作せよ。交差点以外のコース上に350mlの空の空き缶を2個以上おき、空き缶にぶつかった時には次のような動作するプログラムを作成せよ。(他のメンバーと重ならないように一人一つのプログラムを作成する)

1.空き缶をコース上に戻して再びコースに戻って進む

2.空き缶を次の交差点まで運んで行き、その交差点に空き缶を残してさらにコースに沿って進む

3.奇数回目に空き缶に遭遇したら、その場で反転して進み、偶数回目に遭遇したら、空き缶を押しのけて進む ただし、

•速さと正確さを追求すること

•コースを1周したら自動的に止まること

•交差点では一時停止すること

メンバー

舩山 蔵

鎌倉 竜馬

目標

・より安定なロボットを制作する。

・確実に読み取れるロボットを作る。

コース

コース.jpg

・コースはシンプルかつ単純すぎないやつにした。

・紙ぎりぎりに書いてしまったために、ロボットがはみ出してしまい、読みとってくれないときがあって大変だった。

ロボットの説明

本体

・一回目の失敗 この構造では、タッチセンサーに当たらないので失敗。

sippai3.jpg
全体上失敗2.jpg

・二回目の本体もいまいちうまくいかず失敗。タッチセンサーもアームも失敗であった。

本体失敗横.jpg

・これでもだめだった。アームが上の位置にありすぎた。しかし、↓のアーム三回目で成功

アーム

アーム失敗1.jpg

・一回目のアーム↑と二回目のアーム↓どちらもうまく空き缶を運べなかった。幅が狭かったせいかもしれない。

アーム上失敗2.jpg

      ↓三回目

アーム.jpg

・これでやっと空き缶をとってくれる。掴まなくてもちゃんと運んでくれた。

光・タッチセンサー

光センサー.jpg

・光センサーはここにつけることですぐに成功した。だが二つのセンサーで読み取る値が違うので上下にずらした。

タッチセンサー失敗.jpg

・一つのセンサーが壊れていたため一つで挑戦したが、反応せず・・・

タッチセンサー.jpg

・シングルバンパーだとうまく、反応してくれたが、さらにゴムで補助。

工夫した点

・アームを作る際、車体から大きく外れてアームが飛び出るため強度が小さくなってしまうのでブロックを車体全体で組みバランスをとった。

・タッチセンサーを反応しやすく、ゴムで固定した。

収納.jpg

・壊れていて長いのを使ったがこれにより邪魔にならない。

問題点

・光センサーを二つ使用してライントレースを試みたのだが二つのセンサーで光の感度が異なっていたことである。

・「一回目の失敗」であるようにタッチセンターに空き缶があたらず感知できないという問題が発生。

・直線を進む場合は比較的に想像通りに進むが、カーブでコースアウトする。

・うまく缶を運んでくれない。

問題点から工夫した点

・センサーの高さを揃えずに白い所で同じ値になるような高さに設置した。

・タッチセンサーの位置を前にだして缶に当たるようにした。

・カーブのところでコースアウトしないように、光センサーの値を調節した。

・アームのところを太くしたりして、缶に接触する面積を広くしたことで安定して缶を運ぶことに成功した。

舩山 蔵のプログラム

             //1.空き缶をコース上に戻して再びコースに戻って進む//
#define a OUT_A
#define c OUT_C
#define THRESHOLD 38//光センサーの値
task main()
{
	SetSensor(SENSOR_1,SENSOR_LIGHT);//センサー1を光センサー左とする
	SetSensor(SENSOR_2,SENSOR_TOUCH);//センサー2をタッチセンサーとする
	SetSensor(SENSOR_3,SENSOR_LIGHT);//センサー3を光センサー右とする
	int x;変数x
	x=0;初期値0とおく
	 while(true){
		
		 if(SENSOR_2==1){      //タッチセンサーが反応した時
	OnFwd(c);OnRev(a);Wait(250);OnRev(a+c);Wait(200);Off(a+c);//空き缶をとり、反転して元の位置に戻す
	OnFwd(a);OnRev(c);Wait(150);Off(a+c);}   //その後コース上に戻る
	if (SENSOR_1>THRESHOLD){            //光センサー左が白の位置にある時
			
              if (SENSOR_3>THRESHOLD){       //両方のセンサーが白の位置にある時
				OnFwd(a+c);}  //直進
											
		else{        //右が黒の位置にある時、右に曲がる
				OnFwd(a);
				Wait(7);
				Off(a);
				OnRev(c);
				Wait(2);
				Off(c);
			}
           }
		else{           //左が黒の位置にある時
	if(SENSOR_3>THRESHOLD){  //右が白の位置にある時、左にまがる
				OnFwd(c);
				Wait(7);
				Off(c);
				OnRev(a);
				Wait(2);
				Off(a);
				}
	
			else{      //交差点上の時    
  		Off(a+c);Wait(40);    //一時停止
		
				OnFwd(a+c);   //前進
				Wait(10);
				Off(a+c);
				x = x + 1;  //交差点ごとにカウント
				}
	
	if(x >= 12)break;    //カウントが一周分すると終了
	}
}
}

・今回の課題のプログラムを制作するのは大変だった。何回も光センサーの値を変え、これに至った。

鎌倉 竜馬のプログラム

task main()
{
 SetSensor(SENSOR_1,SENSOR_LIGHT);      //1のセンサーに光センサーを定義
 SetSensor(SENSOR_3,SENSOR_LIGHT);   //2のセンサーにタッチセンサーを定義
 SetSensor(SENSOR_2,SENSOR_TOUCH);   //3のセンサーに光センサーを定義
ClearTimer(0);
int cx;                                 //intについては別途記します
while(Timer(0)<=950)
{                     //ライントレース開始!
if(SENSOR_1 < 40){OnFwd(OUT_C);OnRev(OUT_A);Wait(4); }          //光センサー1が40より小さい値をとると左のタイヤをリバースして左に進路を修正    
else if(SENSOR_3 < 40){     OnFwd(OUT_A);OnRev(OUT_C);Wait(4); }                                         //光センサー2が40より小さい値をとると右のタイヤをリバースさせて右に進路を修正
if((SENSOR_1 < 40) && (SENSOR_3 < 40)){Off(OUT_A+OUT_C); Wait(200);                      //両方のセンサーが40より小さい値を同時にとると交差点に差し掛かったので2秒一時停止
OnFwd(OUT_A+OUT_C);Wait(50);cx=cx+1;}       

else{ OnFwd(OUT_A+OUT_C); Wait(4);}  方向修正が必要ないとき、光センサーがラインを割ってないときは直進

ここより空きかんを使った課題

if(SENSOR_2==1){    Off(OUT_A+OUT_C);  Wait(90);  //タッチセンサーで空き缶を感知したら一時停止をして   
if(SENSOR_1 < 40){OnFwd(OUT_C);OnRev(OUT_A);Wait(4); }
else if(SENSOR_3 < 40){     OnFwd(OUT_A);OnRev(OUT_C);Wait(4); }      //空き缶を運びつつライントレース
if((SENSOR_1 < 40) && (SENSOR_3 < 40)){OnFwd(OUT_A+OUT_C);Wait(150);      //交差点を感知したら反転したときに空き缶が交差点に来るように前進
Off(OUT_A+OUT_C);  Wait(100);   //一旦停止
OnFwd(OUT_A);OnRev(OUT_C);Wait(170);   //反時計回りに180°
OnRev(OUT_A+OUT_C);Wait(150);      //バックして缶を置く
OnFwd(OUT_A);OnRev(OUT_C);Wait(170);  // 向きを直して
OnFwd(OUT_A+OUT_C);Wait(10);}    
}                 //ライントレース再開
}if int cx=6{Off(OUT_A+OUT_C);}}

プログラム中にint cx と出てきましたがこれについて説明します。 交差点に差し掛かると、カウントと数えるようにします。これは一周して止まるためです。どういうことかというと、一周するには6回交差点をまたぎます。そこで六回目に止まらせるためにint でカウントをして6になったら停止するようにした。

                   

まとめ

鎌倉のまとめ

・「if」、「else」をつかったプログラムはなかなか慣れずに思うような動きをするプログラムが組めなかった。

舩山のまとめ

・ライントレースを最初うまくできずに苦戦したが、試行錯誤の上なからプログラムができた。

・アーム、タッチ、光の構造や配置などに苦労したが、二人で意見を出し合って完成できた。

・一回目の課題とはかなりの違いで難しかった。だけど、やっとロボットをやっている感じがして面白かった。

・難しいからこそのできた時の喜びが大きかった。

全体のまとめ

・タッチセンサーを三種類考えた。鎌倉が二つ。舩山一つ。鎌倉のは二つとも缶を感知しなかったり、接触しなかったりと最終的に舩山の案を採用した。

コメントをどうぞ

  • 失敗からの改善点、写真への解説などを入れるとよいと思います(光センサーの位置など) -- TAKA? 2010-07-09 (金) 17:10:31
  • 全体的に詳しくしてください。例えば、ロボットの説明はもちろん、ライントレースの原理やバンパーの仕組み等いろいろ考えられると思います。
    また、2人目のプログラムでは、場合わけがうまくいっていない気がします。
    左右が両方とも40以下のときに、9、11行目両方に反応してしまうのではないでしょうか?そういう設計のロボットなら問題ないですが。
    これはifを2つ並べているため、上のifで判定が終わった後に、下のifでも判定が行われているからです。そして、上下の条件に重複があるため、上と下の両方で命令が実行されてしまうのではないでしょうか?
    これを解消するには、(1)ifとelsifを続ける(最初に合致した条件の命令のみが実行され、以降では実行されない。ただし、条件を並べる順に注意)(2)ifの条件内でさらに場合わけする等が考えられます。
    また、最後の行の変数のintは不要ですし、時間と交差点の数のどちらでとめるつもりか書いてください-- FI? 2010-07-16 (金) 17:19:46

 


添付ファイル: file2010070216080000.jpg 66件 [詳細] file2010070216090000.jpg 73件 [詳細] file分解.jpg 87件 [詳細] file収納.jpg 149件 [詳細] file正面.jpg 86件 [詳細] fileアーム.jpg 129件 [詳細] fileタッチセンサー.jpg 202件 [詳細] file本体失敗横.jpg 146件 [詳細] file光センサー.jpg 158件 [詳細] fileタッチセンサー失敗.jpg 147件 [詳細] fileアーム上失敗2.jpg 139件 [詳細] file全体上失敗2.jpg 161件 [詳細] file全体正面失敗2.jpg 86件 [詳細] file全体横失敗2.jpg 79件 [詳細] fileコース.jpg 148件 [詳細] fileアーム失敗1.jpg 165件 [詳細] filearm.jpg 76件 [詳細] filearm2.jpg 105件 [詳細] filearm3.jpg 87件 [詳細] filesippai3.jpg 166件 [詳細] filetouch.jpg 76件 [詳細] fileyoko.jpg 84件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-07-16 (金) 17:40:31 (3324d)