似顔絵ロボットの製作

目次

課題内容

A4の用紙に、相方の似顔絵を描くロボットを製作する。 細かなルールは以下の通りである。

メンバー

ロボット紹介

全体像

全体 側面 上面

全体はこんな感じです。ペンの上げ下げにアームを用いた「アーム型」ロボットです。

アーム

アーム ギア

両側からペンを挟み込むようにして固定します。ギアは、上下速度を遅くするために段分けして調整しました。

また、ペンを自重でおろすため、アームの先に気休め程度のおもりとしてブロックをつけています。

なお動作の際には、ぐっPは油性ペン、ひろはボールペンを使用しています。

キャスター

初代

     初代

 ガイドブック46ページのキャスターを参考に製作。

 問題点:走行中に用紙に引っかかり、用紙がずれてしまう。

二代目

     二代目

 用紙に引っかからないように、キャスターを本体の内側に設置することに。取り付け場所が狭いため、摩擦の少なそうな部品で代用。(黄色のブロックをずらしているのは、後でとりやすくするため)

 問題点:それでも摩擦が生じ、用紙が曲がってしまう。

三代目

     三代目

 ならばいっそのこと、キャスターを用紙の外に出してしまおう!ということで製作。

 問題点:動作の際に、非常にスペースをとる。しかし、スペースさえ確保できれば今までで一番描きやすい。

予定図面

ぐっP作「ひろの顔」

  1. 輪郭を円で描く
  2. 交互にバックして、髪を表現
  3. 位置調整(1)
  4. 目は直線で
  5. 位置調整(2)
  6. 回転を利用し、口を引く
  7. 位置調整(3)
  8. 鼻を描いてフィニッシュ

予定図 手順前半手順後半

ひろ作「ぐっPの顔」

  1. 回転して輪郭を書く
  2. 移動
  3. 回転して口を書く
  4. 移動
  5. 鼻を書く
  6. 移動(90度回転)
  7. 目を書く

予定図

プログラム

ぐっPのプログラム

#define BACK_TIME 18                             //髪の部分の後退時間を指定
#define GO_TIME 10                               //直進、後退時間を指定
#define UP_TIME 10                               //アームの上げ時間を指定
#define DOWN_TIME 200                            //アームの下げ時間(待ち時間)を指定
#define WAIT_TIME 50                             //待ち時間を指定

void turn_right(int t)                           //t秒間の右旋回を定義
{
	OnFwd(OUT_A); OnRev(OUT_C); Wait(t);
	Off(OUT_AC); Wait(WAIT_TIME);
}

void turn_left(int t)                            //t秒間の左旋回を定義
{
	OnRev(OUT_A); OnFwd(OUT_C); Wait(t);
	Off(OUT_AC);
}

void left_back()                                 //左後退を定義
{
	OnFwd(OUT_C); Wait(BACK_TIME);
	Off(OUT_C);
}

void right_back()                                //右後退を定義
{
	OnFwd(OUT_A); Wait(BACK_TIME);
	Off(OUT_A);
}

void back()                                      //後退を定義
{
	OnFwd(OUT_AC); Wait(GO_TIME);
	Off(OUT_AC);
}

void go_straight()                               //直進を定義
{
	OnRev(OUT_AC); Wait(GO_TIME);
	Off(OUT_AC);
}

void go_right()                                  //右折を定義
{
	OnRev(OUT_A); Wait(BACK_TIME);
	Off(OUT_A);
}

void arm_up()                                    //アームアップを定義
{
	OnRev(OUT_B); Wait(UP_TIME);
	Off(OUT_B);
}

void arm_down()                                  //アームダウンを定義
{
	OnFwd(OUT_B); Wait(2);                    //最初に勢いをつけて、
	Float(OUT_B); Wait(DOWN_TIME);            //あとは自重で下ろす。
}

void shita_yose()                                //下方向への幅寄せを定義
{
	turn_right(10);                           //右旋回
	back();                                   //後退
	turn_left(10);                            //左旋回
}

void ue_yose()                                   //上方向への幅寄せを定義
{
	turn_left(10);                            //左旋回
	back();                                   //後退
	turn_right(10);                           //右旋回
}

task main()                                      //ここからメインプログラム
{
	turn_right(165);                         //輪郭
	repeat(2){                               //髪始め
		right_back();  
		left_back();
	}
	right_back();                            //髪終わり
	arm_up();
	go_right();                              //位置調整
	shita_yose();
	repeat(2){                               //目始め
		go_straight();
		arm_down();
		go_straight();
		arm_up();
	}                                        //目終わり
	repeat(2){
		ue_yose();                       //位置調整
		go_straight();
	}
	turn_left(20);
	arm_down();
	turn_left(15);                           //口
	arm_up();
       back2(8);                                 //位置調整
	arm_down();
	turn_right(6);                           //鼻
	arm_up();
}

ひろのプログラム

sub pen_up()             //ペンを上げる
{
	OnRev(OUT_B);
	Wait(12);
	Off(OUT_B);
}
sub pen_down()            //ペンを下げる
{
	OnFwd(OUT_B);
	Wait(5);
	Float(OUT_B);
	Wait(100);
}
sub hanten(){            //180度回転
	OnRev(OUT_A);
	OnFwd(OUT_C);
	Wait(90);
	Off(OUT_A+OUT_C);
}
sub tyokkaku(){
	OnFwd(OUT_A);        //90度回転
	OnRev(OUT_C);
	Wait(45);
	Off(OUT_A+OUT_C);
}
sub susumu(){            //前進
	OnFwd(OUT_A+OUT_C);
	Wait(11);
	Off(OUT_A+OUT_C);
}
task main(){
	pen_up();
	tyokkaku();
	pen_down();         //輪郭
	hanten();
	pen_up();          //輪郭終わり
	tyokkaku();         //移動	
	susumu();
	pen_down();         //口	
	OnFwd(OUT_A);
	OnRev(OUT_C);
	Wait(12);
	Off(OUT_A+OUT_C);
	OnRev(OUT_A);
	OnFwd(OUT_C);
	Wait(24);
	Off(OUT_A+OUT_C);
	OnFwd(OUT_A);
	OnRev(OUT_C);
	Wait(12);
	Off(OUT_A+OUT_C);
	pen_up();          //口終わり
	susumu();          //移動
	pen_down();         //鼻
	susumu();
	pen_up();          //鼻終わり
	tyokkaku();         //移動
	Off(OUT_A+OUT_C);
	pen_up();
	susumu();
	susumu();	
	pen_down();         //目
	susumu();	
	pen_up();          //目1回
	susumu();
	pen_down();         //目
	susumu();
	pen_up();
	susumu();
	susumu();          //目2回
	Off(OUT_A+OUT_C);      //完成:-)
}

実行結果

ぐっPの結果

ひろの似顔絵

円の半径がずれて、輪郭や髪が中途半端になってしまった。口も斜めになってしまったが、これはこれで斜めから見たようにみえるので(たぶん)OKである。

ひろの結果

ぐっPの似顔絵

反省点

感想

最後に、コメントがあれば是非書き込んでいってください。



添付ファイル: fileg_e.jpg 258件 [詳細] fileg_nigaoe.jpg 275件 [詳細] fileh_nigaoe.jpg 266件 [詳細] filekao3.jpg 267件 [詳細] filekao2.jpg 271件 [詳細] filekao1.jpg 295件 [詳細] filecaster3.jpg 259件 [詳細] filecaster2.jpg 258件 [詳細] filecaster1.jpg 294件 [詳細] filezentai.jpg 255件 [詳細] filetop.jpg 268件 [詳細] fileside.jpg 286件 [詳細] filegear.jpg 278件 [詳細] filearm.jpg 278件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-11-17 (木) 19:01:28