目次
#contents



*課題について [#z69071de]
E地点右折コースを選択した。
詳しくは[[2017a/Mission2]]を参照

*ロボットについて [#l5e96153]
プログラミングを工夫することによってロボットは基本の形にした。
#ref(2017a/Member/alien/Mission2/syoumen.jpg,50%)
地面とセンサーを近づけることによってより値を正確にできた。
#ref(2017a/Member/alien/Mission2/yoko.jpg,50%)
*ロボットの通るコースについて [#w02e146c]
#ref(2017a/Member/alien/Mission2/yajirusi.jpg,50%)
ラインどりを2種類つかう方法を採用した。
**前半 [#f6542ea5]
#ref(2017a/Member/alien/Mission2/zenzenzenzen.jpg,70%)
**後半 [#f469a598]
#ref(2017a/Member/alien/Mission2/koukoukou.jpg,70%)
*プログラミングについて [#o9339bda]
**交差点 [#q26792ca]

**交差点の判別 [#q26792ca]
CurrentTick()がtimemaxを超えるとライントレースをやめるようになっている。また黒以外では、CurrentTick()がリセットされる。よって交差点は黒が続くので、CurrentTick()がリセットされることがなく、timemaxを超えて止まるという仕組みである。
**定義 [#wfef72a7]
 #define White 63
 #define Gray 50
 #define WhiteGray 58
 #define BlackGray 43
 #define go_st OnFwd(OUT_BC,50);
 #define spin_left OnFwd(OUT_B,25);OnRev(OUT_C,25);
 #define spin_right OnFwd(OUT_C,25);OnRev(OUT_B,25);
 #define turn_left OnFwd(OUT_B,50);
 #define turn_right OnFwd(OUT_C,50);
 #define pose(int t) Off(OUT_BC);Wait(t)
**サブルーチン [#kbbcf09d]
 sub line_uchi(long timemax)//timemax秒間内側のライン取り
 {
    long t0=CurrentTick();
    while(CurrentTick()-t0<timemax){
       if (SENSOR_1>White) {
         spin_left;
         t0=CurrentTick();
      } else if (SENSOR_1>WhiteGray) {
         turn_left;
         t0=CurrentTick();
      } else if (SENSOR_1>Gray) {
         go_st;
         t0=CurrentTick();
      } else if (SENSOR_1>BlackGray) {
         turn_right;
         t0=CurrentTick();
      } else {
         spin_right;
       }
      }
 }
 sub line_soto(long timemax)//timemax秒間外側のライン取り
 {
    long t0=CurrentTick();
    while(CurrentTick()-t0<timemax){
       if (SENSOR_1>White) {
         spin_right;
         t0=CurrentTick();
      } else if (SENSOR_1>WhiteGray) {
         turn_right;
         t0=CurrentTick();
      } else if (SENSOR_1>Gray) {
         go_st;
         t0=CurrentTick();
      } else if (SENSOR_1>BlackGray) {
         turn_left;
         t0=CurrentTick();
      } else {
         spin_left;
       }
      }
     Off(OUT_BC);
 }
**前半(A~S) [#z36be02d]
ロボットの通るコースについての前半を参照
 task main()
 {
    SetSensorLight(S1);
    go_st;
    Wait(1100);
    line_uchi(230);
    OnFwd(OUT_BC,50);
    PlaySound(SOUND_UP);//E右折   
    Wait(20);
    line_soto(180);
    pose(100);
    PlaySound(SOUND_DOWN);//P一時停止
    line_soto(190);
    turn_right;
    PlaySound(SOUND_UP);//Q直進
    Wait(100);
    line_soto(110);
    OnFwd(OUT_BC,50);
    PlaySound(SOUND_UP);//R左折
    Wait(100);
    Off(OUT_BC);
    line_uchi(230);
    pose(100);
    PlaySound(SOUND_DOWN);//T一時停止
    turn_left;
    Wait(300);
    Off(OUT_BC);
    line_uchi(230);
    pose(100);
    PlaySound(SOUND_DOWN);//T一時停止
    turn_left;
    Wait(300);
    Off(OUT_BC);
    line_uchi(230);
    PlaySound(SOUND_UP);//H
    Off(OUT_BC);
    repeat(13){
       line_uchi(200);
    }
    OnFwd(OUT_BC,20);
    PlaySound(SOUND_UP);//G
    Wait(500);
    line_soto(180);
    pose(100);
    PlaySound(SOUND_DOWN);//S左折
**後半(S~A) [#ub10d894]
ロボットの通るコースについての後半を参照
    line_soto(180);
    turn_right;
    PlaySound(SOUND_UP);//P直進
    Wait(100);
    line_soto(120);;
    OnFwd(OUT_BC,20);
    PlaySound(SOUND_UP);//Q
    Wait(500);
    line_uchi(200);
    PlaySound(SOUND_UP);//F
    Off(OUT_BC);
    line_uchi(180);
    pose(100);
    PlaySound(SOUND_DOWN);//A
 }

*工夫した点 [#xc3470e3]
HからGまでのルートの2つ目の急カーブを止まらず曲がりきろうとするとtimemaxの値が大きくなり、GでSOUND_UPを鳴らすことが出来なくなってしまったので、repeatを用いてtimemaxの値が短いものをいくつも繰り返すことで曲がりきりGでも止まることができた。しかし、まれに曲がりきれない場合もあり改善が必要だと感じた。

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