[[2016a/Member]]

目次
#contents
*課題 [#v184f942]
#ref(2016a/Member/ryo/Mission2/2016a-mission2.png,100%)
上図のA,B地点からスタートし、C,D地点にある紙コップを、円の中に運び入れる。~
その速さや円の中にある紙コップの数、機体の美しさなどを競う。~
詳細は[[こちら:http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMission3]]。
*ロボットの説明 [#z735fae1]
#ref(2016a/Member/ryo/Mission3/image1 (7).JPG,30%)
上図のように、コップを持ち上げて運ぶため、機体前方に大きなはさみを取り付けた。~
#ref(2016a/Member/ryo/Mission3/image3 (2).JPG,30%)
上図のように、コップをつかみ、それ以上閉まらなくなると、下図のギアがかみ合って、~
腕が持ち上がるようになっている。
#ref(2016a/Member/ryo/Mission3/image4 (1).JPG,30%)
ギアのかみ合いが甘かったので、間に輪ゴムを使い、調整した。
#ref(2016a/Member/ryo/Mission3/image2 (2).JPG,30%)
コップを持ち上げた際、コップが落ちないように後ろにストッパーをつけている。
*作戦 [#t9b908fc]
一台の機体でコップを運搬、積み重ねすることにした。積み重ねも挑戦したが、~
あまりうまくいかなかったため、まずはコップ一個を円の中に入れることを目標にした。
*プログラムの説明 [#e626fc0b]
**基本の定義 [#kd7aff12]
 #define BLACK 44  //これ以下は黒
 #define WHITE 50  //これ以上は白
 #define RIGHT_S OnFwd(OUT_A);OnRev(OUT_C);  //右旋回
 #define RIGHT_K OnFwd(OUT_A);Off(OUT_C);    //右回転
 #define LEFT_S OnFwd(OUT_C);OnRev(OUT_A);   //左旋回
 #define LEFT_K OnFwd(OUT_C);Off(OUT_A);     //左回転
 #define go_fwd(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC);  //t秒間前進
 #define go_back(t) OnRev(OUT_AC);Wait(t);Off(OUT_AC); //t秒間後退
 #define STEP 1
 #define arm_up(t) OnFwd(OUT_B);Wait(t);Off(OUT_B); //t秒間腕上げ
 #define arm_down(t) OnRev(OUT_B);Wait(t);Off(OUT_B); //t秒間腕下げ
 #define RIGHT_i(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_AC); //t秒間右回転
 #define LEFT_i(t) OnFwd(OUT_C);OnRev(OUT_A);Wait(t);OFF(OUT_AC); //t秒間左回転
**サブルーチン [#i5093e07]
黒い線の右側をたどっていくプログラム。交差点で一時停止するようになっている。~
判定方法は、タイマーを使い、0.45秒以上黒が続いた時、交差点として判定する。~
黒では右に、白では左に回転、旋回するようになっている。その他では直進する。~
こちらは腕が上がっている時に使用した。
 sub line_trace_i()
 {
   ClearTimer(0);
    while(FastTimer(0) < 45) {
      if  (SENSOR_2 < BLACK) {
            RIGHT_S;
          } else if (SENSOR_2 < BLACK +2 ) {
            RIGHT_K;
          } else if (SENSOR_2 > WHITE ) {
            LEFT_S;
            ClearTimer(0);
          } else if (SENSOR_2 >= WHITE -2 ) {
            LEFT_K;
            ClearTimer(0); 
          } else {
          OnFwd(OUT_AC);
          ClearTimer(0);
           }
          Wait(STEP);
        }
       Off(OUT_AC);
       ClearTimer(0);
       PlaySound(SOUND_UP);
       Wait(100);
 }~
先ほどのプログラムとほぼ同じだが、こちらは腕を下げた状態の時使用した。~
腕が下がっている時、動きが鈍くなるため、交差点の判定時間を延ばして対処している。
 sub line_trace_ii()
 {
   ClearTimer(0);
    while(FastTimer(0) < 55) {
      if  (SENSOR_2 < BLACK) {
            RIGHT_S;
          } else if (SENSOR_2 < BLACK +2 ) {
            RIGHT_K;
          } else if (SENSOR_2 > WHITE ) {
            LEFT_S;
            ClearTimer(0);
          } else if (SENSOR_2 >= WHITE -2 ) {
            LEFT_K;
            ClearTimer(0); 
          } else {
          OnFwd(OUT_AC);
          ClearTimer(0);
           }
          Wait(STEP);
        }
       Off(OUT_AC);
       PlaySound(SOUND_UP);
       Wait(100);
 }~
交差点で左折するためのプログラム。
 sub turn_left()
 { ClearTimer(0);
   while (FastTimer(0) < 290) {       
         LEFT_K;
        }
 }~
交差点で右折するためのプログラム。
 sub turn_right()
 { ClearTimer(0);
  while (FastTimer(0) < 90) {       
         RIGHT_K;
        }
 }~
交差点で直進するためのプログラム。
 sub cross_fwd()
 { ClearTimer(0);
   while (FastTimer(0) < 60) {       
         LEFT_K;
        }
 }



**メインプログラム [#o838b288]
 task main()
 { go_fwd(100);
   line_trace_i();
   cross_fwd();
   line_trace_i();
   cross_fwd();
   line_trace_i();
   turn_right();
   Off(OUT_AC);
   arm_down(70);
   go_fwd(200);
   arm_up(90);
   RIGHT_i(120);
   arm_down(20);
   Wait(50);
   arm_down(70);
   go_back(100);
   arm_up(120);
   RIGHT_i(50);
   line_trace_ii();
   arm_down(100);
   go_fwd(200);
   arm_up(80);
   LEFT_i(130);
   go_fwd(50);
   arm_down(80);
 }
*まとめ [#n2c84fc0]
テスト走行でもそうだったが、毎回コップのところまでついて、3点得ることが出来ていた訳ではなかったが、~
本番でもあと少しのところで円に入れ切れなかったのは悔しかった。~
もう片方の班との連携がとれなかったため、機体の調整を仕切れなかったのが原因だと思う。~
機体が毎回同じ動きをしてくれる訳ではないため、調整に苦戦した。~
しかし、課題1,2で覚えたことも応用することが出来たため、大変だったが達成感があった。

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