[[2018b/Member]]
*課題 [#ofb64055]
指定されたコースで黒い線に沿って動き、途中でボールをゴール付近に立てた350mlの空き缶(黄色で表示)に当てるロボットを製作せよ。
*ロボット [#m77d9da9]

&ref(2018b/Member/kaito/Mission2/KIMG0094 (2).jpg,50%,コース);
ボールを投げる腕をつけた

&ref(2018b/Member/kaito/Mission2/KIMG0093.jpg,50%,コース);
ボールを持った時の様子
*自分ができた・できなかったこと [#w72a4dbe]
・交差点を認識して止まるプログラミングが二種類できた。

・超音波センサを使って缶の位置を探るプログラミングができなかった。(なんとなくぐらいしか理解できなかった。)
*ライントレースのプログラミング(交差点を認識する) [#c68a7046]
**黒が一定時間以上になた場合交差点を認識(自分で作ったプログラム) [#oa85df8c]

 #define TR_R OnFwd(OUT_B,15);OnRev(OUT_C,15); //右旋回
 #define GO_R Float(OUT_B);OnFwd(OUT_C,30);  //右折
 #define GO_S OnFwd(OUT_BC,30);   //直進
 #define GO_L OnFwd(OUT_B,30);Float(OUT_C);  //左折
 #define TR_L OnFwd(OUT_C,15);OnRev(OUT_B,15);  //直進
 #define MIDL 40 //中間色
 
 task main()
 {
 SetSensorLight(S1);
 long t0=CurrentTick();
  while (CurrentTick()-t0<1000) {  //黒が1秒続くまで行う
               if(SENSOR_1>MIDL+20){TR_R
                                  t0=CurrentTick();}  //真っ白なら右旋回・リセット
               else if(SENSOR_1>MIDL+10){GO_R
                                       t0=CurrentTick();} //ちょい白なら右折・リセット 
               else if(SENSOR_1>MIDL){GO_S
                                     t0=CurrentTick();}  //グレーなら直進・リセット
               else if(SENSOR_1>MIDL-10){GO_L
                                       t0=CurrentTick();}  //ちょい黒なら左折・リセット
               else{TR_L
                   CurrentTick();}  //真っ黒なら左旋回・数える
                 }
 Off(OUT_BC);
 }

**変数を用いた場合(自分で作ったもの) [#w97dd0ba]

 #define TR_R OnFwd(OUT_B,15);OnRev(OUT_C,15); //右旋回
 #define GO_R Float(OUT_B);OnFwd(OUT_C,30);  //右折
 #define GO_S OnFwd(OUT_BC,30);   //直進
 #define GO_L OnFwd(OUT_B,30);Float(OUT_C);  //左折
 #define TR_L OnFwd(OUT_C,15);OnRev(OUT_B,15);  //直進
 #define MIDL 45 //中間色
  
 task main()
 {
 SetSensorLight(S1);
 int n=0;
 while(true){
              if(SENSOR_1>MIDL+8){TR_R}  //真っ白なら右旋回
              else if(SENSOR_1>MIDL+6){GO_R}  //ちょい白なら右折
              else if(SENSOR_1>MIDL){GO_S}  //グレーなら直進
              else if(SENSOR_1>MIDL-4){GO_L}  //ちょい黒なら左折
              else do{
                      TR_L
                      Wait(1);
                      n++;}while (n<28);  //真っ黒なら0.001秒左旋回・28回繰り返したら終了
                }
 Off(OUT_BC);
 }
*缶を見つけるプログラミング(相方のプログラム) [#o4899f1c]

 void mitsukeru()
 {
  ResetTachoCount(OUT_ABC);
  OnFwd(OUT_A,50);
  OnRev(OUT_C,50);
  SetSensorLowspeed(S4);            
  int d1;
  d1=1000;//仮の最小値  
  long t0=CurrentTick();
  long t1=CurrentTick();
  long t2=CurrentTick();
  while(t2-t0<=3570){  //3.57秒間サーチする
      t2=CurrentTick();
      if(SensorUS(S4)<d1){
          d1=SensorUS(S4);//最小値より小さい値が出た時、そこを新しい最小値とする
          t1=CurrentTick();//時間をリセットする
      }
      t2=CurrentTick();
  }
  t0=CurrentTick();
  Off(OUT_AC);
  OnFwd(OUT_C,50);
  OnRev(OUT_A,50);
  Wait(t0-t1);//最後に、最小値をとった場所まで回る
 }
ある値を設定してその値より小さくなった時の時刻を記憶し、逆戻りして進んでいると思われる。
*完成したプログラミング(相方のプログラム) [#u6acc65e]

 task main()
 {
 Line();//AからBまでライントレース
 RIGHT(15);//Bを右折
 Line();//BからKまでライントレース
 Wait(1000);//一時停止
 LEFT(15);//Kを左折
 Line();//KからJまでライントレース
 go(50);//微調節
 Line();//KからJまでライントレース
 go(100);//微調節
 mitsukeru();//缶を探す
 OnFwd(OUT_B,30);//缶を落とす
 Wait(2000);
 Off(OUT_B);
 Line();//JからIまでライントレース
 go(50)//微調節
 Line();//IからHまでライントレース
 LEFT(15);//左に曲がる
 Line();//HからGまでライントレース
 Wait(1000);//一時停止
 LEFT(15);//Gで左折
 Line2();//ある場所まで進み続ける
 Line();//そこからEmまでライントレース
 Wait(1000);//一時停止
 RIGHT(15);//Eを曲がる
 Line();//Lまで行く
 go(100);//ゴールに入る
 Off(OUT_BC);// 
 }
ライントレース→交差点(右折・直進・左折)→ライントレース …を操作してゴールに向かっている。

*まとめ [#icdf9542]
結局のところ課題を解決することはできなかった。次回はチームの人に聞いたり、役割分担しながら課題をクリアしたい。超音波センサーはなるべく駆動輪間の上・位置は下にあると正確な計測・認知がしやすくなる。


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