[[2011a]]

#contents

*課題の内容 [#waad21b2]

A4の紙に相棒の似顔絵を書くロボットを作成せよ。

-ひとりにつき一つ以上のプログラムを作成すること。

-ペン以外はキットに含まれる部品を使うこと。

-キットに付属の高価な輪ゴムは切れやすいので切れないように細心の注意を払うこと。

-改良や調整をしやすくするため、ロボット本体だけでなく、プログラムについても可能な部分についてはサブルーチンや関数、マクロなどを使って部品に分けること。

*メンバー [#y40385d4]
-岡本

-Chris (クリス)
*ロボットの組み立て [#j3e30aa6]
**方針 [#cda6272a]
誤差を無くすためペンが中心にきて、まっすぐなきれいな線を引けるロボットをつくる。
***土台 [#v78ff0fb]

#ref(bottom.JPG)
***ペンの設置 [#te7713b5]

#ref(front_motor.JPG)
#ref(side_tubes.JPG)
***完成 [#k596bc1d]
#ref(full.JPG)

**結果 [#s7577536]
***岡本のコード [#e2b55007]

#ref(Okamoto_result.JPG)

#ref(picture.jpg)

***クリスのコード [#h10beeed]

#ref(Chris_clean.JPG)

#ref(Chris_result.JPG)

*プログラム [#ja1304f2]
**岡本のプログラム [#m1f7dc2a]

 					
 #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;                                                                  // 鼻
      go(20);
      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(18);
      go(20);
      turn_right_tyoku;
      
      back(10);
    repeat(4){                                                                       // 口
     go_straight(10);
     turn_right_tyoku;
  }
 }
**クリスのプログラム [#y6a36178]
 #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);
 }
*感想 [#xf7f9d1d]


**岡本 [#zaffe672]
何度もプログラムを書き直して、やっと人の顔に見えたときは達成感があった。

コードをグルグル巻いているのはカッコ悪いが、改善策が見つからなかった。

タッチセンサーは、ピースが足りなかったので使用しただけで、とくに意味はありません。

**クリス [#z97cf953]

最初に、印刷機のように点で絵を描くロボットを作りたかった。完成したロボットでまだその方法で描けるが、結局きれいに描けなかったので、もう少し普通の方法ですることにした。

もういろいろなプログラミングをしたことがあるが、プログラミングで現実の物を動かすのは初めてだった。それで、初めていろいろな現実の問題に扱わなければならなくて、難しかった。

*コメント [#e3c45b1f]
- クリスさんのプログラムの中に correction time のコメントがありますが、もう少し詳しく説明してください。 -- [[松本]] &new{2011-05-20 (金) 15:19:44};

#comment

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS