[[2015a/MemberOnly]]
*使用したロボ [#p88956df]
**使用したロボ [#s04c709e]
基本的なライントレースのロボをベースとしてピンポン玉を保持するためのアームを付加した。
#ref(2015a/Member/swimy/Mission2/R6_5641.jpg,50%,使用したロボット)
**光センサー [#d56fd507]
車体の底の中心より少し前に光センサーを設置した。
#ref(2015a/Member/swimy/Mission2/R6_5035.jpg,50%,裏)
**アーム [#n096c1c0]
車体前方に取り付けたアームはBにつなげたモーターを前転させると閉じる仕組みとなっている
#ref(2015a/Member/swimy/Mission2/R6_3844.jpg,50%,アーム)

*プログラム [#v178b2cc]
今回はラインの右端をトレースするようにしてみた。

このプログラムはBからAに進むものである。
 #define THRESHOLD 46//光センサーの値の中心を決める
 #define go_forward OnFwd(OUT_AC);//直進
 #define turn_left0 OnFwd(OUT_C);//左旋回
 #define turn_left1 OnFwd(OUT_C);OnRev(OUT_A);//左折
 #define turn_right1 OnFwd(OUT_A);OnRev(OUT_C);//右折
 #define turn_right0 OnFwd(OUT_A);//右旋回
 #define nMAX 7//判断の最高回数を設定
 #define short_break Off(OUT_AC);Wait(100);//小休止
 #define CROSS_TIME 30//横断の時間
 #define cross_line go_forward;Wait(CROSS_TIME);short_break;//交差点の横断
 
  task main()
  {
  SetSensor(SENSOR_2, SENSOR_LIGHT);
  int nOnline=0;//変数nを交差点判断のために定義、0にする
  int pOnline=0;//変数pをボールをつかみ、シュートするタイミングをとるために定義、0にする
 
  while(true){
  while(pOnline < 2){
    while (nOnline < nMAX){//nがnMAX未満の時に繰り返す
      if(SENSOR_2 < THRESHOLD-7){
        turn_right1;
        nOnline++;//明度が基準ー7未満の時(はっきりと黒いとき)右折しnのカウントを1増やす
       } else {
        if(SENSOR_2 <THRESHOLD-3){
         turn_right0;//明度が基準ー3未満、−7以上の時(黒っぽいとき)右旋回
       } else if(SENSOR_2 <THRESHOLD+3){
         go_forward;//明度が基準+3未満、−3以上の時(白と黒の境界付近)直進
       } else if(SENSOR_2 <THRESHOLD+7){
         turn_left0;//明度が基準+7未満、+3以上の時(白っぽいとき)左旋回
       } else {
         turn_left1;//明度が基準+7以上の時(はっきり白いとき)左折
       }
     nOnline=0;//変数nを0に戻す
   }
  Wait(1);//判断時間
  }
   pOnline++;//交差点の数を数える
  if(pOnline < 2){
     OnFwd(OUT_B);Wait(7);Off(OUT_B);
     }//1つ目の交差点でボールキャッチ
  if(pOnline < 1){
     OnFwd(OUT_B);Wait(7);Off(OUT_B);//1つ目の交差点でボールキャッチ
     short_break;
     turn_left1; Wait(nMAX*1);
     cross_line;
   }
  nOnline=0; 
  pOnline++;//交差点の数を数える
  } 
  OnRev(OUT_B);Wait(7);Off(OUT_B);//2つ目の交差点でアームを開く
  short_break;
  turn_left1; Wait(nMAX*1);
  if(pOnline > 1){
     OnRev(OUT_B);Wait(7);Off(OUT_B);
    }//2つ目の交差点でアームを開く
  cross_line;//2つ目の交差点の時はこれがシュートになる
  nOnline=0;
  } 
  cross_line;
  Off(OUT_AC);//シュート(ボールを押し出す)
 } 
 
*反省 [#ifa0622b]
 一度は時間を計ってシュートの判断をしなければならないと固まった思考にとらわれていたが、ゴール前のT字も交差点カウントで考えたらうまくいった。思考の柔軟性が必要だと感じた。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS