目次
#contents
*Mission1について [#mb754557]
書道ロボットを作り、自分の名前の中から1文字選び、それをロボットに書かせるという課題でした。
*の紹介 [#p4b9127d]
 当初は何も思いつかず、最初に作った前後左右に動くロボットの脇からアームを伸ばし、ペンを取り付けるだけの単純なロボットを組み立てました。
&ref(2014b/Member/edaeda/Mission1/IMG_3304 イ?ト・gif.gif,50%,画像の説明);
**機能 [#v6be992d]
 紙の上をロボットが動き、そこにペンの上げ下げの動作を加えることにより、文字を書くことを可能にしました。
***ペン [#jd7dcb42]
 ペンをどのようにしてロボット本体に取り付けようか悩んだ結果、長いブロックに輪ゴムで固定して、それを本体の脇から伸ばしたアームに取り付けました。
 またアームを下げた際にペンが上にスライドしてしまい、もう一度アームを下げるときにペン先が紙に接地しなくなってしまったので、そうならないようにペンが上下しないようにも、もう一か所輪ゴムで固定しました。
***モーター [#p5618ab5]
 モーター2つを両側のタイヤに、1つをペンの上げ下げに用いました。

*プログラム [#t2e1dae2]
 float GetAngle(float d)
 {
  const float diameter = 5.45;
  const float pi=3.1415;
  float ang =d/(diameter*pi)*360.0;
  return ang;
 }
 #define SPEED 50
 #define Ninety GetAngle(16.5)
 #define ten GetAngle(10)
 #define Five GetAngle(5)
 #define Eight GetAngle(8)
 #define HalfNinety GetAngle(8.25)
 #define NineRight RotateMotor(OUT_C,SPEED,Ninety); RotateMotor(OUT_BC,-SPEED,Ten);
 #define NineLeft RotateMotor(OUT_B,SPEED,Ninety); RotateMotor(OUT_BC,-SPEED,Ten);
 #define HalfNineLeft RotateMotor(OUT_BC,SPEED,Five); RotateMotor(OUT_B,SPEED,HalfNinety); RotateMotor(OUT_BC,-SPEED,Eight);
 #define HalfNineRight RotateMotor(OUT_BC,SPEED,Five); RotateMotor(OUT_C,SPEED,HalfNinety); RotateMotor(OUT_BC,-SPEED,Eight);
 #define PenUp RotateMotor(OUT_A,SPEED,-50);
 #define PenDown RotateMotor(OUT_A,SPEED,50);
 #define GoGo RotateMotor(OUT_BC,SPEED ,angle);
 #define BackBack RotateMotor(OUT_BC,SPEED ,-angle);
 #define GoUp GoGo;PenUp;
 #define NineLeftGoGo2NineLeftDown NineLeft;GoGo;NineLeft;GoGo;NineLeft;PenDown;
 #define NineLeftDownBackUp HalfNineLeft;PenDown;BackBack;PenUp;
 #define Plus(t) angle += GetAngle(t);
 #define Minus(s) angle -= GetAngle(s);

 task main()
 {
  Wait(2000);
  Int angle = GetAngle(7);
   GoUp;
  Minus(3.5);//3.5cm進む
   NineLeftGoGo2NineLeftDown;
  Plus(11.5);//15
   GoUp;
  Minus(2);//13
   BackBack;HalfNineRight;PenDown;
  Minus(9);//4
   GoUp;BackBack;NineLeft;PenDown;GoUp;BackBack;HalfNineLeft;GoGo;PenDown;
  Plus(3);//7
   GoUp;
  Minus(3.5);//3.5
   NineLeftGoGo2NineLeftDown;
  Plus(2.5);//6
   GoUp;
  Plus(5.3137);//11.3137
   HalfLeftDownBackUp;HalfNineLeft;
  Minus(5.3137);//6
   GoGo;
  Plus(3.3137);//9.3137
   HalfLeftDownBackUp;
 }
**定義 [#baee514f]
 #define SPEED 50
 #define ten GetAngle(10)
 #define Five GetAngle(5)
 #define Eight GetAngle(8)
 #define Ninety GetAngle(16.5)
 #define HalfNinety GetAngle(8.25)
 ↑それぞれ90°、45°曲がるときに必要な進む距離、そのほかよく使う距離や速さを定義しました。
 #define NineRight RotateMotor(OUT_C,SPEED,Ninety); RotateMotor(OUT_BC,-SPEED,Ten);
 #define NineLeft RotateMotor(OUT_B,SPEED,Ninety); RotateMotor(OUT_BC,-SPEED,Ten);
 ↑90°左右に回転するプログラムです。片方のタイヤが90°分回転したあと、ペン先の位置が合うように後退するようにプログラムしました。
 #define HalfNineLeft RotateMotor(OUT_BC,SPEED,Five); RotateMotor(OUT_B,SPEED,HalfNinety); RotateMotor(OUT_BC,-SPEED,Eight);
 #define HalfNineRight RotateMotor(OUT_BC,SPEED,Five); RotateMotor(OUT_C,SPEED,HalfNinety); RotateMotor(OUT_BC,-SPEED,Eight);
 ↑45°左右に回転するプログラムです。NineRight、NineLeftと同様に、片方のタイヤが45°分回転したあと、ペン先の位置が合うように後退するようにプログラムしました。
 #define PenUp RotateMotor(OUT_A,SPEED,-50);
 #define PenDown RotateMotor(OUT_A,SPEED,50);
 ↑ペンを上げ下げするプログラムです。
 #define GoGo RotateMotor(OUT_BC,SPEED ,angle);
 #define BackBack RotateMotor(OUT_BC,SPEED ,-angle);
 ↑ロボットが前進、後退するプログラムです。その時のangleの値分前進、後退します。
 #define GoUp GoGo;PenUp;
 #define NineLeftGoGo2NineLeftDown NineLeft;GoGo;NineLeft;GoGo;NineLeft;PenDown;
 #define NineLeftDownBackUp HalfNineLeft;PenDown;BackBack;PenUp;
 ↑繰り返し行う動作の入力を省略するためのプログラムです。
 #define Plus(t) angle += GetAngle(t);
 #define Minus(s) angle -= GetAngle(s);
 ↑angleの値を足し引きして、定義するためのプログラムです。

**main関数 [#ncfed52f]
 task main()
 {
  Wait(2000);
  Int angle = GetAngle(7);
   GoUp;
  Minus(3.5);//3.5cm進む
   NineLeftGoGo2NineLeftDown;
  Plus(11.5);//15
   GoUp;
  Minus(2);//13
   BackBack;HalfNineRight;PenDown;
  Minus(9);//4
   GoUp;BackBack;NineLeft;PenDown;GoUp;BackBack;HalfNineLeft;GoGo;PenDown;
  Plus(3);//7
   GoUp;
  Minus(3.5);//3.5
   NineLeftGoGo2NineLeftDown;
  Plus(2.5);//6
   GoUp;
  Plus(5.3137);//11.3137
   HalfLeftDownBackUp;HalfNineLeft;
  Minus(5.3137);//6
   GoGo;
  Plus(3.3137);//9.3137
   HalfLeftDownBackUp;
 }
 ↑main関数は自分でもプログラムを把握しやすいように、動作をするプログラムの行と、angleの値を変えるプログラムの行を、一行ずつ交互にまとめました。
**苦労した点 [#ze01c9d6]
 今回私は「枝」という文字を書くことにしたのですが、書き順を無視してもロボットの走行距離が相当長くなってしまったので、曲がった時に少しでもロボットの位置がずれてしまうと、後半に大きくずれてしまうのが問題でした。そうならないために、90°、45°曲がるプログラムを何度も試しては修正して、正確に調節することに苦労しました。
*結果 [#t430f487]
 &ref(2014b/Member/edaeda/Mission1/image1.JPG,10%,画像の説明);
 左図のように本番に紙が少しずれてしまったこともありましたが、やはり走行距離が長いため、ペンを降ろす時の反動や、曲がるときの後ろのタイヤの向きなどによって、ずれが生じてしまいました。
*反省と感想 [#w4fe0249]
 今回はいかに正確なプログラムを仕上げ、本番までにロボットに安定した動きをさせられるかが自分にとっての課題でしたが、他の人のロボットを見てみると、ロボット自体をもっと工夫していれば、プログラムも簡単なものにできたのではないかと感じました。またプログラムもtask main()の中の文字数が結構多くなってしまったので、Misson2ではもっとtask main()の中を単純なプログラムのみにしたいと思います。
 今回はいかに正確なプログラムを仕上げ、本番までにロボットに安定した動きをさせられるかが自分にとっての課題でしたが、他の人のロボットを見てみると、ロボット自体をもっと工夫していれば、プログラムも簡単なものにできたのではないかと感じました。またプログラムもtask main()の中の文字数が結構多くなってしまったので、Mission2ではもっとtask main()の中を単純なプログラムのみにしたいと思います。またペンではなく、クッション性のある筆ペンにするなどまだまだ工夫できるところがあったので、この課題だけではなくすべての事柄に対して、まだまだ改善するところがあるのではないかと考えることが重要だと思いました。

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