#contents

*課題1 [#v0ce1897]
今回の課題はA4用紙に文字(自分が住んだことのある地名)を書けるロボットを作ることである。
*1.ロボット本体 [#eae4fc7c]
**特徴 [#iade8a54]
ロボットをx軸方向に動くローバーとy軸方向に動くローバーの2つに分けた。

#ref(2017b/Member/ats/Mission1/DSC_0471.JPG,116.2KB,ロボット本体)

これはロボット全体の写真である。左のローバーが橋の上を動き、右のローバーが地上を動く。また、左のローバーはモーターが2つついており、片方がタイヤを駆動させ、もう一方がペンの角度を変えられるようにしてある。

**地上ローバー[#i3d1b13d]

#ref(2017b/Member/ats/Mission1/photo2.JPG,79.2KB,改善前の橋)


これは試作段階のロボットの写真である。地上ローバーが加速、減速するときに橋の先端部分にあるタイヤがわずかに遅れて動くことで橋が前後に揺れることがあった。橋上のローバーが動ける範囲は10cm弱であるため、このロボットが書ける文字の大きさは比較的小さい。このため、橋の揺れが小さくてもその影響が文字に大きくでてしまうという問題があった。


それに加えて、橋自体にも問題があった。この橋の上には2列ずつの凸凹があり、この間に橋上のローバーのタイヤを乗せ、真っすぐ走らせていたが、この方法では凸凹にタイヤが当たった時に橋上のローバーの速度が落ちることがあった。

#ref(2017b/Member/ats/Mission1/DSC_0468.JPG,91.0KB,改善後)

これを解決するために、上の写真のように、橋の先端部分のほかに、中間地点にもタイヤを取り付けた。歯車を使ってモーターの回転を伝えていき、地上ローバーの2つの後輪と橋の中間位置にあるタイヤを全て駆動輪にした。橋の中間位置にあるタイヤを橋と直接つなげたので、橋の先端部分のタイヤの動きの遅れによって生じる揺れを低減できた。

橋の上の凸凹による問題は橋のつくりを変えることで解決した。具体的には、凸凹があると動きが安定しないので、橋の外側に壁を設けて橋上ローバーがそれに沿って走行するようにした。これにより、ローバーがなめらかに、かつ直線的に動くようになった。

*2.書き方とプログラム [#n7292b26]
**書き方 [#gc291028]
最初に小諸という文字を書くことに決めた。「諸」の文字は始めは横棒をすべて書いてから縦棒を書くという順番で書いていた。しかし、この手順だと、ロボットの動きに誤差が生じたときに横棒と縦棒の位置が合わず、全く判読できない字になってしまうことがあった。 そこで、下図のような書き順で書くことで誤差が生じても字全体としての形を保つようにした。その代わりにこの書き方はプログラムが大変になる。そこで、横棒を書いてその後移動するところまでを入れたサブルーチンを作っておき、それを使って書き換えた。
#ref(2017b/Member/ats/Mission1/photo3.JPG,78.6KB,書き順);

**プログラム [#ce2cc994]

以下のように文字を定義した。スピードを始めに固定し、そのスピードで1cm進むのに何秒かかるかを測定して定義した。
 #define C_onecmfor 78  //地上ローバーが1cm前進するのに必要な時間
 #define C_onecmback 68   //地上ローバーが1cm後退するのに必要な時間   
 #define speed_C -25      //地上ローバーのスピード
 #define speed_B 15       //ペンを上下するスピード
 #define pen_timeDOWN 113 //ペンを下すのに必要な時間
 #define pen_timeUP 130   //ペンを上げるのに必要な時間
 #define A_onecmfor 190   //橋上ローバーが1cm前進するのに必要な時間   
 #define A_onecmback 193  //橋上ローバーが1cm後退するのに必要な時間
 #define speed_A 25       //橋上ローバーのスピード


以下のようにサブルーチンを定義した。実際にローバーが動く距離が理論値より小さかったため、全ての移動におけるWaitの時間を少し増やしてある。前後左右それぞれに1cm動くためのサブルーチンに加えて、四角形を書くプログラムや横棒を書いてさらにその後移動するサブルーチンも書いた。
ペンをおろすサブルーチンにWaitを入れることでローバーが動いた直後の揺れが文字に影響を与えないようにした。

 sub C_forward(int x)        //地上ローバーをxcm前進させる
 {
     OnFwd(OUT_C,speed_C);
     Wait(C_onecmfor*x*7/5);          
     Off(OUT_C);
 }
 sub C_back(int x)           //地上ローバーをxcm後退させる
 {
     OnRev(OUT_C,speed_C);
     Wait(C_onecmback*x*7/5);
     Off(OUT_C);
 }
 sub A_forward(int x)        //橋上ローバーをxcm前進させる
 {
     OnFwd(OUT_A,speed_A);
     Wait(A_onecmfor*x*7/5);
     Off(OUT_A);
 }
 sub A_back(int x)           //橋上ローバーをxcm後退させる
 {
     OnRev(OUT_A,speed_A);
     Wait(A_onecmback*x*7/5);
     Off(OUT_A);
 }
 sub pen_down()              //ペンを下す
 {
     OnFwd(OUT_B,speed_B);
     Wait(pen_timeDOWN);
     Off(OUT_B);
     Wait(1000);
 }
 sub pen_up()                //ペンを上げる
 {
     Wait(500);
     OnRev(OUT_B,speed_B);
     Wait(pen_timeUP); 
     Off(OUT_B);
 }
 sub SYOUNANAME_MIGI()        //小の斜め棒を書く
 {
     OnFwd(OUT_C,10.3);      
     OnRev(OUT_A,speed_A/2);    
     Wait(A_onecmback*14/5);     
     Off(OUT_AC);
 }
 sub SYOUNANAME_HIDARI()      //小の斜め棒を書く
 {
     OnRev(OUT_C,17);
     OnRev(OUT_A,speed_A);
     Wait(A_onecmback*7/5);   
     Off(OUT_AC);
 }
 sub MORO_HIDARI() //諸の斜め棒を書く         
 {
     OnFwd(OUT_C,10);   
     OnRev(OUT_A,speed_A);    
     Wait(A_onecmback*7/5);
     Off(OUT_AC);
 }
 sub MORO_MIGI() //諸の斜め棒を書く
 {
     OnRev(OUT_C,17);
     OnRev(OUT_A,speed_A*2);  
     Wait(A_onecmback*21/10); 
     Off(OUT_AC);
 }
 sub KUTI(int x, int y)       // 四角形を書く 縦→y  横→x 
 {
     pen_down();
     A_back(x);
     pen_up();
     pen_down();
     C_forward(y*1.4);
     pen_up();
     C_back(y*1.4);
     A_forward(x);
     pen_down();
     C_forward(y);
     pen_up();  
     pen_down();  
     A_back(x);
     pen_up();
 }
 sub YOKOBOU(int x,int y)    // xcmの横棒をかいてその後下に1cm移動し右にycm進むプログラム
 {
     pen_down();
     A_back(x);
     pen_up();
     C_forward(1);
     A_forward(y);
 }

以下はメインのプログラムである。(丸の中の数字が「書き方」の項目で示した写真の中の数字と対応)

 {
     A_forward(4);
    
     Wait(600);
     pen_down();
     C_forward(6);       // ��
     pen_up();
     
     A_forward(3);      
     C_back(3);         
    
     Wait(400);
     pen_down();
     SYOUNANAME_MIGI();   // ��
     pen_up();
 
     A_back(4);
     
     pen_down();
     SYOUNANAME_HIDARI(); // ��
     pen_up();
  
     C_forward(6);
     A_forward(2);
 
     pen_down();
     MORO_HIDARI();        // �そ堯ー个�
     MORO_HIDARI();     // ��
     pen_up();
     
     C_forward(1);
     A_forward(2);    
     YOKOBOU(3,2);     // ��
     YOKOBOU(1,1);     // ��
     YOKOBOU(1,1);     // ��
     KUTI(1.5,1.5);    // ��
     A_forward(4.5);
     C_back(5.5);
   
     Wait(600);
     pen_down();
     C_forward(2);     // ��
     pen_up();
  
     A_forward(1);
     C_back(1);
     
     Wait(600);
     pen_down();
     MORO_MIGI();       // �� 
     pen_up(); 
 
     A_forward(3);
     C_back(3);
     
     Wait(400);
     YOKOBOU(2,3);     //  ��
     YOKOBOU(4,3);     // ��
     KUTI(2,2);        //  ��
     
     A_forward(2);   
     C_back(1);
     
     Wait(600);
     pen_down();
     A_back(2);        //  ��
     pen_up();
 }

*3.感想 [#f7fd1eb3]
最後には判読できる程度の文字は書けたが、美しさはまだまだ足りなかった。もう少しロボット全体を安定した動きにできたかもしれない。次の課題のときはロボットの形が出来上がった後も、慢心せず改善点を探し続けていきたい。下図は発表会での描画。

#ref(2017b/Member/ats/Mission1/photo4.JPG,59.4KB,発表会での描画)

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