はじめに

課題は似顔絵を描くロボットの製作である。

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

2016年度前期 課題1より)

ロボットの説明

DSC_0731.png


DSC_0733.png

サンプルのロボットにペンを持つためのアームを取り付けた。
輪ゴムは使用していないが、できるだけ少ない部品でしっかり固定されるように工夫した。

プログラムの説明

プログラム

#define turn_left(t,w1,w2) OnFwd(OUT_A,w1); OnRev(OUT_C,w2); Wait(t);Off(OUT_AC); //左に曲がる
#define turn_right(t,w1,w2) OnFwd(OUT_C,w1); OnRev(OUT_A,w2); Wait(t);Off(OUT_AC); //右に曲がる
#define pen_up OnFwd(OUT_B,8);Wait(1000);Off(OUT_B); //ペン先を上げる
#define pen_down OnRev(OUT_B,8);Wait(1010);Off(OUT_B); //ペン先を下げる
#define go_rev(t,s1,s2) OnRev(OUT_A,s1); OnRev(OUT_C,s2); Wait(t); Off(OUT_AC); //後退する
#define go_fwd(t,s1,s2) OnFwd(OUT_A,s1);OnFwd(OUT_C,s2);Wait(t);Off(OUT_AC); //前進する
#define nouse turn_right(300,30,30);go_fwd(200,30,30); //鼻を描く
#define en1 OnFwd(OUT_A,20);OnFwd(OUT_C,50);Wait(5500);Off(OUT_AC); //輪郭を描く
#define mayu pen_down;go_fwd(300,40,45);pen_up;go_fwd(500,40,40);pen_down;go_fwd(300,40,40);pen_up; //眉を描く
#define kami OnRev(OUT_A,30);Wait(400);Off(OUT_AC);OnRev(OUT_C,30);Wait(400);Off(OUT_AC); //髪を描く
#define eye pen_down;turn_right(200,20,20);pen_up;turn_left(200,20,20);go_fwd(500,50,65);pen_down;turn_right(200,20,20);pen_up; //目を描く
task main(){
       pen_up ;
	pen_down ;
	en1 ;
	pen_up ;
	pen_down;
     repeat(6){
	kami;
      }
	pen_up;
	turn_right(300,50,50); //移動
	go_fwd(500,50,50);
	pen_down;
	go_fwd(350,40,40); //口を描く
	pen_up;
	go_rev(500,50,50); //移動
	turn_left(300,30,30);
	go_fwd(300,40,40)
	pen_down;
	nouse;
	pen_up;
        go_rev(400,40,40); //移動
	turn_left(200,40,40);
	eye;
        go_rev(600,50,65); //移動
        mayu;
}

工夫したところの説明

#define turn_left(t,s1,s2) OnFwd(OUT_A,s1); OnRev(OUT_C,s2); Wait(t);Off(OUT_AC); //左に曲がる
#define turn_right(t,s1,s2) OnFwd(OUT_C,s1); OnRev(OUT_A,s2); Wait(t);Off(OUT_AC); //右に曲がる
#define go_rev(t,s1,s2) OnRev(OUT_A,s1); OnRev(OUT_C,s2); Wait(t); Off(OUT_AC); //後退する
#define go_fwd(t,s1,s2) OnFwd(OUT_A,s1);OnFwd(OUT_C,s2);Wait(t);Off(OUT_AC); //前進する

左右でモーターの速度が異なったので、その都度調整ができるよう時間と左右の速度を変数とした。

#define pen_up OnFwd(OUT_B,8);Wait(1000);Off(OUT_B); //ペン先を上げる
#define pen_down OnRev(OUT_B,8);Wait(1010);Off(OUT_B); //ペン先を下げる

筆圧を下げないために、若干ペン先を下す時間を変えた。

#define kami OnRev(OUT_A,30);Wait(400);Off(OUT_AC);OnRev(OUT_C,30);Wait(400);Off(OUT_AC); //髪を描く

この動きを6回繰り返すことで前髪を作った。

完成した似顔絵

DSC_0737.png

鉛筆で描いたので少し見づらいかもしれない。

反省・感想

反省点

・横にペンを付けたせいで、ペンの移動先の予測が困難になり多角形が作れなかった。
・ペンと紙の摩擦の影響か、輪郭の円がいつも同じように描くことができず、運任せになってしまった。
・やはり途中から筆圧が変わってしまい、後半は線が薄くなったりしてしまった。

感想

初めはもっと簡単にプログラミングができると高を括っていたが、車輪のモーターの速度が左右で異なることから始まり、思ったようにロボットを動かすことができずかなり苦労した。
同じプログラムを使っても、毎回微妙に似顔絵が異なってしまった。
その原因が最後までわからず、改善できなかったことが悔しいと思う。
今回は単純な顔しか描けなかったが、いずれはもっと複雑な顔を描けるようしたい。


添付ファイル: fileDSC_0737.png 154件 [詳細] fileDSC_0733.png 157件 [詳細] fileDSC_0731.png 150件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-06-10 (金) 04:03:32