2010b

2010b

お絵かきロボット[2010/後期/A4/左]

課題の内容

  • LEGOブロックでオリジナルロボットを組み立て、NQCを利用してパートナーの似顔絵を描くプログラムを作ること。
  • 使用できるのはLEGOブロックとペンのみ。

メンバー紹介

  • 松本

組み立てたロボット

  • 全体像 →最初に作ったドライブベースでは四輪の場合前方に傾いてしまい、もしもペンが引っ掛かったときに本体に負荷がかかり、下手すれば壊れてしまうので、ドライブベースを作り直し、RCX本体にタイヤを横付けするようにした。
NEC_0007.jpg
  • タイヤ部 →上記のとおり、水平を保てるようになっている。さらに、車高が低いので、いざ上から過負荷がかかり、本体がたわんでもかろうじて移動はできるようになっている。
NEC_0013.jpg

これがタイヤ部の工夫点。1プレート分だけずれている。

NEC_0012.jpg
  • ペン部 →当初はペン自体をゴムとビームを利用して固定したアームをつくり、アーム自体をアゲサゲしようとおもったが、うまく制御しづらい(それに単純すぎて面白みがない(笑))ので、エレベータ式にした。
NEC_0008.jpg
NEC_0011.jpg

これもモーターと可動部をつなげるために工夫が必要だった。 最初のドライブベースからアイディアを得て、モーターを挟み込んでみたらうまくいった。

NEC_0010.jpg
NEC_0009.jpg

やはり、工夫した点は、ペンをどのように保持しておくかであり、その点は、写真の白い ギアを使うことで解決した。 これをつかうことで、ペンを持ち上げて保持する際、常にモーターを回し続けていても本体には負荷がかからない(もちろん電気的な負荷はコンピューターにはかかるかもしれないが・・・^^;)ので、常にまわしづづけることで、ペンの保持をすることができる。

NEC_0007.jpg

似顔絵の完成予想図

  • 松本
NEC_0024.jpg

プログラム

  • 松本のプログラム
sub glasses()                        //メガネのサブルーチン
{
	OnFwd(OUT_A+OUT_C);     //前進
 	Wait(90);
	OnRev(OUT_C);     //片方のみ逆回転させてメガネの右レンズを作る
	Wait(25);
	Off(OUT_A+OUT_B+OUT_C);
	OnRev(OUT_B);        //ペン持ち上げ
	Wait(15);
	OnFwd(OUT_A+OUT_C);     //位置補正(機体移動)
	Wait(42);
	OnRev(OUT_A);
	Wait(25);
	OnRev(OUT_C)
	Wait(45);
	Off(OUT_A+OUT_B+OUT_C);
	OnFwd(OUT_B);       //ペンを下す
	Wait(23);
	Off(OUT_A+OUT_B+OUT_C);
	OnRev(OUT_A+OUT_C);    //メガネの右レンズの下枠を作る
	Wait(28);
	OnFwd(OUT_A+OUT_C);
	OnRev(OUT_A);
	Wait(22);
	OnRev(OUT_B);       //ペン持ち上げ
	Off(OUT_A+OUT_C);
	Wait(50);
	OnFwd(OUT_A+OUT_C);    //位置補正(機体移動)
	OnRev(OUT_C);
	Wait(22);
	OnFwd(OUT_C);
	Wait(4);
	OnRev(OUT_A+OUT_C);
	Wait(18);
	OnFwd(OUT_A+OUT_C);
	OnRev(OUT_A);
	Wait(20);
	OnFwd(OUT_B);       //ペンを下す
	Off(OUT_A+OUT_C);
	Wait(50);
	OnFwd(OUT_A+OUT_C);        //メガネ左レンズを作る
	OnRev(OUT_C);
	Wait(22);
	OnRev(OUT_A);
	Wait(30);
	OnFwd(OUT_A+OUT_C);
	OnRev(OUT_A);
	Wait(22);
	Off(OUT_A+OUT_C);
	OnRev(OUT_B);
}


sub faceline()             //輪郭のサブルーチン
{
	OnFwd(OUT_B);
	Wait(5);Float(OUT_B);      //ペンをゆっくり下す
	OnFwd(OUT_A+OUT_C);       //前進
	Wait(80);
	Off(OUT_C);           //左に旋回
	Wait(120);
	OnRev(OUT_B);         //ペンを上げる
	OnFwd(OUT_C);         //位置補正(機体移動)
	Wait(48);
	Off(OUT_A+OUT_C);
	OnFwd(OUT_A);         //左回転
	OnRev(OUT_C);
	Wait(120);
	OnRev(OUT_A);         //位置補正(ペン位置変更)
	Wait(65);
	OnFwd(OUT_B);         //ペンをゆっくり下す
	Wait(5);Float(OUT_B);
	OnFwd(OUT_A+OUT_C);      //前進
	Wait(80);
	OnRev(OUT_B);         //ペンを上げる
	OnFwd(OUT_A+OUT_C);      //位置補正(機体移動)
	Wait(54);
	OnFwd(OUT_A);         //左回転
	OnRev(OUT_C);
	Wait(85);
	OnRev(OUT_A);         //位置補正
	Wait(65);
	OnFwd(OUT_B);         //ペンを下ろす
	Wait(5);Float(OUT_B);
	OnFwd(OUT_A+OUT_C);      //前進
	Wait(88);
	Off(OUT_A+OUT_C);
	OnRev(OUT_B);         //ペンを上げる
}


sub nose()              //鼻のサブルーチン
{
	OnFwd(OUT_A+OUT_C);      //前進
	Wait(34);
	OnRev(OUT_C);         //左旋回
	Wait(22);
	OnRev(OUT_B);         //ペンを上げる
	OnFwd(OUT_C);         //斜めを向いた状態で前進
	Wait(36);
	OnRev(OUT_A);         //右旋回
	Wait(22);
	Float(OUT_B);
	OnRev(OUT_C);         //ペンを上げた状態でバック 
	Wait(32);
	OnFwd(OUT_B);         //ペンをゆっくり下ろす
	Wait(5);
	Float(OUT_B);
	OnRev(OUT_A+OUT_C);     //ペンを下ろした状態でバック
	Wait(29);
	Off(OUT_A+OUT_C);      //停止
}


sub mouth()                                 
{
	OnFwd(OUT_C);                 //右旋回
	OnRev(OUT_A);
	Wait(20);
	OnFwd(OUT_B);        //ペンをゆっくり下ろす
	Wait(5);
	Float(OUT_B);
	OnFwd(OUT_A);        //左旋回しながら口を描く
	OnRev(OUT_C);
	Wait(60);
	OnRev(OUT_B);       //ペンを上げる
}


sub hair()            //髪の毛のサブルーチン
{
	repeat(2)
	{
		OnFwd(OUT_B);    //ペンをゆっくり下ろす
		Wait(5);
		Float(OUT_B);
		OnRev(OUT_A);    //右旋回
		OnFwd(OUT_C);
		Wait(60);
		Off(OUT_A);     //右のモーターを停止
		OnRev(OUT_B);    //ペンを上げる
		OnRev(OUT_C);    //斜めになってる車体をまっすぐに向ける、兼微妙に前進
		Wait(20);
		OnFwd(OUT_B);    //ペンをゆっくり下ろす
		Wait(5);
		Float(OUT_B);
		OnRev(OUT_C);    //左旋回
		OnFwd(OUT_A);
		Wait(60);
		Off(OUT_C);     //左のモーターを停止
		OnRev(OUT_B);    //ペンを上げる
		OnRev(OUT_A);    //車体をまっすぐにする、兼微妙に前進
 		Wait(20);
 	}              //以上の動作を二回繰り返す(4本毛を書かく)
} 

task main()            //全体の動作
{
	faceline();         //輪郭から描く。
	OnFwd(OUT_A+OUT_C);     //輪郭の最後から少しだけ前進
	Wait(40);
	Off(OUT_A+OUT_C);      //停止
	OnFwd(OUT_A);        //左に約90°旋回
	OnRev(OUT_C);
	Wait(140);
	OnRev(OUT_A);        //輪郭の線と、眼鏡の線がつながらないように、少しだけ前進
	Wait(38);
	OnFwd(OUT_B);        //ペンをゆっくり下ろす
	Wait(5);
	Float(OUT_B);
	glasses();          //眼鏡を描く
	OnFwd(OUT_A+OUT_C);      //顔の中心線に移動
	Wait(98);
	OnRev(OUT_C);        //左に約90°旋回
	Wait(139);
	OnRev(OUT_A);        //位置補正
	Wait(30);
	OnFwd(OUT_B);        //ペンをゆっくり下ろす
	Wait(6);
	Float(OUT_B);
	nose();           //鼻を描く
	OnRev(OUT_B);        //ペンを上げる
	OnFwd(OUT_A+OUT_C);     //口を描く位置まで前進
	Wait(48);
	mouth();           //口を描く
	Wait(200);
	OnFwd(OUT_C);        //前進
	Wait(50);
	OnRev(OUT_C);        //約180°左旋回
	Wait(260);
	Off(OUT_A+OUT_C);     //停止
	hair();           //髪の毛を描く
	Off(OUT_A+OUT_C);      //終了	
}
#define turn_up OnFwd(OUT_B);
#define turn_down OnRev(OUT_B);Wait(4);Float(OUT_B);
#define go OnFwd(OUT_A);OnFwd(OUT_C);
#define back OnRev(OUT_A);OnRev(OUT_C);
#define tomaru Off(OUT_A+OUT_C+OUT_B);
#define tomaruAC Off(OUT_A+OUT_C);
#define backA OnRev(OUT_A);
#define backC OnRev(OUT_C); 

sub down()                       //ペンを下げる
{
	turn_up;         
	Wait(100);
	turn_down;
}

sub megane()         //眼鏡を書くプログラム
{
	go;          
	Wait(70);              //眼鏡の上の線
	backA;
	Wait(25);              //右の線
	tomaru;
	turn_up;
	Wait(15);
	go;Wait(55);
	backC;Wait(25);
	back;Wait(62);         //下の線を書くために調整
	tomaru;
	turn_down;Wait(50);tomaru;
	back;Wait(28);
	go;
	backC;Wait(20);
	turn_up;tomaruAC;Wait(50);tomaru;
	go;
	backA;Wait(20);
	go;Wait(70);      //右のレンズ
	backA;Wait(2);
	back;Wait(80);
	go;
	backC;Wait(20);
	turn_down;tomaruAC;Wait(50);
	go;
	backA;Wait(20);
	back;Wait(24);
	go;
	backC;Wait(20);
	turn_up;         //左のレンズ
} 

sub linkaku()
{
	back;Wait(60);tomaru;Wait(50);     //輪郭をかける状態に戻す
	turn_down;Wait(50);
	go;Wait(70);              //左の頬
	Off(OUT_C);Wait(70);tomaru;
	turn_up;
	go;Wait(48);tomaru;
	go;backC;Wait(110);tomaru;
	back;Wait(53);tomaru;
	turn_down;Wait(60);tomaru;        //顎の部分
	go;Wait(60);
	turn_up;
	go;Wait(50);tomaru;
	go;backC;Wait(154);tomaru;
} 

sub hana()
{
	go;backA;Wait(325);tomaru;     
	back;Wait(94);tomaru;
	go;backA;Wait(100);tomaru;
	back;Wait(25);go;backC;Wait(73);tomaru;
	go;Wait(44);tomaru;
	turn_down;Wait(50);
	go;Wait(25);
	backC;Wait(8);tomaru;
	turn_up;Wait(50);tomaru;      //鼻を書くいい位置につく
	go;Wait(5);tomaru;
	turn_down;Wait(50);
	go;backC;Wait(20);        //鼻を一気/
		go;backA;Wait(200);tomaru;
		turn_up;Wait(67);tomaru;
		back;Wait(8);tomaru;
		go;backC;Wait(200);tomaru;
		go;Wait(2);tomaru;tomaru;
	}
}
task main()
{ 
	down();
	Wait(30);
	megane();
	go;Wait(58);
	backA;Wait(147);
	linkaku();
	go;Wait(48);
	kaminoke();
	turn_up;Wait(50);tomaru;
	go;backA;Wait(75);tomaru;
	back;Wait(7);tomaru;
	kaminoker();
	turn_up;Wait(50);tomaru;
	hana();
	turn_up;Wait(50);
	tomaru;
} 

実際にロボットが書いた似顔絵

  • 松本
NEC_0025.jpg
CA31.jpg

反省点

  • 松本 今回はパートナーで共同作業をすることが全くできなかった。それに提出も遅れてしまったので、次回はこの2点の改善に加えもっと細かく動けるロボットと、プログラミングを作りたい。
  • 王 プログラミングを組むのに、時間がかかり、時間通りにできず、紙もたくさん無駄にした。

コメントをよろしくお願いします。

FI まだ終わってないみたいなので、また後で見ます。

TAKA プログラムに説明を入れてください

  • 似顔絵は手が込んでおり、とても良いです。あとは、二人目のプログラムをきちんと貼りなおすことと、説明を入れることを直せばOKです -- FI? 2011-01-08 (土) 05:22:33
  • プログラムに説明を入れればOKです -- TAKA? 2011-01-21 (金) 16:27:21


添付ファイル: fileNEC_0024.jpg 158件 [詳細] fileNEC_0025.jpg 182件 [詳細] fileNEC_0013.jpg 220件 [詳細] fileNEC_0012.jpg 205件 [詳細] fileNEC_0011.jpg 222件 [詳細] fileNEC_0010.jpg 223件 [詳細] fileNEC_0009.jpg 219件 [詳細] fileNEC_0008.jpg 236件 [詳細] fileNEC_0007.jpg 216件 [詳細] fileCA31.jpg 192件 [詳細] fileCA3.jpg 117件 [詳細] filekans.jpg 95件 [詳細] fileCA3G00660001.jpg 95件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-02-08 (火) 15:10:01