目次
#contents

*課題 [#uf6cc320]
今回の課題は、似顔絵を描くロボットを作ることである。~
詳しくは[[こちら:http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMission1]]

*ロボット本体の説明 [#o8811721]

**本体の説明 [#h51b7730]

2つのモーター(A,C)を用いて本体の前後の動作を行っている。~

&ref(2016a/Member/michiya/Mission1/IMG_3641.JPG,50%,zentaizou);

**ペン部分の説明 [#a2ceef28]

モーター(B)とタイヤ2つを用いてベンの上下の動作を行っている。~
モーターとギアを噛み合わせてタイヤ2つを動かしている。~
タイヤ2つで挟むだけでは安定しなかったのでグレーのパーツで固定し、安定させた。

&ref(2016a/Member/michiya/Mission1/IMG_3624.JPG,50%,pen1);~
&ref(2016a/Member/michiya/Mission1/IMG_3623.JPG,50%,pen2);

*似顔絵の作成 [#z1822482]
**下書き [#xeda085f]

プログラミングしやすいように角ばった顔にした。~
旋回によってペン先がずれてしまうため、一度後退してからペン先をあわせるようにした。~

&ref(2016a/Member/michiya/Mission1/image2.JPG,25%,kao);

**描き順 [#g347dd0b]
下図のように、1〜13の順で描いた。~

&ref(2016a/Member/michiya/Mission1/IMG_1266 (1).JPG,120%,kakijyun);

*プログラムの説明 [#yaa38967]
**定義の説明 [#j5f9361e]
旋回、前進後退の時間の定義である。
 #define TURN_TIMEi   125
 #define TURN_TIMEii   90
 #define TURN_TIMEiii   46
 #define TURN_TIMEiv   80  
 #define TURN_TIMEv   200
 #define forword_TIME   50


ペンの上下運動の定義である。
 #define down OnFwd(OUT_B);Wait(10);Off(OUT_B);
 #define up OnRev(OUT_B);Wait(10);Off(OUT_B);


直進、左右旋回の定義である。(行変更の際の記号が¥となっている)
 #define go_forward(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC);
 #define turn_right_i up;OnRev(OUT_AC);Wait(50);  \
                      OnRev(OUT_C); OnFwd(OUT_A);Wait(TURN_TIMEi);  \
                      go_forward(forword_TIME);down;Off(OUT_ABC);                     
 #define turn_left_i up;OnRev(OUT_A); OnFwd(OUT_C);Wait(TURN_TIMEv);  \
                     go_forward(forword_TIME);                     
 #define turn_right_ii up;OnRev(OUT_AC);Wait(50);  \
                       OnRev(OUT_C); OnFwd(OUT_A);Wait(TURN_TIMEii);  \
                       go_forward(forword_TIME);down;Off(OUT_ABC);                    
 #define turn_left_ii up;OnRev(OUT_AC);Wait(50);  \
                      OnRev(OUT_A); OnFwd(OUT_C);Wait(TURN_TIMEii);  \
                      go_forward(forword_TIME);down;Off(OUT_ABC);                     
 #define turn_right_iii up;OnRev(OUT_AC);Wait(50);  \
                        OnRev(OUT_C); OnFwd(OUT_A);Wait(TURN_TIMEiii);  \
                        go_forward(forword_TIME);down;Off(OUT_ABC);                   
 #define turn_right_iv up;OnRev(OUT_AC);Wait(40);  \
                        OnRev(OUT_C); OnFwd(OUT_A);Wait(TURN_TIMEiv);  \
                        go_forward(forword_TIME);down;Off(OUT_ABC);   


直進、左右旋回の定義を利用して、実際にプログラム本文でよく使う定義である。                
 #define face(t) turn_right_iii; go_forward(t);                               
 #define face_i(t) turn_right_ii; go_forward(t);
 #define face_ii(t) turn_right_iv; go_forward(t);
 #define face_iii(t) turn_left_ii; go_forward(t);

**実際に使ったプログラム [#p9bbdbd2]
 #define TURN_TIMEi   125
 #define TURN_TIMEii   90
 #define TURN_TIMEiii   46
 #define TURN_TIMEiv   80  
 #define TURN_TIMEv   200
 #define forword_TIME   50
 #define down OnFwd(OUT_B);Wait(10);Off(OUT_B);
 #define up OnRev(OUT_B);Wait(10);Off(OUT_B);
 #define go_forward(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC);
 #define turn_right_i up;OnRev(OUT_AC);Wait(50);  \
                      OnRev(OUT_C); OnFwd(OUT_A);Wait(TURN_TIMEi);  \
                      go_forward(forword_TIME);down;Off(OUT_ABC);                     
 #define turn_left_i up;OnRev(OUT_A); OnFwd(OUT_C);Wait(TURN_TIMEv);  \
                     go_forward(forword_TIME);                     
 #define turn_right_ii up;OnRev(OUT_AC);Wait(50);  \
                       OnRev(OUT_C); OnFwd(OUT_A);Wait(TURN_TIMEii);  \
                       go_forward(forword_TIME);down;Off(OUT_ABC);                    
 #define turn_left_ii up;OnRev(OUT_AC);Wait(50);  \
                      OnRev(OUT_A); OnFwd(OUT_C);Wait(TURN_TIMEii);  \
                      go_forward(forword_TIME);down;Off(OUT_ABC);                     
 #define turn_right_iii up;OnRev(OUT_AC);Wait(50);  \
                        OnRev(OUT_C); OnFwd(OUT_A);Wait(TURN_TIMEiii);  \
                        go_forward(forword_TIME);down;Off(OUT_ABC);                   
 #define turn_right_iv up;OnRev(OUT_AC);Wait(40);  \
                        OnRev(OUT_C); OnFwd(OUT_A);Wait(TURN_TIMEiv);  \
                        go_forward(forword_TIME);down;Off(OUT_ABC);   
 #define face(t) turn_right_iii; go_forward(t);                               
 #define face_i(t) turn_right_ii; go_forward(t);
 #define face_ii(t) turn_right_iv; go_forward(t);
 #define face_iii(t) turn_left_ii; go_forward(t);
 task main()
 {
      OnFwd(OUT_B);
      Wait(3);
      Off(OUT_B);
      go_forward(100);
      face(32);
      face(80);
      face(32);
      face(100);                
      face_i(110);             //輪郭終了
      face_i(25);
      face_ii(50);
      face_i(20);
      face_iii(60);            //髪終了
      turn_left_i;
      go_forward(30);
      repeat(2){
      go_forward(30);
      down;
      go_forward(30);
      up;                      //目終了
 }
      OnRev(OUT_C); 
      OnFwd(OUT_A);
      Wait(TURN_TIMEi);
      go_forward(TURN_TIMEiii);
      OnRev(OUT_C);
      OnFwd(OUT_A);
      Wait(TURN_TIMEiv);
      go_forward(TURN_TIMEi);
      down;
      go_forward(forword_TIME);
      Off(OUT_ABC);             //口終了
 } 

*結果 [#k42d9a05]
写真を撮るのを忘れたため写真は掲載できません。~
下書き通りうまく描くことは出来なかったが、何とか顔の中に目や口のパーツを収めることができてよかった。~
しかし、顔のパーツの位置がうまくいかなかったのでもっと試行錯誤するべきだった。~
具体的には、髪を描き終わったあとの旋回の時間やペンを下ろしている時間と顔の幅を計算することが必要だったと思う。~
輪郭はペン先をうまく合わせることができたので下書きと大体同じになって良かった。


*感想・反省点[#ffa246d0]
顔のパーツを顔の中に収めるようにプログラミングするのが難しかった。~
また、一画かき終わった後にその続きから顔を描けるようにペン先をあわせるのが大変だった。~
repeatやdefineをもっとうまく使いこなしてコンパクトなプログラムにするべきだった。~
電池の減り具合でロボットの動きのスピードが変わってしまい苦戦した。~
ペンを上下させるシステムはうまく作れたと思う。
次の課題も頑張りたい。



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