2011a

課題の内容

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

  • ひとりにつき一つ以上のプログラムを作成すること。
  • ペン以外はキットに含まれる部品を使うこと。
  • キットに付属の高価な輪ゴムは切れやすいので切れないように細心の注意を払うこと。
  • 改良や調整をしやすくするため、ロボット本体だけでなく、プログラムについても可能な部分についてはサブルーチンや関数、マクロなどを使って部品に分けること。

メンバー

  • 岡本
  • Chris (クリス)

ロボットの組み立て

方針

誤差を無くすためペンが中心にきて、まっすぐなきれいな線を引けるロボットをつくる。

土台

bottom.JPG

ペンの設置

front_motor.JPG
side_tubes.JPG

完成

full.JPG

結果

岡本のコード

Okamoto_result.JPG
picture.jpg

クリスのコード

Chris_clean.JPG
Chris_result.JPG

プログラム

岡本のプログラム

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

感想

岡本

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

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

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

クリス

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

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

コメント

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


添付ファイル: fileOkamoto_result.JPG 183件 [詳細] fileChris_result.JPG 193件 [詳細] filebottom.JPG 202件 [詳細] filepicture.jpg 216件 [詳細] filefront_motor.JPG 186件 [詳細] fileside_tubes.JPG 180件 [詳細] fileChris_clean.JPG 182件 [詳細] filefull.JPG 193件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-05-27 (金) 16:30:49