*&size(26){課題  :   似顔絵ロボット }; &size(15){( Ozawa男 & その相方 )}; [#v0000eab]
#contents


**課題の概要 [#e4ba86f2]

その壱) A3用紙に相棒の似顔絵を書くロボットの製作@

その弐) 指定のキットを使用すれば構造は自由@

その参) なるべく相棒に似せる@



*ロボット&size(13){〜本体について〜}; [#l5cc0aa8]

**製作過程 [#tb98f9d7]
はじめはペンをロボットの中心に垂直に立て、上下させる方法ですすめていた。こうすることで、前後左右の動きに対して安定して書け、ロボットの回転中心の軌跡とペンの軌跡にずれがなくスムーズに書けるからである。
~しかし、
~テンションの調整が難しく、強すぎると車体が浮いてしまうし、弱いとうまい具合に線が描けない、また既存の車体ではペンと動作機構が入るスペースがないなど、トラブルが多々あった。
~解決しようと、ゴムをサスペンション代わりにしたり、ギヤ比の調整でペンの降下速度を鈍くしてプログラムしやすくするなどした。
~何回もこころみたが妥協。

~おもいきってペンの作動方法を変更した。



**完成体 [#pb44fb15]
写真をみての通り!!
~動力部のうえにクレーン部をのせたシンプルな構造。

&ref(kuren3.jpg);&size(30){+}; 
&ref(syatai3.jpg);&size(30){=}; &ref(zenbu1.jpg);

**工夫点 [#ed9bccc3]
***動力部 [#tae9b1a2]
-A3という狭い範囲の紙に描くので、小回りができるように4輪車から3輪車への改造。
~赤丸は前輪、青丸は後輪、これででスムーズな回転が可能となった。
~また、ペンはクレーン式なのでバランスが一番よくなるように三つの車輪を設置した。
~&ref(sharin2.jpg);
***クレーン部 [#n53328ed]

-またまた、筆圧の壁にぶち当たった。ペンを持つ機構に柔軟性が足りないためである。
~ならば、ペンに柔軟性を与えればよいという逆転の発想で、ペン先が柔らかい'''筆ペン'''を使用。

~&ref(hude2.jpg);

-筆ペンにしたところ普通のものより重いためか、わずかだがギアの逆回転によってペンが降下してしまう。
~なので、クレーン部にヲォームギアを駆使しこれを防止!!さらに、トルクアップにより重い筆ペンも楽々持ち上げれるように。
~&ref(gia2.jpg);









*ロボット&size(13){〜プログラムについて〜}; [#l5cc0aa8]
**O男編 [#x44528df]

最初は定義@

まず、メイン・サブルーチンのなかで繰り返し使うものをあらかじめマクロでインプット。




                 #define  up_pen     OnRev(OUT_B);Wait(60);Off(OUT_B);                  //  ペンをさげる
                 #define down_pen    OnFwd(OUT_B);Wait(60);Off(OUT_B);                  //  ぺんをあげる
                 #define  go_st(t)   OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_B);         //  t/100 秒間まっすぐ走る
                 #define  turn_l90   OnFwd(OUT_A);OnRev(OUT_C);Wait(65);Off(OUT_A+OUT_C);   // 左90°回転
続いて、メインルーチンのなかで繰り返して使うものをサブルーチンでインプット。
     sub st_op()               // すべてをストップさせ、0,5秒まつ。
                     {  
                       Off(OUT_A+OUT_C+OUT_B); 
                       Wait(50);     
                     }
     
     sub make_ang()            // 左90°の角を作成
                     { 
                       up_pen; 
                       go_st(50); 
                       turn_l90; 
                       OnRev(OUT_A+OUT_C); 
                       Wait(41); 
                       Off(OUT_A+OUT_C); 
                       Wait(50); 
                       down_pen; 
                     } 
     
     sub  ago_45()             // 左45°の角を作成
                     { 
                       up_pen; 
                       go_st(47);
                       OnFwd(OUT_A); 
                       OnRev(OUT_C); 
                       Wait(33); 
                       Off(OUT_A+OUT_C);
                       OnRev(OUT_A+OUT_C);
                       Wait(43);
                       Off(OUT_A+OUT_C);
                       Wait(50);
                       down_pen;    
                     }
メインの命令
  
     task main()
                     {
                       OnFwd(OUT_B);  // ペンのセット
                       Wait(183);
                       st_op();
                       
                       go_st(100);    // 輪郭作成
                       st_op();
                       ago_45(); st_op(); go_st(30); st_op();
                       ago_45(); st_op(); go_st(50); st_op();
                       ago_45(); st_op(); go_st(30); st_op();
                       ago_45(); st_op(); go_st(100);st_op();
                       make_ang();   
                       st_op();
                       go_st(95);
                       st_op();
                       
                       up_pen;        //目作成
                       go_st(50);
                       turn_l90; 
                       OnRev(OUT_A+OUT_C);
                       Wait(41);
                       st_op();
                       go_st(25);
                       st_op();
                       go_st(50);
                       turn_l90;
                       OnRev(OUT_A+OUT_C);
                       Wait(41);
                       st_op();
                       go_st(13);
                       st_op();
                       down_pen;
                       st_op();
                       go_st(25);
                       st_op();
                       up_pen;
                       st_op();
                       go_st(22);
                       st_op();
                       down_pen;
                       st_op();
                       go_st(25);
                       st_op();
                       
                       up_pen;       //鼻作成
                       st_op();
                       OnRev(OUT_A+OUT_C);
                       Wait(35);
                       st_op();
                       down_pen;
                       st_op();
                       OnRev(OUT_A);
                       OnFwd(OUT_C);
                       Wait(27);
                       st_op();
                       go_st(15);
                       st_op();
                       
                       up_pen;         //口作成
                       st_op();
                       go_st(30);
                       st_op();
                       down_pen;
                       OnRev(OUT_A);
                       OnFwd(OUT_C);
                       Wait(50);
                       st_op();
                       
                       up_pen;         //ペンをあげて完成!!
                      }

こんなお顔に、、、、、、、、、、、、いかすでしょ?この澄ました笑顔!  &size(10){*見つめているとイライラしてくる可能性があります};&ref(kao.jpg);
***工夫点 [#b53a2384]
プログラムは見やすく!速く!をモットーに作成。
~サブルーチンやマクロで簡略化を図った。でも、もっと工夫できるはず。
~円の輪郭も考えたが人間味をだすために角型輪郭にした。
~鼻を高くしたかったので丸みのようそをいれてみた。
***苦労 [#v780a983]
ペンを車体の中心でなく前方に設置したため、そのずれを考慮して遠回りなプログラミングをしなくてはならなかった。

~特に輪郭の作成に手間がかかった。角をつくるのが難しいんですよ、、、
~微々たる調整の違いで角がクロスしたり、離れたり、曲がったりで悩まされた。


~&size(25){90°の角をつくる手順};

&ref(90.jpg);

90°の角を作成しにロボが線を描きながら手前からやってきたとしよう。
~前タイヤが第一ポイントまで差し掛かったとき、目安をご覧のとおり「差」によってすでに線は第二ポイントまで作成されている。
~もうここでペンをあげて第二ポイントまで前進!
~左に90度回転し、ペンをおろす、、、、、
~ちょっとまてぃ。。
~第三ポイントまで前輪をバックしなければ角がくっつかない
~ってことでバック!!
~ここでペンをおろして前進。
~やっと90度の角の完成です。

~日本語で考えると単純なんですけどプログラムにすると・・・・ってかんじです。(笑)

-ちなみに初めてつくったときの90°角をみてください


&ref(90sipai2.jpg);&ref(90sipai.jpg);&size(18){ひどいっ!www}; 緑の点線部分のことをまったく考慮してませんでした
~45°の角も同じ要領でつくりました。とくに説明しません。
**相方編 [#lf43879a]


***顔の制作 [#n3ff6bbb]
まず、どんな顔にするかを決めなければなりません。はじめは輪郭を丸にした簡単なものを考えたのですが、芸がないので今回のようなプログラムにしました。
***形を決める [#n3ff6bbb]
まず、どんな顔にするかを決めなければなりません。はじめは輪郭を丸にした簡単なもの   を考えたのですが、360度スピンでは回転中心とペンの間隔が狭く円が小さすぎ、また芸がないので今回のようなプログラムにしました。~
-完成時:過去に作ったプログラムからそのまま引用したり、とにかく思ったラインを描けるよう作ったため荒削りです。完成当時そのままをのせます(変なところあり)。
 task main()
 {
 OnRev(OUT_C); OnFwd(OUT_A); 
 Wait(37);
 Off(OUT_A+OUT_C);
 Wait(100);
  
 OnFwd(OUT_B);      
 Wait(43);
 Off(OUT_B);
 
 OnRev(OUT_A); OnFwd(OUT_C);
 Wait(74);
 Off(OUT_A+OUT_C);
    
 OnRev(OUT_B);//up
 Wait(43);
 Off(OUT_B);
 Wait(100);
  
 OnRev(OUT_A); OnFwd(OUT_C);
 Wait(98);
 Off(OUT_A+OUT_C);
 Wait(100);
    
 OnRev(OUT_A+OUT_C);//forward
 Wait(35);
 Off(OUT_A+OUT_C);
 Wait(100);
  
 OnFwd(OUT_B);//down           //eyenose
 Wait(43);
 Off(OUT_B);
 OnRev(OUT_B);//up
 Wait(43);
 Off(OUT_B); 
 
 OnRev(OUT_A+OUT_C);//forward
 Wait(27);
 Off(OUT_A+OUT_C);
 Wait(100);
 
 OnRev(OUT_A); OnFwd(OUT_C);
 Wait(14);
 Off(OUT_A+OUT_C);
    
 OnFwd(OUT_B);//down
 Wait(43);
 Off(OUT_B);
 OnRev(OUT_B);//up
 Wait(43);
 Off(OUT_B);
 
 OnRev(OUT_C); OnFwd(OUT_A);
 Wait(28);
 Off(OUT_A+OUT_C);   
 
 OnFwd(OUT_B);//down
 Wait(43);
 Off(OUT_B);
 OnRev(OUT_B);//up
 Wait(43);
 Off(OUT_B);
    
 OnRev(OUT_A); OnFwd(OUT_C);
 Wait(14);
 Off(OUT_A+OUT_C);
    
 OnFwd(OUT_A+OUT_C);//back       :::
 Wait(83);
 Off(OUT_A+OUT_C);
 Wait(100);
    
 OnRev(OUT_A); OnFwd(OUT_C);
 Wait(65);
 Off(OUT_A+OUT_C);
    
 OnRev(OUT_A+OUT_C);//forward         ;;;
 Wait(38);
 Off(OUT_A+OUT_C);
 Wait(100);
 
 OnRev(OUT_A); OnFwd(OUT_C);
 Wait(65);
 Off(OUT_A+OUT_C);//                       eyenose
 
 OnFwd(OUT_B);//down
 Wait(43);
 Off(OUT_B);
 
 OnRev(OUT_A+OUT_C);//forward
 Wait(60);
 Off(OUT_A+OUT_C);
 Wait(100);
 
 repeat(3){
 
 OnRev(OUT_B);//up
 Wait(43);
 Off(OUT_B);
 
 OnFwd(OUT_A+OUT_C);//back
 Wait(51);
 Off(OUT_A+OUT_C);
 Wait(100);
 
 OnRev(OUT_A); OnFwd(OUT_C);//turn right 45 degrees
 Wait(32);
 Off(OUT_A+OUT_C);
 Wait(100);
    
 OnRev(OUT_A+OUT_C);//forward
 Wait(54);
 Off(OUT_A+OUT_C);
 Wait(100);
 
 OnFwd(OUT_B);//down
 Wait(43);
 Off(OUT_B);
 
 OnRev(OUT_A+OUT_C);//forward
 Wait(26);
 Off(OUT_A+OUT_C);
 Wait(100);
 
 }
 
 OnRev(OUT_B);//up
 Wait(43);
 Off(OUT_B);
 
 OnFwd(OUT_A+OUT_C);//back
 Wait(48);
 Off(OUT_A+OUT_C);
 Wait(100);
 
 OnRev(OUT_A); OnFwd(OUT_C);//turn right 45 degrees
 Wait(32);
 Off(OUT_A+OUT_C);
 Wait(100);
    
 OnRev(OUT_A+OUT_C);//forward
 Wait(51);
 Off(OUT_A+OUT_C);
 Wait(100);
 
 OnFwd(OUT_B);//down
 Wait(43);
 Off(OUT_B);
 
 OnRev(OUT_A+OUT_C);//forward
 Wait(60);
 Off(OUT_A+OUT_C);
 
 OnRev(OUT_B);//up
 Wait(43);
 Off(OUT_B);
 
 OnFwd(OUT_A+OUT_C);//back
 Wait(52);
 Off(OUT_A+OUT_C);
 Wait(100);
    
 OnRev(OUT_A); OnFwd(OUT_C);
 Wait(64);
 Off(OUT_A+OUT_C);
 Wait(100);
    
 OnRev(OUT_A+OUT_C);//forward
 Wait(53);
 Off(OUT_A+OUT_C);
 Wait(100);
   
 OnFwd(OUT_B);//down
 Wait(43);
 Off(OUT_B);
 
 OnRev(OUT_A);
 Wait(22);
 Off(OUT_A);
 OnRev(OUT_C);
 Wait(22);
 Off(OUT_C);
 OnRev(OUT_A);
 Wait(22);
 Off(OUT_A);
 OnRev(OUT_C);
 Wait(21);
 Off(OUT_C);
 OnRev(OUT_A);
 Wait(23);
 Off(OUT_A);
 OnRev(OUT_C);
 Wait(20);
 Off(OUT_C);
 OnRev(OUT_A);
 Wait(22);
 Off(OUT_A);
 
 OnRev(OUT_B);//up
 Wait(43);
 Off(OUT_B);
 
 }

-整理後:何度もする動作は顎の部分以外なかったため、サブルーティン等は使いませんでした。





*コメント [#jaa50fa2]
ありましたら、お願いしますm(_ _)m
- 筆とタイヤの間隔でつまづくのは誰もが経験することです。もう一人のプログラムも書いてくださいね -- [[なかむら]] &new{2008-11-12 (水) 17:16:16};
- サブルーチンが使えていて良いです。 -- [[なかむら]] &new{2008-11-29 (土) 13:04:03};

#comment

ロボットの説明も詳しいし、工夫した点も良くかけています。   FI
RIGHT:&size(15){&counter;};

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