[[2007b/A1]]

* 目次 [#yadc5925]

#contents

* ロボットの説明 [#f84c3395]

#ref(IMG_0182.jpg)

 私たちのロボットは後輪駆動で、ペンの上げ下げはモーターの回転に直接つなげた棒にくっつけたペンが上がったり下がったりすることで行われます。

#ref(IMG_0184.jpg)

 モーターが右側についている為、バランスをとる為に反対側にただの飾りにしかならないタイヤがついています。

#ref(IMG_0179.jpg)

#ref(IMG_0178.jpg)


* 「市」を書くプログラム [#o5846baa]

 #define MOVE_TIME 270
 task main()

 sub turn_left()
 {  OnFwd(OUT_A+OUT_C);
    OnRev(OUT_B);
    Wait(55);
    OnRev(OUT_A);
    OnFwd(OUT_C);
    Wait(MOVE_TIME);
    OnRev(OUT_A+OUT_B+OUT_C);
    Wait(100)
 }

 sub turn_left()
 {  OnFwd(OUT_A+OUT_C);
    OnRev(OUT_B);
    Wait(55);
    OnRev(OUT_A);
    OnFwd(OUT_C);
    Wait(MOVE_TIME/2);
    OnRev(OUT_A+OUT_B+OUT_C);
    Wait(100)
 }

 {
   1  OnFwd(OUT_A+OUT_B+OUT_C); //ペンをつけて前進 1〜3行目;一画目
   2  Wait(40); //
   3  OnRev(OUT_B); //ペンを離す
   4   turn_right();
   5  OnFwd(OUT_A+OUT_C); //
   6  Wait(80); //
   7   OnRev(OUT_A+OUT_C); //
   8  OnFwd(OUT_B); //ペンをつける 8〜11行目;二画目
   9  OnRev(OUT_A+OUT_C); //前進
   10  Wait(160); //
   11  OnRev(OUT_B); //ペンを離す
   12  OnFwd(OUT_A+OUT_C); //前進 12〜16行目;三画目の位置まで移動
   13  Wait(120); //
   14  turn_left(); //
   15  OnFwd(OUT_A+OUT_C); //
   16  Wait(40); //
   17  OnFwd(OUT_A+OUT_B+OUT_C); //ペンをつけて前進 17〜21行目;三画目
   18  Wait(80); //
   19  OnRev(OUT_A+OUT_B+OUT_C); //
   20  Wait(80); //
   21  turn_left(); //ペンを離して左折 21行目;四画目の位置まで移動
   22  OnFwd(OUT_A+OUT_B+OUT_C); //ペンをつける 22〜34行目;四画目の前半
   24  turn_right(); //
   25  OnFwd(OUT_A+OUT_B+OUT_C); //ペンをつける 25〜26行目;四画目の後半
   26  OnRev(OUT_A+OUT_B+OUT_C); //ペンを離す 26〜33行目;五画目
   27  Wait(80); //
   28  turn_right(); //
   29  OnFwd(OUT_A+OUT_C) 
   30  turn_right(); //
   31  OnFwd(OUT_A+OUT_C); //前進
   32  Wait(40); //
   33  OnRev(OUT_A+OUT_C); //後退
   34  OnFwd(OUT_B); //ペンをつけて後退 34〜36行目;五画目
   35  Wait(160); //
   36  Off(OUT_A+OUT_B+OUT_C); //ペンを離して停止     
 }



* 「本」を書くプログラム [#pf9bd47b]

  #define MOVE_TIME 260  // MOVE_TIMEという定数を定義(値は260)

  sub turn_left()
  {
    OnFwd(OUT_A+OUT_C);
    OnRev(OUT_B);
    Wait(55);
    OnRev(OUT_A);
    OnFwd(OUT_C);
    Wait(MOVE_TIME);
    OnRev(OUT_A+OUT_C+ OUT_B);
    Wait(100);
  }

  sub turn_right()
  {
    OnFwd(OUT_A+OUT_C);
    OnRev(OUT_B);
    Wait(55);
    OnFwd(OUT_A);
    OnRev(OUT_C);
    Wait(MOVE_TIME/2);
    OnRev(OUT_A+OUT_C+ OUT_B);
    Wait(100);
  }

  task main()
  {
    OnRev(OUT_B);      //ペンを上げる
    Wait(10);
    OnFwd(OUT_A+OUT_C); //直進
    Wait(30);

    OnFwd(OUT_B);     //一画目
    Wait(200);

    OnRev(OUT_B);     //ペンを上げる
    Wait(30);

    turn_left();       // 左90度に曲がる

    OnFwd(OUT_A+OUT_C); //直進
    Wait(120);

    turn_left();       // 左90度に曲がる

    OnFwd(OUT_A+OUT_C); //直進
    Wait(160);

    turn_left();       // 左90度に曲がる

    OnFwd(OUT_A+OUT_C); //直進
    Wait(60);

    OnFwd(OUT_B);     //二画目
    Wait(200);

    OnRev(OUT_B);      //ペンを上げる
    Wait(60);
    OnRev(OUT_A+OUT_C); //後退
    Wait(140);

    turn_right();       // 右45度に曲がる

    OnRev(OUT_A+OUT_C); //後退
    Wait(30);
    OnFwd(OUT_A+OUT_C); //直進
    Wait(30);

    OnFwd(OUT_B);     //三画目
    Wait(140);

    OnRev(OUT_B);      //ペンを上げる
    Wait(60);
    OnRev(OUT_A+OUT_C); //後退
    Wait(200);

    turn_left();        // 左90度に曲がる

    OnRev(OUT_C+OUT_A); //後退
    Wait(30);
    OnFwd(OUT_A+OUT_C); //直進
    Wait(30);

    OnFwd(OUT_B);     //四画目
    Wait(140);

    OnRev(OUT_B);     //ペンを上げる
    Wait(60);
    OnRev(OUT_A+OUT_C); //後退
    Wait(100);

    turn_right();      // 右45度に曲がる

    OnRev(OUT_C+OUT_A); //後退
    Wait(100);

    OnFwd(OUT_C+OUT_A+OUT_B);//五画目
    Wait(40);

    Off(OUT_A+OUT_C+ OUT_B);//停止
  }
* 苦労した点 [#ieeb2793]

-部品の制限

 ロボットを作るにあたって、ペンを上げ下げする為の部品と、ロボット自体を動かす為の部品がなくてはいけないのですが、私たちのロボットはペンを上げ下げする部品にギアを使っている為に、車輪を回すのに丁度良い部品がなくなってしまいました。

-重心の偏り

 このロボットは、ペンを上げ下げするためのモーターが右に偏っている為に、必要最低限の部品だけにした場合右に傾いてしまって、全身する時にだんだんと右にカーブしてしまいます。

-コードの不調

 動作の確認中に、コードが使えなくなってしまい、長いコードを使わなければならなくなってしまい、その処理に苦労しました。

-ペンの位置と回転軸のずれ

 ペンの位置がロボットの回転軸がずれているので、ロボットの中心で線をイメージして動かすとうまく文字にならないので、そこをうまくコントロールするのに苦労しました。

* 工夫した点 [#r44ba0c3]

-後輪駆動

 このロボットはペンを上げ下げする為にギアを使っていて、四つの車輪を同じギアで動かすことはできません。なので、前輪を動かすことは諦めて、後輪のみを動かすことにしました。

-直角に曲がる

 ペンを下ろしたままでカーブをした場合、ペンの位置を軸にして回転している訳ではないので、うまく直角に曲がる線は書けないので、したのプログラムを使って直角に曲がりました。


 #define MOVE_TIME 270
 task main()
 {
    OnFwd(OUT_A+OUT_C);
    OnRev(OUT_B);
    Wait(55);
    OnRev(OUT_A);
    OnFwd(OUT_C);
    Wait(MOVE_TIME);
    OnRev(OUT_A+OUT_C+ OUT_B);
    Wait(100);
    Off(OUT_A+OUT_C+ OUT_B);
 }


-骨組と肉付け

 プログラムに何かミスがあった場合にわかりやすくする為に、まずはカーブでのずれなどは気にせずに作ったプログラミングを用意し、そのあとに上に書いたような直角に曲がるラインを書くためのプログラムを入れていくという方法でプログラムを作りました。
-プログラムソースが整形済みテキスト部からはみ出ているのを直しておきましょう。本のプログラムにコメントをつけましょう。また市のプログラムのほうも、「市」のどこの部分を書いているかわかるようにコメントをつけましょう。 -- [[まいける(TA)]] &new{2007-11-07 (水) 19:01:13};
-サブルーチンやマクロ、関数などを使って読みやすく改良しやすいプログラムにしましょう。 -- [[松本]] &new{2007-11-22 (木) 13:40:55};
-整形済みテキストがとびとびになってますが、それも直してください。 -- [[まいける(TA)]] &new{2007-12-06 (木) 14:59:01};

#comment

[[2007b/A1]]


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