*目次 [#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;
**苦労したところ [#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;
*コース [#x2c825c2]
#ref(コース.JPG)
過去の先輩のコースを見て、自分たちもシンプルなコースにしました。
*プログラム [#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を足して直進
        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]
#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);
}
課題の2のプログラムです。
 #define  LINE  40          //閥値を40に定義
 
 int t;                       //変数tを定義
 int i;                       // 変数iを定義
 
 task main()
 {
 SetSensor(SENSOR_1,SENSOR_LIGHT);    //センサー1を光センサーとする
 SetSensor(SENSOR_2,SENSOR_TOUCH);    //センサー2をタッチセンサーとする
 SetSensor(SENSOR_3,SENSOR_LIGHT);        //センサー3を光センサーとする
 t=0;      //tの初期値を0と定義
 i=0;                     //iの初期値を0と定義
 while(t<8){                      //t<=8のとき行動
 if(SENSOR_2==1){        //タッチセンサーが押されたとき
 if(SENSOR_1>LINE){
 if(SENSOR_3>LINE){
 OnFwd(OUT_A+OUT_C);    //センサー1が白でセンサー3も白のとき直進
 }
 else{
 OnFwd(OUT_A);OnRev(OUT_C);    //センサー1が白でセンサー3が黒のとき左折
 }
 if(SENSOR_1<LINE){
 if(SENSOR_3>LINE){
 OnFwd(OUT_C);OnRev(OUT_A);    //センサー1が黒でセンサー3が白のとき右折
 }
 else{
 t++;       //センサー1が黒でセンサー3も黒のときtに1を足して
 if(i==0){
 OnFwd(OUT_A+OUT_C);
 Wait(30);
 i++;    //i=0のとき、一時停止して交差点を越え、iに1を足す
 }
 else{            //iが0でないとき 以下の動作で障害物をどけてから元に戻す
 OnFwd(OUT_A+OUT_C);    //直進
 Wait(100);
 OnFwd(OUT_A);OnRev(OUT_C);     //反転
 Wait(120);
 OnRev(OUT_A+OUT_C);    //後退
 Wait(120);
 OnFwd(OUT_A);OnRev(OUT_C);    //反転
 Wait(120);
 i=0;          //i=0を代入
 }}}}
 else{              //タッチセンサーが作動しないとき
 if(SENSOR_1>LINE){
 if(SENSOR_3>LINE){
 OnFwd(OUT_A+OUT_C);     //センサー1が白でセンサー3も白のとき直進
 }
 else{
 OnFwd(OUT_A);OnRev(OUT_C);     //センサー1が白でセンサー3が黒のとき左折
 }
 if(SENSOR_1<LINE){
 if(SENSOR_3>LINE){
 OnFwd(OUT_C);OnRev(OUT_A);    //センサー1が黒でセンサー3が白のとき右折
 }
 else{
 t++;
 OnFwd(OUT_A+OUT_C);     //センサー1が黒でセンサー3も黒のとき、tに1を足して直進
 Wait(30);
 }}}}
 Float(OUT_A+OUT_C);     //緩やかに停止
 }}} 


*まとめ・反省 [#i025f22c]
**としぞう [#k7c9b373]
このロボを作る時期にちょうど中間試験ラッシュがあって、なかなか制作する時間が&br;
多くとれませんでした。(言い訳です、すみません)&br;
似顔絵プログラムに比べて、格段にプログラムも難しくなっており、&br;
自分の中でプログラムを理解するのに時間がかかりました。&br;
とりあえず出来上がって一安心というところです。
**マキロン [#aae9c931]
ごっつ難しかった&br;
コースをかなり斬新なデザインにしようと思ったがあとのことを考えて簡単なコースにした。&br;
実際思ったよりサッカー日本代表は強かった。&br;
*コメント [#y69f2e2e]
コメントをどうぞ!
- 具体的に書かれていて良いと思います。コースに沿っての動きや缶との動作などの解説を入れるとさらに良くなると思います -- [[TAKA]] &new{2010-07-02 (金) 17:38:00};
- 書くべきことをきちんと書いていると思います。あとは、ライントレースの原理を説明したり、図や写真をもっと使って工夫した点や考察を明らかにすると、もっと良くなります。プログラムでほとんど重複している部分があるので、もっとコンパクトにできたかもしれません -- [[FI]] &new{2010-07-12 (月) 17:44:21};

#comment


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