[[2006a/C2/課題1右]]
#hr
CENTER:&size(25){〜『木』を作る書道ロボット〜};
#hr
  目次

CENTER:製作者:伊藤 糸島 堀 (五十音順)

RIGHT:カウンタ&counter;
RIGHT:[[ロボティクス入門ゼミ]]
RIGHT:[[2006a/C2]]
--
目次
#contents
-------
*マシンの特徴 [#f62bcf75]
-ペンの上下機構を「クワ」型にすることにより、煩わしいペンの上げ下げ調整にかける時間を大幅に短縮できる。

-「クワ」型の他の利点は、クワの重量により、ペンと紙の設地具合が、自動で調整されるとこである。そのためペンと紙がうまくあたらずに途中でかすれることや、ペンを強く紙に当てすぎて、マシンの位置がずれることを防止できる。
*マシンの紹介 [#f62bcf75]

|>|CENTER:COLOR(#808080):''全体図とアーム拡大図''|
|BGCOLOR(#C0C0C0):&ref(2006a/C2/課題1右/program-1/dscn2586_Medium.jpg,75%,全体図);|BGCOLOR(#c0c0c0):&ref(2006a/C2/課題1右/program-1/dscn2587_Medium.jpg,75%,アーム);|

-車体は基本、ペンの上下機構は特徴的な「クワ」型のを採用。それをそのままくっつけたシンプルな構造。上の図の青い棒がペンである。

-車体の車輪については、前輪を大きく、そして後輪を小さくし、車体を傾けた。これにより大きく動く「クワ」の上下運動による振動でも、マシンが倒れることはない。

-ペンの上下機構を「クワ」型にすることにより、煩わしいペンの上げ下げ調整にかける時間を
%%%大幅に短縮できる。%%%
((この特徴的なアームのおかげで、ペンと紙の接地に関する問題から解放され、スムーズに作業を進めることが出来きました。))

-「クワ」型の他の利点は、クワの重量により、ペンと紙の設地具合が、
%%%自動で調整される%%%
ことである。そのためペンと紙がうまくあたらずに途中でかすれることや、ペンを強く紙に当てすぎて、マシンの位置がずれることを防止できる。

-「クワ」型のペンの上下機構を目立つ部分に設置し、また大きく動くように作ったので、字を書いているマシンが目立つ。またマシンが一生懸命がんばってる字を書いている感じを、かもし出すことが出来る。

-一見すると複雑で使いにくそうなアーム部分であるが、パーツをひとつはずせば、
%%%簡単にペンが外れ、ほかのペンと交換できる。%%%
((実際、我々は本番直前にかすれたペンから、おニューのぺンへと交換しています。))


|>|>|CENTER:COLOR(#808080):''ペンのブレをなくす機構 ペンありとペンなしの図''|
|BGCOLOR(#c0c0c0):&ref(2006a/C2/課題1右/program-1/dscn2588_Medium.jpg,75%,機構説明1);|→ペンをとりますと→|BGCOLOR(#c0c0c0):&ref(2006a/C2/課題1右/program-1/dscn2590_Medium.jpg,75%,機構説明2);|

-クワ型機構の場合、左右のぶれに弱いが、あまったパーツで左右の
%%%ブレをなくす機構%%%
を追加した。

-右上図の緑色のパーツによって挟まれている「L」字型のパーツでペンを挟む。 するとペンが左右にずれ無くなり安定した字が書ける。

-筆圧はアームの重みで調整する。字のブレ・乱れはこの機構で防止する。


*実際に木を「作る」ロボットのプログラム(改良済み) [#t5894338]


我が班は木を書くのではなく、木を「作る」にこだわります(謎)

以下に、とりあえずのプログラムを載せます。

とりあえずと言ったのは、直前などに調整を行う可能性があるからです。
%%とりあえずと言ったのは、直前などに調整を行う可能性があるからです。%%



下記のプログラムは、当初予定していた地道なプログラムを全面改良したものである。

 モーターA:ペンを上下に動かす機構に関わる 順回転でペンをおろす
 モーターB:左側の動力に関わる 順回転で前進
 モーターC:右側の動力に関わる 順回転で前進

 int turn_time   ;
 
 #define FF OUT_B+OUT_C     //for straight
 #define FL OUT_B          //for turning left
 #define FR OUT_C           //for turning right
 #define FA OUT_A           //for raising and lowering the arm
 #define FF OUT_B+OUT_C     //for straight 前進あるいは後退
 #define FL OUT_B          //for turning left 左に曲がる
 #define FR OUT_C           //for turning right 右に曲がる
 #define FA OUT_A           //for raising and lowering the arm ペンの上下
 
 #define BASETIME 170       //for the main straight
 #define WHOLETIME 382      //for turning
 #define BASETIME 170       //for the main straight 基本的な長さ
 #define WHOLETIME 382      //for turning *本番直前に1回転に要する時間を計測し、この値を調整する。
 
 
 
 void joint()           // JOINT WAIT
 void joint()           // JOINT WAIT 移動によるマシンのぶれをなくす
 {   Wait(100);         }
 
 
 void age()           // AGE
 void age()           // AGE ペンを上げる
 {   OnRev(FA); Wait(24);  
     Off(FA);       }
 
 void sage()           // SAGE
 void sage()           // SAGE ペンを下げる
 {   OnFwd(FA); Wait(10);  
    Off(FA);       }
 
 
 void go_straight(int t)           // GO STRAIGHT - t/100sec
 void go_straight(int t)      // GO STRAIGHT - t/100sec t秒間直進
 {   OnFwd(FF); Wait(t);  
     Off(FF);        }
 
 void go_back(int t)           // GO BACK - t/100sec
 void go_back(int t)         // GO BACK - t/100sec t秒間後退
 {   OnRev(FF); Wait(t);  
     Off(FF);       }
 
 
 sub turn_left_05()           // TURN LEFT - 0.5
 sub turn_left_05()           // TURN LEFT - 0.5 左に180°回転
 {   turn_time = WHOLETIME ;
     turn_time /= 2 ;
     OnFwd(FF); Rev(FL); Wait(turn_time); 
     Off(FF);         }
 
 sub turn_left_025()           // TURN LEFT - 0.25
 sub turn_left_025()           // TURN LEFT - 0.25 左に90°回転
 {   turn_time = WHOLETIME ;
     turn_time /= 4 ;
     OnFwd(FF); Rev(FL); Wait(turn_time); 
     Off(FF);           }
 
 sub turn_left_0125()           // TURN LEFT - 0.125
 sub turn_left_0125()           // TURN LEFT - 0.125 左に45°回転
 {   turn_time = WHOLETIME ;
     turn_time /= 8 ;
     OnFwd(FF); Rev(FL); Wait(turn_time); 
     Off(FF);              }
 
 
 sub turn_right_05()           // TURN RIGHT - 0.5
 sub turn_right_05()           // TURN RIGHT - 0.5 右に180°回転
 {   turn_time = WHOLETIME ;
     turn_time /= 2 ;
     OnFwd(FF); Rev(FR); Wait(turn_time); 
     Off(FF);              }
 
 sub turn_right_025()           // TURN RIGHT - 0.25
 sub turn_right_025()           // TURN RIGHT - 0.25 右に180°回転
 {   turn_time = WHOLETIME ;
     turn_time /= 4 ;
     OnFwd(FF); Rev(FR); Wait(turn_time); 
     Off(FF);              }
 
 sub turn_right_0125()           // TURN RIGHT - 0.125
 sub turn_right_0125()           // TURN RIGHT - 0.125 右に180°回転
 {   turn_time = WHOLETIME ;
     turn_time /= 8 ;
     OnFwd(FF); Rev(FR); Wait(turn_time); 
     Off(FF);             }
 
 
 
 task main()
 
 {
     go_straight(BASETIME);            //1
     go_straight(BASETIME);      //1 1画目開始 
             joint();      *ペンは最初から紙に付いています。
       age();          1画目終了、ペンを上げる
             joint();
       age();
     go_back(28);                 //2 2画目開始位置に移動開始
             joint();
     go_back(28);                      //2
     turn_left_025();             //3 中心まで戻りターンする
             joint();
     turn_left_025();                  //3
     go_back(29);                 //4 移動完了
             joint();
     go_back(29);                      //4
       sage();           ペンを下ろす
             joint();
       sage();
     go_back(BASETIME);           //5 2画目開始
             joint();        
       age();           2画目終了、ペンを上げる
             joint();
     go_back(BASETIME);                 //5
     go_straight(194);             //6 3画目の開始位置に移動開始
             joint();
       age();
     turn_right_0125();            //7
             joint();
     go_straight(194);                    //6
     go_back(66);                 //7.5 マシン位置を微調整
             joint();       *さらっと書いてますがここでとても苦労しました
       sage();           ペンを下ろして、3画目開始
             joint();
     turn_right_0125();                   //7
             joint();
     go_back(66);                         //7.5
             joint();
       sage();
             joint();
    
 OnRev(FF);                               //8
 SetPower(OUT_B,2);
 OnRev(FF);                     //8
 SetPower(OUT_B,2);        3画目の微曲線のためのモーター回転数調整
 Wait(137);
 Off(FF);
 
             joint();
       age();
       age();           3画目終了、ペンを上げる
             joint();
 
 OnFwd(FF);                               //9
 OnFwd(FF);                   //9 4画目開始位置に移動
 SetPower(OUT_B,2);
 Wait(137);
 Off(FF);
    
            joint();
    go_straight(66);                   //9.5
    go_straight(66);          //9.5 マシン位置の微調整
            joint();
    turn_left_025();                    //10
    turn_left_025();         //10
            joint();
    go_back(66);                       //10.5
    go_back(66);             //10.5 マシン位置の微調整
            joint();
       sage();
       sage();         ペンをさげる
             joint();
 
 OnRev(FF);                                 //11
 SetPower(OUT_C,1);
 OnRev(FF);                 //11 4画目開始
 SetPower(OUT_C,1);     4画目の微曲線のためのモーター回転数調整
 Wait(120);
 Off(FF);
 Off(FF);          4画目完了
 
            joint();
       age();
    
       age();         最後にペンをあげる
   
  //FINISHED         『木』の完成です。ご熟読ありがとう!
 
 
  //FINISHED
 
 
 }

------------
*変身! マシンの主な改良点 [#r6d3cbc0]
|>|>|CENTER:&color(#FF0000){プログラムだけでなくマシンも進化してるんですよ!};|
|CENTER:BGCOLOR(red):COLOR(White):''旧型'' ||CENTER:BGCOLOR(#0000FF):COLOR(White):''新型'' |
|BGCOLOR(red):&ref(2006a/C2/課題1右/program-1/img_1310_2_Medium.jpg,75%,);|→変身→|BGCOLOR(#0000FF):&ref(2006a/C2/課題1右/program-1/dscn2586_Medium.jpg,75%,);|

-旧型はペンがやや不安定だったが、新型はアーム部分を大幅強化した。これによりアームの重量が増加してペンと紙が力強く当たるようになった。

-この改良の結果、より個性的なデザインのマシンになった。

-新型に上記の左右のブレを無くす機構を追加し、ペンのずれを最小限にとどめた。

-上の写真からはよく確認できないかもしれないが、モーターA(ペンの上下にかかわる)とマシン本体の取り付け部分を補強した。これにより、ペンを持ち上げたときに、ペン尻と本体が強く衝突しても、マシンが分解することは無くなった。

-写真からでは判断不可能だが、5/23のタイヤの異音の問題解決のため、シャフト部分にタイヤがずれたりしないような改良を加えた。


------
*プログラム及びマシンの開発日誌 [#eb5ef13e]

-5/16 『作成開始』車体に取りあえずペンを付けてみた。またおおよそのプログラムを書き終えた。
     
-5/18 『実践テスト』5/16のプログラムで実際に文字をマシンに書かせてみた。が、問題発生。字になってない。原因は、ペンの位置と車体との差を考えなかったため。急遽プログラムの修正をせまられる。想定外の出来事に困惑するメンバーだったが、ペンが紙と接する位置と車体の位置の差を小さくするための改良を施し、マシンの位置を調整させるプログラムを追加させることで、問題解決に成功。無事「木」を書くことができた。
-5/18 『実践テスト』5/16のプログラムで実際に文字をマシンに書かせてみた。が、問題発生。字になってない。原因は、ペンの位置と車体との差を考えなかったため。急遽プログラムの修正をせまられる。想定外の出来事に困惑するメンバーだったが、ペンが紙と接する位置と車体の位置の差を小さくするための改良を施して、マシンの位置を調整させるプログラムを追加させることで、問題解決に成功。(この作業は思いのほか面倒だった。同時に数カ所の修正を施すと非常にややこしいことになるため、少しずつプログラムを書き換えては、テスト、また書き換えては、テストを繰り返した。そうして着実に誤差の修正を行えた。)無事「木」を書くことができた。

-5/19 『更なる改良』TAの先生が作ってくださったマシンをみて感動する。負けじと余った時間を利用して、3画目と4画目をきれいに曲げるためのプログラムを追加する。が、repeatを使い、左右のタイヤの回転、停止を繰り返すプログラムでは、線がぶれて奇麗なカーブを描けなかった。そこで絶妙な曲がり具合を表現するために、SetPowerというコマンドを使用。これにより完璧ともいえる曲線を手にすることができた。
-5/19 『SetPower』TAの先生が作ってくださったマシンをみて感動する。負けじと余った時間を利用して、3画目と4画目をきれいに曲げるためのプログラムを追加する。が、repeatを使い、左右のタイヤの回転、停止を繰り返すプログラムでは、線がぶれて奇麗なカーブを描けなかった。そこで絶妙な曲がり具合を表現するために、[[SetPower]]というコマンドを使用。これにより完璧ともいえる曲線を手にすることができた。

-5/23『問題発生』5/19のプログラムチェックのための実践テスト最中。マシンに異常発生。最初に測った一回転にかかる時間が変化している。電池消耗が原因か?それともモーターに異常があるのか? この事態に対応できるようなプログラムに改良することを迫られる。

-5/25 『大幅なプログラム改良』これまでに使用していた地道なプログラムを大幅に改良し、モーターの不調による交換や秒数の変更に瞬時に対応できるようにした。回転などは、1周の所要時間を単純に割っていくだけなので、1周の時間を変えるだけで全ての回転動作の時間を変更できるようにした。
前回の集まりで、前進用の左モーターが不調だとわかり、今日急遽アーム用のモーターと取り替えた。そのようなアクシデントでも、数カ所の修正で済んでしまったので、正確かつ迅速な修正が可能なプログラムになったと思う。
正直、まだ無駄な部分が含まれる可能性もあるので、それはこれから更なる学習を重ねる上で学んでいきたい。
----


*プログラム作成において苦労した点 [#sc2469d6]
 
-マシンの動きを少なくすることで、生じる誤差も減ると考えたので、いかにして無駄な動きを省いてシンプルに動かすかということに苦心した。

-また、一度プログラムを書いてみると、字を書く部分(ペンを持つ部分)がマシンの前方にあるためにかなりの誤差が生じることがわかり、その修正に手間取った。プログラム中の動きの名前に「10.5」などとあるのは、途中で微調整用プログラムを追加したためである。

-「木」という文字は4本の画(かく)が揃わなければならず、その調整についても面倒であった。

-木を作るという事と他の班とはひと味違うという事を見せつけるために、アームを使うことで、ペンをクワに見立てて書けるように工夫した。

-何より、マシンの気分が悪いと毎回のように微妙に動きが違ってくるのが大変だったように感じる。

-途中でWait(100)を書き足して、移動によるマシンのぶれを押さえようと試みたが、うまくいかず。やはり、電池の消耗やモーターのコンディションによる多少のぶれは覚悟せねばならぬのか.....


-変数や関数,サブルーチンなどを用いて、理解しやすく、修正が正確かつ迅速に行えるプログラムに改良した。多少のモーターの機嫌や電池の消耗にも対応できる柔軟性を持つ。



-----
*おまけ [#ucdb407a]
**結果 [#s2423dea]
&ref(2006a/C2/課題1右/program-1/Suimoku_C2R.jpg,50%,);
哀れ なんと こんなにも3画目と4画目がずれています。~
%%本番直前に書かせてみたらうまくいったのになぁ・・・・%%
%%練習のときもうまくいったのになぁ%%

推測されるこの失敗の原因はやはりモーターコンディション。モーターについていろいろ計ってみると、ある程度運動させた後のモーターは、運動させていないモーターよりも、よく回転していました。このことは、1回転にかかる時間を何回か続けて計測したときに明らかになりました。これによりマシンが1回転するのにかかる時間が微妙に変化したためだと思われます。
-----
**このレポートについて [#v4df8531]

*先生のコメント [#o363ab10]
このレポートを作成するにあたって注意したことがあります。それは、「読む人を飽きさせないこと」です。飽きさせないために例えば、「プログラム及びマシンの開発日誌」という項目を設けました。これにより、楽しく我々のマシンの作製過程や問題の発生とその解決 苦労した点、工夫した点が分かってもらえたと思います。
また、レポートのデザインにも気を配りました。最初のマシンの紹介の項目やマシンの改良点を説明する項目ではただ写真を貼り付けるだけではなく、bgcolorやセンタリングするコマンドを使用したり、写真を枠にも入れて、枠のサイズの調整も行ってみました。
プログラムの解説も流れを重視して書きましたので、分かりやすくなっていると自負しております。
--------------
最後になりましたが、ここまで素晴らしいプログラムとマシンを作れたのは、忙しい中無理をして作業を行ってくれたみんなの努力と、的確なアドバイスを下さった先生方のおかげです。 そして画面の前の皆様、ここまで読んでいただきありがとうございました。

RIGHT:                   製作者より

------
*反省点 次に生かしたいこと 分かったこと [#ce4ddbe8]
-「思った以上にモーターのコンディションによる単位時間あたりの回転数が大きかった。」ということを知るのに時間がかかりすぎた。
本格的にマシン・プログラムを製作する前にある程度実験を通じてこのことに気づくべきだった。

-2つのモーターを使って先進、後退、左右の旋回、回転をするマシンではなく、TAの先生が作ってくださったような、前後をひとつのモーターが担当し、左右をひとつ、上下をひとつのモーターが担当するマシンのほうが、モーターの影響を受けにくく、今回の課題に適している。

-マシンの作成過程であまり写真を撮らなかったため、詳しく説明することが出来なかった。次からは製作途中の写真も撮影しより詳しいレポートを書けるようにしたい。

-もし次に機会があるならば、多少のモーターのコンディションなどには動じない、頑丈でもっと頼もしいロボットとプログラムを作製したい。

-----------
*先生やTAの方々のコメント [#o363ab10]
-OnFwd(FF) や OnRev(FF)、Off(FF) などをマクロとして定義してもいいですね。 -- [[松本(教員)]] &new{2006-05-23 (火) 09:52:44};
-丁寧なレポートでよいですね。 -- [[ゆき(TA)]] &new{2006-05-26 (金) 16:13:54};
-説明に注釈をつけたい場合には注釈部分を二重のまる括弧で囲みます。そうするとわざわざ小さな文字のサイズを指定する必要がなくなり、その部分が『注釈』であるということが明確になります。本題と関係のないコメントですみません。 -- [[松本(教員)]] &new{2006-06-14 (水) 10:21:01};
-修正しました。コメントありがとうございました。 -- [[製作者]] &new{2006-06-14 (水) 17:22:58};
-残念ながらNQCでは小数が使えないので、円周率(定数)PI を無理矢理180 と定義して turn_time = (WHOLETIME/2)*x/PI で計算するように turn_left(x) という関数を定義すれば、turn_left(PI/2) とか turn_left(PI/8) のような感じでラジラン風の引数を取らせることもできます。ちょっとトリッキーであまり良くない方法かな… -- [[松本(教員)]] &new{2006-06-14 (水) 17:53:06};

#comment
---------------
RIGHT:[[ロボティクス入門ゼミ]]
RIGHT:[[2006a/C2]]


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS