[[2006a/C2/課題1右]]
#hr
CENTER:&size(25){〜『木』を作る書道ロボット〜};
#hr
  目次
#contents
-------
*マシンの特徴 [#f62bcf75]
-ペンの上下機構を「クワ」型にすることにより、煩わしいペンの上げ下げ調整にかける時間を大幅に短縮できる。

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

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






*実際に木を「作る」ロボットのプログラム(改良済み) [#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 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 移動によるマシンのぶれをなくす
 {   Wait(100);         }
 
 
 void age()           // AGE ペンを上げる
 {   OnRev(FA); Wait(24);  
     Off(FA);       }
 
 void sage()           // SAGE ペンを下げる
 {   OnFwd(FA); Wait(10);  
    Off(FA);       }
 
 
 void go_straight(int t)           // GO STRAIGHT - t/100sec
 {   OnFwd(FF); Wait(t);  
     Off(FF);        }
 
 void go_back(int t)           // GO BACK - t/100sec
 {   OnRev(FF); Wait(t);  
     Off(FF);       }
 
 
 sub turn_left_05()           // TURN LEFT - 0.5
 {   turn_time = WHOLETIME ;
     turn_time /= 2 ;
     OnFwd(FF); Rev(FL); Wait(turn_time); 
     Off(FF);         }
 
 sub turn_left_025()           // TURN LEFT - 0.25
 {   turn_time = WHOLETIME ;
     turn_time /= 4 ;
     OnFwd(FF); Rev(FL); Wait(turn_time); 
     Off(FF);           }
 
 sub turn_left_0125()           // TURN LEFT - 0.125
 {   turn_time = WHOLETIME ;
     turn_time /= 8 ;
     OnFwd(FF); Rev(FL); Wait(turn_time); 
     Off(FF);              }
 
 
 sub turn_right_05()           // TURN RIGHT - 0.5
 {   turn_time = WHOLETIME ;
     turn_time /= 2 ;
     OnFwd(FF); Rev(FR); Wait(turn_time); 
     Off(FF);              }
 
 sub turn_right_025()           // TURN RIGHT - 0.25
 {   turn_time = WHOLETIME ;
     turn_time /= 4 ;
     OnFwd(FF); Rev(FR); Wait(turn_time); 
     Off(FF);              }
 
 sub turn_right_0125()           // TURN RIGHT - 0.125
 {   turn_time = WHOLETIME ;
     turn_time /= 8 ;
     OnFwd(FF); Rev(FR); Wait(turn_time); 
     Off(FF);             }
 
 
 
 task main()
 
 {
     go_straight(BASETIME);      //1 1画目開始 
             joint();      *ペンは最初から紙に付いています。
       age();          1画目終了、ペンを上げる
             joint();
     go_back(28);                 //2 2画目開始位置に移動開始
             joint();
     turn_left_025();             //3 中心まで戻りターンする
             joint();
     go_back(29);                 //4 移動完了
             joint();
       sage();           ペンを下ろす
             joint();
     go_back(BASETIME);           //5 2画目開始
             joint();        
       age();           2画目終了、ペンを上げる
             joint();
     go_straight(194);             //6 3画目の開始位置に移動開始
             joint();
     turn_right_0125();            //7
             joint();
     go_back(66);                 //7.5 マシン位置を微調整
             joint();       *さらっと書いてますがここでとても苦労しました
       sage();           ペンを下ろして、3画目開始
             joint();
    
 OnRev(FF);                     //8
 SetPower(OUT_B,2);        3画目の微曲線のためのモーター回転数調整
 Wait(137);
 Off(FF);
 
             joint();
       age();           3画目終了、ペンを上げる
             joint();
 
 OnFwd(FF);                   //9 4画目開始位置に移動
 SetPower(OUT_B,2);
 Wait(137);
 Off(FF);
    
            joint();
    go_straight(66);          //9.5 マシン位置の微調整
            joint();
    turn_left_025();         //10
            joint();
    go_back(66);             //10.5 マシン位置の微調整
            joint();
       sage();         ペンをさげる
             joint();
 
 OnRev(FF);                 //11 4画目開始
 SetPower(OUT_C,1);     4画目の微曲線のためのモーター回転数調整
 Wait(120);
 Off(FF);          4画目完了
 
            joint();
       age();         最後にペンをあげる
   
  //FINISHED         『木』の完成です。ご熟読ありがとう!
 
 }


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

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

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

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

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


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

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

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

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

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

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


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


-----


*先生のコメント [#o363ab10]
-OnFwd(FF) や OnRev(FF)、Off(FF) などをマクロとして定義してもいいですね。 -- [[松本(教員)]] &new{2006-05-23 (火) 09:52:44};

#comment


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