目次

課題

今回の課題は、似顔絵を描くロボットを作ることである。
詳しくはこちら

ロボット本体の説明

本体の説明

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

zentaizou

ペン部分の説明

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

pen1
pen2

似顔絵の作成

下書き

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

kao

描き順

下図のように、1〜13の順で描いた。

kakijyun

プログラムの説明

定義の説明

旋回、前進後退の時間の定義である。

#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);

実際に使ったプログラム

#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);             //口終了
} 

結果

写真を撮るのを忘れたため写真は掲載できません。
輪郭は下書き通りにうまく書くことができた。 下書き通りうまく描くことは出来なかったが、何とか顔の中に目や口のパーツを収めることができてよかった。
しかし、顔のパーツの位置が全体的に右側に1儖未困譴討靴泙辰燭里任發辰隼邱垪誤するべきだった。
具体的には、髪を描き終わったあとの旋回のあとに1回バックするプログラムを書きやペンを下ろしている時間と顔の幅を計算した上で目の長さを短くする必要があったと思う。

感想・反省点

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


添付ファイル: fileIMG_1266 (1).JPG 135件 [詳細] fileimage2.JPG 149件 [詳細] fileIMG_3623.JPG 155件 [詳細] fileIMG_3624.JPG 157件 [詳細] fileIMG_3641.JPG 150件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-08-04 (木) 10:09:42 (1117d)