*目次 [#b84f380e]
#contents
*課題の確認 [#d9ec4096]
**黒い線に沿って動くロボット [#f319c09e]
''各チームで作成したコースを1周するロボットを製作せよ。交差点以外のコース上に350mlの空の空き缶を2個以上おき、&br;空き缶にぶつかった時には次のような動作するプログラムを作成せよ。(他のメンバーと重ならないように一人一つのプログラムを作成する)''

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

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

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

ただし、

・速さと正確さを追求すること&br;
・コースを1周したら自動的に止まること&br;
・交差点では一時停止すること&br;
*ロボット [#tcc3cf6b]
**ロボットの全体図 [#j967bb24]
こんな感じです。ほかのグループに比べるととてもシンプルですが、細かい部分で頑張ってます。
#ref(ライントレーサーロボ1.JPG,around)
#ref(ライントレーサーロボ2.JPG)
**工夫したところ [#tbfa01b3]
#ref(接触部.JPG,around)
&br;&br;&br;&br;&br;&br;
この赤く丸で囲った部分が、重要な働きをします。&br;
今回の課題で使用される缶が非常に軽いため、&br;
ただ教科書通りにアームを作って取り付けただけでは、&br;
缶とセンサーの接触面が広く、力が分散してしまい、&br;
缶とセンサーの接触面が広く、力が分散し、&br;
ずるずると缶を滑らせるだけになってしまい、センサーに反応してくれません。&br;
そこで、この出っ張りをつけることで、缶とセンサーの接触面積を減らし、&br;
力をこの出っ張りの先に集めることで、センサーに反応するようにしました。
&br;&br;&br;&br;&br;&br;&br;&br;&br;&br;
**苦労したところ [#vb618b56]
#ref(接合部.JPG,around)
&br;&br;&br;&br;&br;&br;&br;
当初の計画では、センサー部を後ろ、アーム部を前につけようとして、&br;
実際つけてやっていたが、センサーが線を感知しているにもかかわらず、&br;
なぜかラインをはみ出してロボがどこかへ行ってしまうので、かなり苦労しました。&br;
なぜかラインをはみ出してロボがどこかへ行ってしまうので、どうして良いかわかりませんでした。&br;
試行錯誤しているうちに、『センサーが後ろについているから、線を感知しても&br;
ロボが既に前に行っており、制御が間に合わないのではないか??』という&br;
考えに至り、実際に図の赤い丸で囲ったようにアーム部とセンサー部を&br;
前にとりつけたところ、ライン上を動くようになりました。&br;
この単純なことが意外に気づかず、かなり長い間悩み苦しみました。&br;
&br;&br;&br;&br;&br;&br;&br;
*コース [#x2c825c2]
*プログラム [#s5045e3d]
**としぞうのプログラム [#va95d00f]
課題の1のプログラムです。
 #define  turn_L OnFwd(OUT_C);OnRev(OUT_A);Wait(180);Off(OUT_A+OUT_C);   //左に回転
 #define  turn_R OnFwd(OUT_A);OnRev(OUT_C);Wait(180);Off(OUT_A+OUT_C);   //右に回転
 task main ()
 {
   SetSensor ( SENSOR_1, SENSOR_LIGHT );
   SetSensor ( SENSOR_2, SENSOR_TOUCH );
   SetSensor ( SENSOR_3, SENSOR_LIGHT );
   int flag=0;     //flag初期値を0に設定
   
   while(flag<8){   //交差点を8回通過
                  
         
       if ((SENSOR_1>40)&&(SENSOR_3>40))
           {
               OnFwd(OUT_A+OUT_C);    
           }        //センサー1とセンサー3が白のとき直進    
       if((SENSOR_1<40)&&(SENSOR_3>40))
           {    
               OnRev(OUT_A);
               OnFwd(OUT_C);        
           }    //センサー1が黒でセンサー3が白のとき左に回転
        if((SENSOR_1>40)&&(SENSOR_3<40))
           {
               OnRev(OUT_C);
               OnFwd(OUT_A);
           }    //センサー1が白でセンサー3が黒のとき右に回転
        if((SENSOR_1<40)&&(SENSOR_3<40))
           {
               Off(OUT_A+OUT_C);
               Wait(100);
               OnFwd(OUT_A+OUT_C);
               flag++;
           }    //両方のセンサーが黒のときflagに1を足して直進
           }    //両方のセンサーが黒のとき一時停止してflagに1を足して直進
        if (SENSOR_2==1)  //タッチセンサーに触れた場合
           {
                                         
               OnRev(OUT_A+OUT_C);Wait(10);Off(OUT_A+OUT_C);   //後ろに下がる
               turn_L;                                         //左に回転
               OnFwd(OUT_A+OUT_C);Wait(50);Off(OUT_A+OUT_C);  //缶を前に押す
               OnRev(OUT_A+OUT_C);Wait(100);Off(OUT_A+OUT_C);      //後ろに下がる
               turn_R;                                            //右に回転                         
           }         
   
 }
 Off(OUT_A+OUT_C);   //終了
 }

**マキロンのプログラム [#k7ad7ef6]
課題の2のプログラムです。
 #define a OnFwd(OUT_A);
 #define c OnFwd(OUT_C);
 #define b OnRev(OUT_A+OUT_C);
 sub linetrace(){//
	if (SENSOR_1<40) {Off(OUT_A);}else{a;}
	if (SENSOR_3<40) {Off(OUT_C);}else{c;}
	if ((SENSOR_1<40)&&(SENSOR_3<40)){a;c;}
	Wait(10);
 }
 task main (){
	SetSensor(SENSOR_1,SENSOR_LIGHT);
	SetSensor(SENSOR_2,SENSOR_TOUCH);
	SetSensor(SENSOR_3,SENSOR_LIGHT);
	ClearTimer(0);
 repeat(6) {
	while ((SENSOR_1>40)||(SENSOR_2==0)||(SENSOR_3>40)){
	linetrace();
	}
	while ((SENSOR_1>40)||(SENSOR_3>40)){
	linetrace();
	}
	Wait(160);b;a;Wait(200);b;c;Wait(200);b;Wait(20);a;c;
 }
	Off(OUT_A+OUT_C);
 }


*まとめ・反省 [#i025f22c]
**としぞう [#k7c9b373]
このロボを作る時期にちょうど中間試験ラッシュがあって、なかなか制作する時間が&br;
多くとれませんでした。(言い訳です、すみません)&br;
似顔絵プログラムに比べて、格段にプログラムも難しくなっており、&br;
自分の中でプログラムを理解するのに時間がかかりました。&br;
とりあえず出来上がって一安心というところです。
**マキロン [#aae9c931]
*コメント [#y69f2e2e]
コメントをどうぞ!
#comment


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS