#author("2020-02-04T20:00:13+09:00","Hayashi","Hayashi")
#author("2020-02-04T20:01:06+09:00","Hayashi","Hayashi")
[[2019b/Member]]
#contents
*課題1 [#aace72a7]
相方の似顔絵を描くロボットを作る

*ロボットの説明 [#s2e22e5b]  [#b23454de]
このロボットを動かして,以下の順番で描く
+まず,顔の輪郭を描く
+次に,口を描く
+そして,目を描く
#ref(005.JPG)
このロボットを使う上で,最初は顔の輪郭をカクカクにしようとしましたが,丸くした方がうまく書けたため,そのように変更しました.
#ref(001.JPG)
このロボットでは,下写真の,下の三つのタイヤで移動するようにし,真ん中のアームの部分を,上にするときには,何も描かず,アームを降ろしたときに移動しながら顔を描けるようにしました.
このロボットは,前輪の位置でペンが上がったり下がったりできるように,ペンを固定するように,アームをとりつけました.なので,タイヤがどのように曲がるのかをしっかり関数を使って決めておくことが大事でした.

欠点としては,後ろのタイヤ(モーターの使わない部分)を最初にまっすぐにしないとしっかり直進してくれないことが挙げられます.また,車体がかなり重くなっていたため,曲がる時に,ガクガクに動いていたので,軽量化の必要性も感じました.

*プログラムの説明 [#l97137b4]
**使用したプログラム [#l2d40185]
 #define SPEED 30
 #define go6 OnFwd(OUT_BC,SPEED);Wait(1500);Off(OUT_BC);
 #define go2 OnFwd(OUT_BC,SPEED);Wait(500);Off(OUT_BC);
 #define go1 OnFwd(OUT_BC,SPEED);Wait(300);Off(OUT_BC);
 float GetAngle(float d)
 {
  const float diameter = 5.5;
  const float distance=12;
  float ang = (distance*d)/diameter;
  return ang;
 }
 task main()
 {
  go6;
  int angle1 = GetAngle(360);
  RotateMotor(OUT_B,SPEED,angle1);
  go6;
  RotateMotor(OUT_B,SPEED,angle1);
  RotateMotor(OUT_A,SPEED,30);
  int angle2 = GetAngle(90);
  RotateMotorEx(OUT_BC,SPEED,angle2,-100,true,true);
  go2;
  RotateMotor(OUT_A,-SPEED,30);
  go2;
  RotateMotor(OUT_A,SPEED,30);
  go2;
  int angle3 = GetAngle(120);
  RotateMotorEx(OUT_BC,SPEED,angle2,100,true,true);
  go2;
  RotateMotorEx(OUT_BC,SPEED,angle2,100,true,true);
  go2;
  RotateMotor(OUT_A,-SPEED,30);
  go2;
  RotateMotor(OUT_A,SPEED,30);
  go1;
  RotateMotor(OUT_A,-SPEED,30);
  go2;
  RotateMotor(OUT_A,SPEED,30);
 }
**使ったもの [#q6b032e0]

関数;
 float GetAngle(float d)
 {
  const float diameter = 5.5;
  const float distance=12;
  float ang = (distance*d)/diameter;
  return ang;
 }
車体を回す角度をこの関数によって,設定しました.

定義;
 #define SPEED 30
 #define go6 OnFwd(OUT_BC,SPEED);Wait(1500);Off(OUT_BC);
 #define go2 OnFwd(OUT_BC,SPEED);Wait(500);Off(OUT_BC);
 #define go1 OnFwd(OUT_BC,SPEED);Wait(300);Off(OUT_BC);
go6,go2,go1,というふうに直進する距離や,速さを定義しました.

taskmainの仕組み;
#ref(004_LI.jpg)
 go6;
 int angle1 = GetAngle(360);
 RotateMotor(OUT_B,SPEED,angle1);
まず,顔の輪郭の縦の長い部分�、���,頭の部分�□���までを描く

 go6;
 RotateMotor(OUT_B,SPEED,angle1);
そして,��→�あ��,如じ気琉銘屬北瓩�

 RotateMotor(OUT_A,SPEED,30);
 int angle2 = GetAngle(90);
 RotateMotorEx(OUT_BC,SPEED,angle2,-100,true,true);
 go2;
 RotateMotor(OUT_A,-SPEED,30);
 go2;
 RotateMotor(OUT_A,SPEED,30);
 go2;
ペンを上げて,�,�90度左回転した後,�、��い泙如つ樟�で,少しだけ進み,ペンを降ろし,口を描いた後,ペンを上げて,少し進んで,�い謀�達(ペンは上がった状態)
ペンを上げて,�,�90度左回転した後,�、��い諒�向で,少しだけ進み,ペンを降ろし,口を描いた後,ペンを上げて,少し進んで,�い謀�達(ペンは上がった状態)

 RotateMotorEx(OUT_BC,SPEED,angle2,100,true,true);
 go2;

�い琉銘屬如�90度右回転し,�あ��イ泙念榮�

 RotateMotorEx(OUT_BC,SPEED,angle2,100,true,true);
 go2;
 RotateMotor(OUT_A,-SPEED,30);
 go2;
 RotateMotor(OUT_A,SPEED,30);
 go1;
 RotateMotor(OUT_A,-SPEED,30);
 go2;
 RotateMotor(OUT_A,SPEED,30);
�イ琉銘屬�90度右回転し,少し進んで,ペンを降ろし,左目を描いて,ペンを上げ,少し進んで,ペンを降ろし,右目を描いて,終了


*まとめ [#t7e4c65a]
車体をなるべく軽くすることで,曲がる負担を減らすことが大事だったと思います

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