#contents
*課題2:黒い線に沿って動くロボット [#h67938aa]

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

   1. 空き缶をコース上に戻して再びコースに戻って進む
   2. 空き缶を次の交差点まで運んで行き、その交差点に空き缶を残してさらにコースに沿って進む
   3. 奇数回目に空き缶に遭遇したら、その場で反転して進み、偶数回目に遭遇したら、空き缶を押しのけて進む
*メンバー [#ed57a102]

・馬場将寿

・小笠原和貴
*コース [#rd30c042]
あまり複雑ではありません。
#ref(./100621_1650~01.jpg,100%,コース);
*ロボットの説明 [#t2343907]
土台に光センサー、タッチセンサー、アームをつけました。
光センサーは土台にのすぐ近くにつけ、安定させました。
#ref(./100621_1725~02.jpg,100%,光センサー);
タッチセンサーはダブルバンパーにしました。
#ref(./100621_1725~01.jpg,100%,タッチセンサー);
アームは缶をしっかり持てるようにし、シンプルに仕上げました。
#ref(./100621_1724~02.jpg,100%,アーム);
**問題点 [#w004bf99]
アームが不安定で、すぐに車体からとれてしまった。
またアームが開くときに歯車がすぐに外れてしまった。
車体の重心が前に傾いてしまう。
**問題点に対して工夫した点 [#o88bed4f]
アームがとれないように取れないようにブロックで固め、補強をした。
歯車の数を増やし、回転数を落とし、かみ合うようにした。
車輪を車体の後ろに取り付けることで重心の位置を後ろにし、傾かないようにした。
車輪を"重り”として使用したのがポイントです。
#ref(./100622_1057~01.jpg,100%,アーム補強);
#ref(./100622_1059~01.jpg,100%,重り);
**完成したロボット [#c9a88ad2]
以上よりロボットが完成した。
#ref(./100622_1100~01.jpg,100%,ロボット完成);
#ref(./100622_1059~03.jpg,100%,ロボット完成);
少し大きな車体になってしまったが、しっかり缶を掴める頑丈なロボットに仕上げることができた。
*プログラム [#b13a8218]
**馬場のプログラム [#g6c76d65]
2. 空き缶を次の交差点まで運んで行き、その交差点に空き缶を残してさらにコースに沿って進む

 #define  THRESHOLD 45                 //光センサーの明るさを定義
 int t;                  //変数tを定義
 int i;                             // 変数iを定義
task main()
{             
   t=0;            
   i=0;
    SetSensor(SENSOR_1,SENSOR_LIGHT);    //センサー1と3を光センサー、
    SetSensor(SENSOR_2,SENSOR_TOUCH);    //センサー2をタッチセンサーにする。
    SetSensor(SENSOR_3,SENSOR_LIGHT);
      while(t<6){                           //一周したら止まるように設定

      if(SENSOR_2==1){              //タッチセンサーに反応したとき
      if(SENSOR_1>THRESHOLD){          //センサー1が白
      if(SENSOR_3>THRESHOLD){          //センサー3が白
      OnFwd(OUT_B)
      Wait(20);                                  //アームを閉じる
      OnFwd(OUT_A+OUT_C);              //直進する
      }
      else{                    //センサー3が黒
      OnFwd(OUT_A);OnRev(OUT_C);         //左折する
   }
      if(SENSOR_1<THRESHOLD){          //センサー1が黒
     if(SENSOR_3>THRESHOLD){          //センサー3が白
      OnFwd(OUT_C);OnRev(OUT_A);        //右折する
      }
     else{                   //センサー3が黒
     t++;                   //交差点と認識しt=t+1
    if(i=0){                              //i=0のとき
     OnFwd(OUT_A+OUT_C);        
     Wait(30);                  //線を越える
     i++;                     //i=i+1
     }
     else{                                //iが0でないとき 次の動作で缶を置く
     OnFwd(OUT_A+OUT_C);             //直進する
     Wait(110);                  
      OnFwd(OUT_A);OnRev(OUT_C);         //反転する
      Wait(130);
      OnRev(OUT_B);                            //アームを開く
      Wait(20);
      OnRev(OUT_A+OUT_C);           //後退する
      Wait(130);  
      OnFwd(OUT_A);OnRev(OUT_C);        //反転する  
      Wait(130);
     i=0;                   //i=0を代入
     }}}}

   else{                  //タッチセンサーが反応しないとき 
    if(SENSOR_1>THRESHOLD){         //センサー1が白
    if(SENSOR_3>THRESHOLD){       //センサー3が白
    OnFwd(OUT_A+OUT_C);          //直進する
    }
    else{                 //センサー3が黒
    OnFwd(OUT_A);OnRev(OUT_C);       //左折
    }
    if(SENSOR_1<THRESHOLD){          //センサー1が黒
    if(SENSOR_3>THRESHOLD){         //センサー3が白
    OnFwd(OUT_C);OnRev(OUT_A);        //右折
    }
    else{                 //センサー1,3が黒
    t++;
    OnFwd(OUT_A+OUT_C);         //直進する
    Wait(50); 
     }}}}
    Off(OUT_A+OUT_C);           //停止する
}
**小笠原のプログラム [#o40023ad]
 1. 空き缶をコース上に戻して再びコースに戻って進む
    define white 45 //光センサーの値

 #define THRESHOLD 45             //光センサーの明るさを定義
 #define turn_180              //反転
 int i;                                      //変数iを定義
 int t;                   //変数tを定義
task main (){
    i=0;
    t=0;
    SetSensor(SENSOR_1,SENSOR_LIGHT);        //光センサー
    SetSensor(SENSOR_2,SENSOR_TOUCH);        //タッチセンサー
    SetSensor(SENSOR_3,SENSOR_LIGHT);        //光センサー
    while (t<6)                              //一周したら停止
     {
    if(SENSOR_1>40&&SENSOR_3<45){      //タッチセンサー1が白、3が黒
    OnFwd(OUT_A);
    OnRev(OUT_C);              //右折     
   task main(){

  SetSensor(SENSOR_1, SENSOR_LIGHT);  //光センサー左
  SetSensor(SENSOR_3, SENSOR_LIGHT);  //光センサー右
  int t = 0; //3回目に缶に当たった時に停止する

     while(t<=2){

      if(SENSOR_2==1){ //タッチセンサーが反応
         t=t+1;
         OnRev(OUT_A+OUT_C);
         Wait(40);
         Off(OUT_A+OUT_C);
         OnFwd(OUT_B);//缶をつかむ
         Wait(20);
         Off(OUT_B);
         OnRev(OUT_A);OnFwd(OUT_C);//反転
         Wait(150);//
         Off(OUT_A+OUT_C);
         OnRev(OUT_A+OUT_C);
         Wait(50);
         Off(OUT_A+OUT_C);
         OnRev(OUT_B);//缶をはなす
         Wait(20);
         Off(OUT_B);
         OnFwd(OUT_A+OUT_C);
         Wait(40);
         Off(OUT_B);
         OnRev(OUT_C);OnFwd(OUT_A);
         Wait(150);//元の位置に戻る
         Off(OUT_A+OUT_C);
         OnFwd(OUT_A+OUT_C);
         Wait(15);
         Off(OUT_A+OUT_C);
     }
    if(SENSOR_1<40&&SENSOR_3>45){      //タッチセンサー1が黒、3が白
    OnFwd(OUT_C);
    OnRev(OUT_A);                      //左折
     }
    if(SENSOR_1>40&&SENSOR_3>45){      //タッチセンサー1,3が白
    OnFwd(OUT_A+OUT_C);            //直進 
     }
    if(SENSOR_1<40&&SENSOR_3<45){       //タッチセンサー1,3が黒
    OnFwd(OUT_A+OUT_C);           //直進
     }
     }
    if(SENSOR_1>THRESHOLD){         //センサー1が白
    if(SENSOR_3>THRESHOLD){         //センサー3が白
    OnFwd(OUT_A+OUT_C);                      //直進
   }
   else{
    OnFwd(OUT_A);OnRev(OUT_C);               //左折
   }
    if(SENSOR_1<THRESHOLD){                  //センサー1が黒
    if(SENSOR_3>THRESHOLD){         //センサー3が白
    OnFwd(OUT_C);OnRev(OUT_A);               //右折
   }
    OnFwd(OUT_C);OnRev(OUT_A);
    t++;                                     //交差点
    if(i==0){                                //i=0
    OnFwd(OUT_A+OUT_C);                      //線を越える
    Wait(30);
    i++;
   }
    else{
    OnFwd(OUT_A);
    Off(OUT_C);
   }
    if(SENSOR_2==1){             //タッチセンサーが反応
    if(SENSOR_1>THRESHOLD){         //センサー1が白
    if(SENSOR_3>THRESHOLD){         //センサー3が白
    Off(OUT_A+OUT_C);            //停止
    Wait(100);
    OnFwd(OUT_B);
    Wait(50);
    Off(OUT_A+OUT_C);             //停止 
    Wait(100);
    OnFwd(OUT_A+OUT_C);            //直進
    Wait(120);
    turn_180;                 //反転
    OnRev(OUT_B);
    Wait(50);
    OnRev(OUT_A+OUT_C);                      //後退
    Wait(80);
    turn_180;
    i=i+1;
    }}}
    Off(OUT_A+OUT_C);                        //停止
       }
}

      if((SENSOR_1 < white) && (SENSOR_3 < white)){ //交差点通過
          Off(OUT_A+OUT_C);Wait(50);     
          OnRev(OUT_A+OUT_C);Wait(15);
      }                        
      else if((SENSOR_1 > white) && (SENSOR_3 > white)){ //黒の線上を通過
      OnRev(OUT_A+OUT_C);
      }
      
      else if(SENSOR_1 < white){ //左への修正
         OnRev(OUT_C);
         OnFwd(OUT_A);
      }   
      else if(SENSOR_3 < white){ //右への修正
         OnRev(OUT_A);
         OnFwd(OUT_C);
      }
                   
  }
     Off(OUT_A+OUT_C);            } //缶に三回当たると停止
最初はコースさえ回れず、タッチセンサーも反応しなかった。
だがちょっとした修正で改善できる点がたくさんあったので、プログラムの理解にもつながった。カーブを曲がるときにガタガタしてしまうので、スムーズに回れるようにしたい。

*反省点 [#n79e6e32]
とにかく前回よりロボット作成とプログラムが格段と難しくなっていたので
、かなり苦労した。
あまりよく缶がはさめなかったので、もっと確実に挟める工夫が必要だと思った。
プログラムをもっと簡略にできると思った。
音楽を流すなどの新たな工夫が欲しかった。
*感想 [#z747a562]
今回は二人でも、チームでも集まれたのは良かった。
とにかく難しかったけど、やりがいがあったし、楽しかった。
*コメントをどうぞ。 [#ec06ff04]
- 問題点に対する改善策、考えられる工夫を書いてみてください -- [[TAKA]] &new{2010-07-09 (金) 17:04:21};
- 全体的に詳しくしてください。特にプログラムの説明(変数の意味、命令の意図等)をはっきりさせて下さい -- [[FI]] &new{2010-07-12 (月) 18:22:11};
- もうロボットは解体したと思うので、プログラムをなおすだけで良いので、もう少しきれいにしてください。具体的には、(1)空行やindentを用いて見やすくわかりやすくする、(2)同じような命令はまとめる、または関数やサブルーチンを用いる、(3)何のための変数かをきちんと説明する、(4)繰り返し使う数値は定数を用いる等々です。 -- [[FI]] &new{2010-08-07 (土) 00:59:23};

#comment



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