#author("2019-11-19T00:03:50+09:00","udon","udon")
#author("2019-11-21T23:31:06+09:00","udon","udon")
*目次 [#b381e73d]
#contents

*課題1:お絵描きロボット [#x68f0e8a]
チームメイトの似顔絵を描くロボットを製作しなさい。以下の点に注意すること。

マクロや関数、サブルーチンなどを使い、main関数がなるべく単純になるようにプログラムを作ること。
変数名、定数名、関数名、マクロ名などは分かりやすい名前を用いること
余裕をもってA4の紙の中に収まる大きさにすること。いくら小さくてもよい。
ペン以外はキットの部品を使うこと
キットに付属の輪ゴムは切れやすく高価なので、輪ゴムを使う場合は別途支給する輪ゴムを使うこと。


*ロボットの説明 [#gd24d4d4]
**絵の描き方 [#ga7af428]
 まずチームメイトの似顔絵を描くにあたって、
+輪郭を描く。
+髪の毛を描く。
+目を描く。
+口を描く。
+鼻を描く。
の順で描いていった。
**ロボットの全体像 [#n7a4a593]
今回の課題に用いたロボットは、
#ref(IMG_1301.jpg),around,
今回の課題では、下の写真のロボットを用いて行った。
#ref(IMG_1301.jpg)
このロボットを組み立てるとき、下の写真のように鉛筆の位置が前輪の中央に来るようにし、鉛筆の軌跡がロボットの軸上に重なることで、ロボットの動きが最小限で済むように工夫した。
#ref(IMG_1326.jpeg)
また、このロボットはタイヤを動かすのとは別に、鉛筆の上げ下げをするためにもう一つのモーターを用いた。
#ref(IMG_1303 (1).jpg)
*プログラミングの説明 [#tdcd9db5]
**鉛筆の上げ下げ [#mb5e673d]
 #define up OnFwd(OUT_C,-20);Wait(300);Off(OUT_C);
 #define down OnFwd(OUT_C,20);Wait(400);Off(OUT_C);
このプログラミングでモーターが回転することにより、モーターにとりつけた鉛筆を上げ下げできるようになった。
また、[down]の時間を長くすることによって、鉛筆をより強く紙に押し付け、筆圧が弱くならないにした。

**前進と左回り [#e75d026e]
  sub turn_left(int l,int m)
 { OnFwd(OUT_A,l);
  Off(OUT_B);
  Wait(m);
  Off(OUT_A);
 }
 sub go_forward(int t,int s)
 { OnFwd(OUT_AB,s);
  Wait(t);
  Off(OUT_AB);
 }
main関数を簡略化するため、このようにサブルーチン関数を使って前進と左回りをプログラミングした。
**回転 [#ddfa2703]
 float GetAngle(float d)
 {  const float diameter=5.45;
    const float pi=3.1415;
    const float distance=11.15;
    float ang=(distance*d)/diameter;
    return ang;
 }
このプログラミングでロボットの中心を軸に回転できるようにした。

**main関数 [#fb0ea87a]
似顔絵を描くのに今回は下に示したプログラミングをした。
 task main()
 {  go_forward(600,50);
    turn_left(50,2800);
    go_forward(600,50);
    turn_left(50,2800);
    up;
ここまでで輪郭を描いた。
   go_forward(500,40);
   int anglea=GetAngle(65.0);
   RotateMotorEx(OUT_AB,SPEED,anglea,-100,true,true);
   down;
   go_forward(500,40);
   Wait(1000);
   up;
   int angleb=GetAngle(65);
   RotateMotorEx(OUT_AB,SPEED,angleb,-100,true,true);
   down;
   go_forward(800,40);
   up;
これで髪の毛を描いた。
   go_forward(500,40);
   int anglea=GetAngle(65.0);
   RotateMotorEx(OUT_AB,SPEED,anglea,-100,true,true);
   down;
   go_forward(500,40);
   Wait(1000);
   up;
   int angleb=GetAngle(65);
   RotateMotorEx(OUT_AB,SPEED,angleb,-100,true,true);
   down;
   go_forward(800,40);
   up;
これで髪の毛から移動して目を描いた。
   int angled=GetAngle(120.0);
   RotateMotorEx(OUT_AB,SPEED,angled,100,true,true);
   Wait(500);
   go_forward(550,40);
   int anglee=GetAngle(100.0);
   RotateMotorEx(OUT_AB,SPEED,anglee,100,true,true);
   down;
   go_forward(300,40);
   up;
これで目から移動して口を描いた。
   int anglef=GetAngle(140.0);
   RotateMotorEx(OUT_AB,SPEED,anglef,100,true,true);
   go_forward(350,40);
   int angleg=GetAngle(50.0);
   RotateMotorEx(OUT_AB,SPEED,angleg,-100,true,true);
   down;
   go_forward(350,40);
   up;
 }
これで口から移動して鼻を描き、完成!

*完成した似顔絵 [#r999c9bc]
#ref(IMG_1315.jpg)
*今回の課題の反省点や感じたこと [#jd93f015]
今回の課題では、プログラミング上で想定した動きと、実際のロボットの動きがモーターの調子や、タイヤと紙の摩擦などによって、大きな誤差が生じてしまったため、それを調節するのにとても苦労した。

また、完成した似顔絵も曲線をうまく描くことが難しかったため、あまりチームメイトに似てなかったので、また機会があればもっとうまく描けるようにしたいと思った。


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