*ロボットの紹介 [#ge59bd36]
このロボットのうりは速さです。そのうえで各々工夫した点をあげてきます。
製作時間は2,3時間程度です。ほとんどアームの製作時間だと思います。
#ref(ロボ5.jpg)
#ref(ロボ4.jpg)

**アーム [#l4b41a6a]
こだわった点は掴むアームを2つにし、それでいて軽さを追求すること。重くなっては論外。作りはいたってシンプルに、モーター1つで全アームを稼働させることを可能にした自慢の一品にしました。もちろんアームの仕事である缶を掴むということにも秀でてます。缶をホールドするアームにすることで、缶をガッチリつかまえることができ、できるだけ離さないようにしました。上下で缶を掴むのでバランスを崩す事無く安定して、缶を置くまで運んでいきます。さらにシンプルゆえに取り外しも簡単に行えるようにしました。しかしシンプルゆえに耐久面は弱いのではと思うかもしれませんが、強いとは言いませんが問題なく運べる程度にはがんじょうです。
#ref(ロボ6.jpg)
#ref(ロボ7.jpg)

**本体 [#ycca41fe]
黄色のコアを少し後ろにしてつけ、光センサーを本体に近づくけることでアームをつけても前に重心がよらないようにし、走りを安定させることで速さを上げました。加えてバランスをとるために後面におもりを付けることなく、ロボット自体を軽量化することができました。




*コース攻略 [#uffb901c]
交差点をわたらせることが攻略の鍵
#ref(http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&refer=2013a%2FMission1&openfile=robotics-2013a-mission1.jpg)

**左回り [#d8db0732]

-なによりも大変だったのが交差点をいかにわたらせるかという事でした。
はじめの交差点が渡れず正規ルートを通れなっかたのでタイマーを使い手前でプログラムを切り替えることで第一関門を突破するという方法をとりました。交差点の鋭角を通らせないと直線させることができないため、外側を走行しているロボットを内側走行に切り替える必要がありました。

-次の2連続交差点も同様です。

-しかし最後の交差点が面倒でした。前のプログラムでは急カーブが曲がれず脱線してしまったので、急カーブでも走れるプログラムに変更。しかしこのプログラムでは交差点を上手く渡れないので、更にプログラムを変更するという短時間で三回もの変更は時間調整の面で厄介でした。

プログラムの詳しい説明は後のプログラムの説明にて記述。











*プログラムの説明 [#a03d5d0c]
 #define THRESHOLD 48
 #define HIPOWER 7
 #define LOWPOWER 2
-しきい値の値は重要。一番いい値を得るため数字を変え試行錯誤でした。
 #define HIPOWER 7 //直進用パワー 
 #define LOWPOWER 2 //カーブ、アーム用パワー
 #define set_power_H SetPower(OUT_AC,HIPOWER);
 #define set_power_L SetPower(OUT_AC,LOWPOWER);
 #define set_power_N SetPower(OUT_B,LOWPOWER);
-力の調整。ACはタイヤ、Bはアーム。
 
 #define go_forward set_power_H; OnFwd(OUT_AC);//直進は力強めに調整
 #define arm_forward set_power_N; OnFwd(OUT_B);Wait(30);Off(OUT_B);//閉じアーム
 #define arm_backward set_power_N; OnRev(OUT_B);Wait(30);Off(OUT_B);//開きアーム
-アームを動かすプログラムをarm_…と定義し扱いやすくした。力は弱めに設定。
 
 #define turn_left1 set_power_L ;\
     OnFwd(OUT_C);OnRev(OUT_A);
 #define turn_left0 set_power_L ;\
     OnFwd(OUT_C);Off(OUT_A);
 #define turn_right0 set_power_L ;\
     OnFwd(OUT_A);Off(OUT_C);
 #define turn_right1 set_power_L ;\
     OnFwd(OUT_A);OnRev(OUT_C);
 -カーブを曲がるために力は弱めに調整
 #define STEP 1// 1回の判断で動作させる時間
 #define nMAX 30// 通常のカーブとして許容できる繰り返しの最大値
 #define short_break Off(OUT_AC); Wait(100);// 小休止
 #define CROSS_TIME 20// 交差点通過にかかる時間
 #define cross_line set_power_L;\
     OnFwd(OUT_A);OnRev(OUT_C);\
      Wait(CROSS_TIME);short_break;
-ここまでが定義
 task main ()
 {
    SetSensor(SENSOR_2, SENSOR_LIGHT);
    int nOnline=0;// 続けて黒になった回数
 
 
      ClearTimer(0);// 0番目のタイマーをリセット
  while(FastTimer(0)<=400){   // 4秒以下の間だけ繰り返す
    while(nOnline < nMAX && FastTimer(0)<=400){
      if(SENSOR_2< THRESHOLD -8) {
         turn_left1;
         nOnline++;
      }else{
       if(SENSOR_2< THRESHOLD -3){
        turn_left0;
      }else if(SENSOR_2< THRESHOLD +3){
        go_forward;
      }else if(SENSOR_2< THRESHOLD +8){
        turn_right0;
      }else{
         turn_right1;
       }
       nOnline=0;
       }
       Wait(STEP);
    }
 
 }
-上記のプログラムで缶のあるとこまで進みます。通常、急カーブや直角はこのプログラムのしきい値。4秒後下のプログラムに移行します。
  Off(OUT_AC);
  OnRev(OUT_B);
  Wait(10);
  arm_forward;//缶を掴む
-上記のプログラムで缶を掴みます。Off(OUT_AC);を入れるのが重要。走行をいったん止める事で缶を掴む時におきる誤動作を阻止している。
 
 PlaySound(SOUND_UP);//次のプログラムに移行した合図としての音
 
  while(FastTimer(0)<=900){
    while(nOnline < nMAX && FastTimer(0)<=900){
      if(SENSOR_2< THRESHOLD -8) {
         turn_left1;
         nOnline++;
      }else{
       if(SENSOR_2< THRESHOLD -3){
        turn_left0;
      }else if(SENSOR_2< THRESHOLD +3){
        go_forward;
      }else if(SENSOR_2< THRESHOLD +8){
        turn_right0;
      }else{
         turn_right1;
       }
       nOnline=0;
       }
       Wait(STEP);
    }
 
 }
 
 
-この時点では外側を走行。
 PlaySound(SOUND_UP);
 
 ClearTimer(0);
 
  turn_right1;
   Wait(10);
 
 arm_forward;
 
 while(FastTimer(0)<=1300){
 
    while(nOnline < nMAX && FastTimer(0)<=1300){
    
     
      if(SENSOR_2< THRESHOLD -10) {
         turn_right1;
         nOnline++;
      }else{
       if(SENSOR_2< THRESHOLD -4){
        turn_right0;
      }else if(SENSOR_2< THRESHOLD +3){
        go_forward;
      }else if(SENSOR_2< THRESHOLD +10){
        turn_left0;
      }else{
         turn_left1;
       }
       nOnline=0;
       }
       Wait(STEP);
    
    }
 }
-上記のプログラムで内側走行に変更。最初の交差点をわたらせます。しきい値を変えることで交差点をわたらせることができました。
 PlaySound(SOUND_UP);
 turn_left1;
 Wait(10);
 arm_forward;
  
 while(FastTimer(0)<=2000){
    while(nOnline < nMAX && FastTimer(0)<=2000){
      if(SENSOR_2< THRESHOLD -10) {
         turn_left1;
         nOnline++;
      }else{
       if(SENSOR_2< THRESHOLD -4){
        turn_left0;
      }else if(SENSOR_2< THRESHOLD +3){
        go_forward;
      }else if(SENSOR_2< THRESHOLD +10){
        turn_right0;
      }else{
         turn_right1;
       }
       nOnline=0;
       }
       Wait(STEP);
    }
 
 }
-外側走行に変更。2連続交差点を突破します。
 PlaySound(SOUND_UP);
 
  arm_forward;
  
 while(FastTimer(0)<=2650){
    while(nOnline < nMAX && FastTimer(0)<=2650){
      if(SENSOR_2< THRESHOLD -8) {
         turn_left1;
         nOnline++;
      }else{
       if(SENSOR_2< THRESHOLD -3){
        turn_left0;
      }else if(SENSOR_2< THRESHOLD +3){
        go_forward;
      }else if(SENSOR_2< THRESHOLD +8){
        turn_right0;
      }else{
         turn_right1;
       }
       nOnline=0;
       }
       Wait(STEP);
    }
 }
-進めない急カーブはこのプログラムで行ないます。
 PlaySound(SOUND_UP);
 
 arm_forward;
  
 while(FastTimer(0)<=3100){
    while(nOnline < nMAX && FastTimer(0)<=3100){
      if(SENSOR_2< THRESHOLD -10) {
         turn_left1;
         nOnline++;
      }else{
       if(SENSOR_2< THRESHOLD -4){
        turn_left0;
      }else if(SENSOR_2< THRESHOLD +3){
        go_forward;
      }else if(SENSOR_2< THRESHOLD +10){
        turn_right0;
      }else{
         turn_right1;
       }
       nOnline=0;
       }
       Wait(STEP);
    }
 }
-ラストの交差点を渡らせる。
 PlaySound(SOUND_UP);
 
 turn_left1;
   Wait(10);
 
 arm_forward;
 
 while(FastTimer(0)<=3800){
    while(nOnline < nMAX && FastTimer(0)<=3800){
      if(SENSOR_2< THRESHOLD -8) {
         turn_left1;
         nOnline++;
      }else{
       if(SENSOR_2< THRESHOLD -3){
        turn_left0;
      }else if(SENSOR_2< THRESHOLD +3){
        go_forward;
      }else if(SENSOR_2< THRESHOLD +8){
        turn_right0;
      }else{
         turn_right1;
       }
       nOnline=0;
       }
       Wait(STEP);
  }
 }

 PlaySound(SOUND_UP);
 
 turn_left1;
 Wait(300);
 
 arm_backward;// 缶を離す。
 
 OnRev(OUT_AC);// バック。
 Wait(100);
 
 turn_left1;
 Wait(150);
-180度回転し缶を置き、バックをして少し回転した後ラインに戻る。
 
 while(FastTimer(0)<=6000){
    while(nOnline < nMAX && FastTimer(0)<=6000){
      if(SENSOR_2< THRESHOLD -8) {
         turn_left1;
         nOnline++;
      }else{
       if(SENSOR_2< THRESHOLD -3){
        turn_left0;
      }else if(SENSOR_2< THRESHOLD +3){
        go_forward;
      }else if(SENSOR_2< THRESHOLD +8){
        turn_right0;
      }else{
         turn_right1;
       }
       nOnline=0;
       }
       Wait(STEP);
  }
 short_break;
    turn_right1;Wait(nMAX*STEP);// 進行方向修正
   cross_line;// 交差点をわたる
   nOnline=0;// カウンタリセット
  }
 }
-ゴール!!

**備考 [#ae4d111c]
工夫した点や上記で説明しなかったことや補足。

-缶を掴む・離すは比較的簡単にできました。

-PlaySound(SOUND_UP);
プログラムの切り替わる時に音を出し、切り替わり時を明確化。有ると無いとでは大違い。またプログラムを直す時に場所を特定するなどプログラムが長くなっても大変便利だった。
プログラムの切り替わる時に音を出し、切り替わり時を明確化。有ると無いとでは大違いでした。またプログラムを直す時に場所を特定しやすくなるなどプログラムが長くなっても大変便利だった。

-切り替わり時にturn_left1、turn_right1を入れることにより切り替わりをスムーズにし、かつ脱線などをなくした。

-切り替わり時にarm_forwardを入れることで缶を掴みなおさせ缶を安定して運べるようにした。これにより離すことなく、缶を立てて置くことが出来た。

-通常、交差点用のプログラムから右基準、左基準に分岐したプログラムをコースに合わせて変更。

-今回最も重要だったの“タイマー”というプログラムです。細かい説明は省略させていただきます。主な使い方と注意点について。
 ある時間まで特定のプログラムを行い、次のプログラムに移行するというものです。私のはほぼこ のプログラムでできています。しかし時間がかなり関わってくるので状況が変わると全く機能しな いこともある。かつ時間調整などシビアな面も多い。加え時間調整はとても時間がかかり今回一番 大変でした。
 私はこの方法しか思いつかなかったがもし他 の方法があるならそちらの方がいいかもしれない。 なんにせよ“タイマー”におけるデメリットを 知った上で扱ってほしい。


*まとめ・感想[#bd293a1b]
-まだまだ多くのプログラムがあり、私が使ったプログラムはわずかなのでもっといろんなプログラムを使っていきたいです。いろいろ使ってこそ勉強のうちですしね。

-作ってみたらとても長くなってしまったと思いました。ほんとに長い。もっと短くできたのだろうか。いらない部分は無くしてつもりですが、プログラムを作るのでいっぱいいっぱいだったので次はそのあたりも考えていきたいです。

-交差点をわたらせるしきい値の設定やタイマーの時間調節はほんとに大変でした。タイマーのとこでも書きましたが、なにより時間がかかることが厄介このうえなかったです。最初からうまくいけばいいのですが、そううまくいかず、タイマーを使い始めた頃はまともに動かせなくて試行錯誤でした。おかげ電池がたいへん減りました。

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