課題の内容 †A4の紙に相棒の似顔絵を書くロボットを作成せよ。
メンバー †
ロボットの組み立て †方針 †誤差を無くすためペンが中心にきて、まっすぐなきれいな線を引けるロボットをつくる。 土台 †ペンの設置 †完成 †結果 †岡本のコード †クリスのコード †プログラム †岡本のプログラム †#define kao 80 //顔の側面の長さ #define ago 50 //あごの長さ #define down OnFwd(OUT_B);Wait(10); // ペンを下げる #define go_straight(t) down;OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C); // ペンを下げて前進 #define turn_right(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_A+OUT_C); // 右回転 #define turn_left(t) OnRev(OUT_A);OnFwd(OUT_C);Wait(t);Off(OUT_A+OUT_C); // 左回転 #define back(t) Off(OUT_B);OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C); // 後進 #define go(t) Off(OUT_B);OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C); // ペンを上げて前進 #define turn_left_san Off(OUT_B);go(15);turn_left(37);back(10);Off(OUT_A+OUT_C); // 左に約30度 #define turn_left_nana Off(OUT_B);go(15);turn_left(75);back(10);Off(OUT_A+OUT_C); //左に約70度 #define turn_left_yon Off(OUT_B);go(10);turn_left(45);back(10);Off(OUT_A+OUT_C); //左に約45度 #define turn_left_hati Off(OUT_B);go(17);turn_left(60);back(10);Off(OUT_A+OUT_C); //左に60度? #define turn_right_tyoku Off(OUT_B);go(12);turn_right(103);back(15); //右に直角 #define turn_left_five Off(OUT_B);go(15);turn_left(65);back(10);Off(OUT_A+OUT_C); //左に65度? #define turn_left_tyoku Off(OUT_B);go(15);turn_left(103);back(12); //左に直角 #define turn_right_yon Off(OUT_B);go(10);turn_right(50);back(10); //右に50度? task main() { go_straight(20); //頭 turn_left_san; go_straight(50); turn_left_san; go_straight(20); turn_left_hati; go_straight(kao); //顔 turn_left_five; go_straight(ago); turn_left_nana; go_straight(ago); turn_left_five; go_straight(kao); back(13); //目 turn_left_tyoku; go(20); go_straight(17); go(20); go_straight(17); back(37); turn_left_yon; // 鼻 back(13); //目 turn_left_tyoku; go(20); repeat(4){ // 目 go_straight(10); turn_left_tyoku; } go(40); repeat(4){ // 目 go_straight(10); turn_left_tyoku; } back(50); turn_left_hati; // 鼻 go(30); go_straight(15); turn_left_tyoku; go_straight(10); turn_right_yon; go(20); turn_right_tyoku; back(10); repeat(4){ // 口 go_straight(10); turn_right_tyoku; } } クリスのプログラム †#define poke SetPower(OUT_B, 6);OnFwd(OUT_B); // マーカーを下げる #define unpoke Off(OUT_B); //マーカーを離す #define poke_straight(t) poke;OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);unpoke; // 線を書く #define go_straight(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C); //まっすぐ行く #define go_back(t) OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C); //後ろに行く void turn(int deg) //ロボットを回す { //deg = degree = 度 int corr; //corr = correction time = 直す時間(回したら、マーカーの位置が変わるので、直さなければならない) //マーカーの位置のずれを小さくするため。 if(deg > 90) { corr = (90 - (deg % 90))*5/24; } else { if(deg < -90) { corr = (90 + (deg % 90))*5/24;} else { corr = abs(deg*5/24); } } if (deg < 0) { go_straight(corr); deg *= 48; deg /= 42; OnRev(OUT_C); OnFwd(OUT_A); Wait(-deg); go_back(corr); } else { go_straight(corr); deg *= 52; deg /= 46; OnRev(OUT_A); OnFwd(OUT_C); Wait(deg); go_back(corr); } Off(OUT_A+OUT_C); } task main() { //Outer head 顔の形 poke_straight(80); turn(55); poke_straight(50); turn(60); poke_straight(50); turn(55); poke_straight(80); turn(65); poke_straight(55); turn(60); poke_straight(55); turn(90); //Eyes 目 go_straight(25); turn(60); poke_straight(20); go_straight(20); poke_straight(20); //Nose 鼻 turn(-150); go_straight(20); poke_straight(20); turn(120); poke_straight(10); //Mouth 口 go_straight(35); turn(-150); poke_straight(20); turn(-60); poke_straight(20); //Hair 髪の毛 turn(-55); go_straight(60); poke_straight(20); turn(-90); go_straight(15); turn(-90); poke_straight(20); turn(90); go_straight(15); turn(90); poke_straight(20); Off(OUT_A+OUT_C); } 感想 †岡本 †何度もプログラムを書き直して、やっと人の顔に見えたときは達成感があった。 コードをグルグル巻いているのはカッコ悪いが、改善策が見つからなかった。 タッチセンサーは、ピースが足りなかったので使用しただけで、とくに意味はありません。 クリス †最初に、印刷機のように点で絵を描くロボットを作りたかった。完成したロボットでまだその方法で描けるが、結局きれいに描けなかったので、もう少し普通の方法ですることにした。 もういろいろなプログラミングをしたことがあるが、プログラミングで現実の物を動かすのは初めてだった。それで、初めていろいろな現実の問題に扱わなければならなくて、難しかった。 コメント †
|