[[2010b]]

[[2010b]]

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

#contents

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

**メンバー紹介 [#d5fbb1ab]
-松本
-王

**組み立てたロボット [#ob3846a1]
-全体像
→最初に作ったドライブベースでは四輪の場合前方に傾いてしまい、もしもペンが引っ掛かったときに本体に負荷がかかり、下手すれば壊れてしまうので、ドライブベースを作り直し、RCX本体にタイヤを横付けするようにした。


#ref(NEC_0007.jpg)



-タイヤ部
→上記のとおり、水平を保てるようになっている。さらに、車高が低いので、いざ上から過負荷がかかり、本体がたわんでもかろうじて移動はできるようになっている。


#ref(NEC_0013.jpg)




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


#ref(NEC_0012.jpg)



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


#ref(NEC_0008.jpg)


#ref(NEC_0011.jpg)




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


#ref(NEC_0010.jpg)



#ref(NEC_0009.jpg)


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


#ref(NEC_0007.jpg)


**似顔絵の完成予想図 [#m550eff4]


-松本

#ref(NEC_0024.jpg)


**プログラム [#s7c2934c]

-松本のプログラム


 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;
 } 
 
 
**実際にロボットが書いた似顔絵 [#r44cf612]


-松本

#ref(NEC_0025.jpg)




-王

#ref(CA31.jpg)


**反省点 [#wf053b0a]
-松本
今回はパートナーで共同作業をすることが全くできなかった。それに提出も遅れてしまったので、次回はこの2点の改善に加えもっと細かく動けるロボットと、プログラミングを作りたい。


-王
プログラミングを組むのに、時間がかかり、時間通りにできず、紙もたくさん無駄にした。
**コメントをよろしくお願いします。 [#l9ac5130]
FI まだ終わってないみたいなので、また後で見ます。

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

#comment

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