ロボティクス入門ゼミ課題1

#contents

*車体について [#x5df519d]

**試作品 [#b42a1548]

写真のように、モーター二つをアーム、一つを昇降装置として、ロボットアームを模したロボットを製作した。
写真

#ref(./IMG_20161118_8312.jpg,100%.robo)
利点として、本体を移動式にしないことでペン先を安定させ、また移動範囲の広さに付随し大きく正確に書けること、非常に自由度の高い描画能力が見込めた(手首を動かさず物を描く幼児の書き方と酷似しているため)。
ところが製作してみると、ペン先の移動が基本的に円運動となってしまうため、ペン先の直線移動すら制御に難があり、ペンを昇降させる構造もパワー不足であった。

**完成品 [#l810717b]

それらの欠点を克服すべく発想を変えて臨んだものが、この完成品である。
写真
#ref(./IMG_20161118_43279.jpg,100%.robo)


車体は自走式の2つの車体により構成される。説明の簡略化のため、ここでは下の車体を母機、上の車体を子機と呼称する。

***●移動方式について [#nf427ed6]

試作品は直線移動に難があったため、移動方式を簡略化、母機に縦方向(Y軸移動)、子機に横方向(X軸移動)を分担させることで移動の正確性、制御の容易さの両立を狙った。この移動方式はペンの移動をXY座標平面で考えればよいので字を書く時、例えば縦方向上に進みたいときは「Y軸上方向に○秒間」と言ったようにプログラムも容易となった。さながらプリンターの印刷のような方式であった。

ただし、欠点として母機子機同時の移動、つまり斜線や曲線は描画が苦手であったことが発覚。これらを書こうとすると、ペン先のぶれ、誤差が大きくなってしまう。
理由として、子機がペンを下ろしたまま移動するときに紙から受ける抗力+ロボ全体の重心移動が母機の移動方向をわずかにずらしてしまう事がまず1つ、2つ目はこれもやはり紙から受ける抗力によって子機が、自らが走るレールを母機の進行逆方向に押してしまい、レールをぶれさせてしまう事(おそらくこれが最大の理由)が考えられたが、構造上これ以上強度を上げることはできなかったため、なるべく直線の多用で書き上げられるように、字体を考慮する事とした。

***●ペンの昇降方式 [#j4bce0b4]

写真のようにペンの昇降は子機によって行われる。
写真


#ref(./IMG_20161118_11128.jpg,100%.robo)

子機のアームにペンを括り付け、モーターで直接アームを動かすことで十分な出力を得た。難点として、モーターの出力調整が高いとペンを叩きつけてしまい、わずかでも低いとペンを持ち上げることができなかったが、これは解決できた。後から考えれば、ギアを利用すれば簡単に調節できただろう。

***●子機の移動について [#tfb9311c]

写真

#ref(./IMG_20161118_29633.jpg,100%.robo)


子機の移動は母機に取り付けられた車輪付きレールの上で行われる。この車輪は紙の上を通過しうるため、ゴムタイヤを付けたままだと摩擦で紙をずらしてしまう。そのためタイヤを外していわば、ホイールだけの状態でとりつけた。
子機側にもガイドを取り付け、脱線しないよう、まっすぐ進むような工夫も施した


**プログラムについて [#l22e7b73]

車体の項でも説明したように、このロボはXY座標の移動に加え、ペンの昇降で字を書く。
基本的にX軸方向(左右の移動)、Y軸方向(上下の移動)、ペンの昇降のプログラムを作り、その組み合わせで(理論的には)、すべての文字を書くことができる。

***「奏」 [#i9c6fd26]

曲線部分が上手く書けず、誤差も大きすぎて失敗

 //方向はXY軸で定義 
 //上下がY、左右がX
 
 sub GO_Y(int t)                         //y軸方向に進む
 {
    OnRev(OUT_A,-20);
    Wait(t);
    Off(OUT_ABC);
    Wait(1000);
 }
 
 sub BACK_Y(int t)                        //y軸方向に逆に進む
 {
    OnFwd(OUT_A,20);
    Wait(t);
    Off(OUT_ABC);
    Wait(1000);
 }
 sub GR_X(int t)                  //x軸方向右に進む
 {
    OnFwd(OUT_B,20);
    Wait(t);
    Off(OUT_ABC);
    Wait(1000);
 }
 sub GL_(int t)                   //x軸方向左に進む
 {
    OnRev(OUT_B,20);
    Wait(t);
    Off(OUT_ABC);
    Wait(1000);
 }
 
 sub PENUP()                      //ペンを上げる
 {
    RotateMotor(OUT_C,10,-20);
    Wait(20);
    Off(OUT_ABC);
    Wait(1000);
 }
 
 sub PENDOWN()                      //ペンを下げる
 {
    RotateMotor(OUT_C,10,20); 
    Wait(20); 
    Off(OUT_ABC);
    Wait(1000);
 }
 
 sub HITO()                        //縦の曲線部分 上側
 {
    RotateMotor(OUT_C,10,20);      //左払い
    Wait(20);
    Off(OUT_C);
    Wait(1000); 
    
    OnRev(OUT_A,20);
    Wait(400);
    OnRev(OUT_A,20);   
    OnFwd(OUT_B,20);
    Wait(400);
       
    RotateMotor(OUT_C,10,-20);
    Wait(20);
    Off(OUT_C);
    Wait(1000);
 
    OnFwd(OUT_A,20);   
    OnRev(OUT_B,20);
    Wait(400);
    Off(OUT_AB);
    OnFwd(OUT_A,20);
    Wait(400);
    Off(OUT_A);
 
    OnRev(OUT_A,20);
    Wait(300);
    Off(OUT_ABC);
    Wait(1000);
    Off(OUT_A);
 
    RotateMotor(OUT_C,10,20);
    Wait(20); 
    Off(OUT_C);
    Wait(1000);
    Off(OUT_C);
 
    OnRev(OUT_A,20);   
    OnRev(OUT_B,20);
    Wait(400);
       
    RotateMotor(OUT_C,10,-20);
    Wait(20);
    Off(OUT_C);
    Wait(1000);
 
    OnFwd(OUT_A,20);
    OnFwd(OUT_B,20);
    Wait(400); 
 }
 
 sub TEN    //縦の曲線部分 下側
 {
    RotateMotor(OUT_C,10,-20);       //左払い
    Off(OUT_C);
    Wait(1000);
    Off(OUT_ABC);
 
    OnRev(OUT_A,20);
    Wait(150);
    Off(OUT_A);
    OnRev(OUT_A,20);   
    OnFwd(OUT_B,20);
    Wait(250);
    Off(OUT_A);
       
    RotateMotor(OUT_C,10,-20);
    Wait(20); 
    Off(OUT_C);
    Wait(1000);
 
    OnFwd(OUT_A,20);
    OnRev(OUT_B,20);
    Wait(250); 
                          
     RtateMotor(OUT_C,,10,20);        //右払い
     Wait(20); 
     Off(OUT_C);
     Wait(1000); 
    
    OnRev(OUT_A,20);   
     OnRev(OUT_B,20);
     Wait(250);
        
     RotateMotor(OUT_C,10,-20);
     Wait(20); 
     Off(OUT_C);
     Wait(1000):
 }
 
 task main()
 {
    PENUP;
 
    PENDOWN();GR_X(1200);PENUP();  
    
    
    GL_X(300);GO_Y(200);
   
    PENDOWN();GL_X(600);PENUP();
   
    GL_X(600);GO_Y(200);
   
    PENDOWN();GR_X(1800);PENUP();
   
    GR_X(600);GO_Y(200);
   
    PENDOWN();GR_X(600);PENUP();
 
    GL_X(100);GO_Y(150);
 
    PENDOWN();GL_X(400);PENUP();
 
    GR_X(200);BACK_Y(950);
 
    HITO();
 
    GO_Y(400);
 
    TEN();
 }

***「音」 [#z5bfc772]

こちらは斜線部分を極力直線状とすることで安定してかくことができた

 #define MP_XY 20                //モーターの強さは20に固定
 #define MP_Z 10            
 
 sub X_GL(int time)                //X軸左方向に走査
 {
     OnRev(OUT_B,MP_XY);
     Wait(time);
     Off(OUT_ABC);Wait(1000);
 }
 
 sub X_GR(int time)                //X軸右方向に走査
 {
     OnFwd(OUT_B,MP_XY);
     Wait(time);
     Off(OUT_ABC);Wait(1000);
 }
 
 sub Y_UP(int time)                //Y軸方向に1単位進む
 {
     OnRev(OUT_A,MP_XY);Wait(time);
     Off(OUT_ABC);Wait(1000);
 }
 
 sub Y_DWN(int time)            //Y軸方向に1単位進む
 {
     OnFwd(OUT_A,MP_XY);Wait(time);
     Off(OUT_ABC);Wait(1000);
 }
 
 sub PEN_UP()                        //ペンをあげる
 {
     RotateMotor(OUT_C,MP_Z,-20);
     Off(OUT_ABC);Wait(1000);
 }
 
 sub PEN_DWN()                        //ペンをおろす
 {
     RotateMotor(OUT_C,MP_Z,20);
     Off(OUT_ABC);Wait(1000);
 }
 
 task main()
 {
     PEN_UP();
     
     PEN_DWN();Y_DWN(400);PEN_UP();
     
     X_GR(600);
     
     PEN_DWN();X_GL(1200);PEN_UP();
     
     X_GR(200);
     
     PEN_DWN();Y_DWN(400);PEN_UP();
     
     X_GR(800);Y_UP(400);
     
     PEN_DWN();Y_DWN(400);PEN_UP();
     
     X_GL(1200);
     
     PEN_DWN();X_GR(1600);PEN_UP();//
     
     X_GL(300);Y_DWN(300);
     
     PEN_DWN();X_GL(1000);Y_DWN(800);X_GR(1000);PEN_UP();
     
     Y_UP(900);
     
     PEN_DWN();Y_DWN(800);PEN_UP();
     
     Y_UP(600);
     
     PEN_DWN();X_GL(1000);PEN_UP();            
 }

**まとめ [#aa1bb394]

まだまだプログラミングの面で上手く効率的にプログラムできていない点も多くまた、車体ももだ まだ改良できる点が多いことに気づかされた。この反省と、今回得た知識、経験を今後の課題に役立 てていきたい。

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