[[2017a/Member]]
#contents

* 課題概要 [#t0945512]
 課題1は、15cm四方の中に松本での新生活を表す漢字を書くロボットを作成する課題である。
~ 詳しくは[[課題1>2017a/Mission1]]を参照。
** 選んだ漢字 [#uf147406]
 大学生になり、自由な時間が多くなる分、自分で自分の生活を管理し律することが必要になるということで、「律」という漢字を書くことにした。
* ロボット本体の説明 [#l8443962]
 ロボットを組み立てるときにまず考えたことは、できるだけプログラムによるモータの時間制御が行いやすい機構にするということである。
~ そこで私は、旋回の動作を行わない機構を考えることにした。旋回の動作は時間の設定によって角度が決まるため、正確な時間を設定しないと線の位置がずれてしまう。その上、線を引くたびに旋回を行わなくてはならず、その都度時間を細かく設定しないとならないからである。
~ 以上のことから直線運動のみで字を書くことのできる機構にしようと考えた。具体的にはロボットにアームを取り付け、ロボットの前後移動でY軸方向の移動を、アームの駆動でX軸方向の移動を行い字を書く機構にしている。

** 車体部分 [#k0c22acf]
 ロボット本体は前後移動のみで良いため、モータは1個とキャタピラで走るようにした。キャタピラを選んだのは、タイヤなどよりも広く床に設置しているため、安定感があると考えたからである。
** アームの部分 [#b314981e]
 アーム部分は、ピニオンギアとラックを使用している。アームが伸びてロボットから離れると先端の重みに耐えきれずに傾いてしまうことが製作の途中で発覚したため、ローラーを取り付けてアームを支えるように工夫した。
** ペン部分 [#v351bff4]
 ペンの上げ下げはモーターの回転をウォームギア(ギア比1:3)で減速させ、その回転をさらにプーリーで伝達させることで行っている。また、これらの機構とモーターを密集させると先ほど書いたアーム部分の傾きと安定性に影響を及ぼしてしまうように感じたため、モーターをシャフトを使って延長しながらペン保持部と反対の端に設置している。
* プログラム [#xa05481a]
 プログラムについては、変数宣言・マクロ・サブルーチン、メイン関数の順に説明していく。
** 変数宣言・マクロ・サブルーチン[#f00b6555]
 #define UD_TIME 100	//ペンの上げ下げのための時間(0.1秒)
 int dif_y , dif_x;	//現在の場所から次の場所までのX軸方向・Y軸方向の移動時間
 int leng_y , leng_x;	//線の長さ(時間) 
 sub Set_RU() //ペンを書きはじめの位置にセット<右上>
 {
 	OnFwd(OUT_A);
 	Wait(dif_y);
 	Off(OUT_A);
 	OnFwd(OUT_C);
 	Wait(dif_x);
 	Off(OUT_C);
 }
 sub Set_RD() //ペンを書きはじめの位置にセット<右下>
 {
 	OnRev(OUT_A);
 	Wait(dif_y);
 	Off(OUT_A);
 	OnFwd(OUT_C);
 	Wait(dif_x);
 	Off(OUT_C);
 }
 sub Set_LU() //ペンを書きはじめの位置にセット<左上>
 {
 	OnFwd(OUT_A);
 	Wait(dif_y);
 	Off(OUT_A);
 	OnRev(OUT_C);
 	Wait(dif_x);
 	Off(OUT_C);
 } 
 sub Set_LD() //ペンを書きはじめの位置にセット<左下>
 {
 	OnRev(OUT_A);
 	Wait(dif_y);
 	Off(OUT_A);
 	OnRev(OUT_C);
 	Wait(dif_x);
 	Off(OUT_C);
 } 
 sub Pen_Up()	//ペンを持ち上げる
 {
 	OnRev(OUT_B);
 	Wait(UD_TIME);
 	Off(OUT_B);
 } 
 sub Pen_Down()  //ペンを下ろす
 {
 	OnFwd(OUT_B);
 	Wait(UD_TIME);
 	Off(OUT_B);
 } 
 sub Write_Line_Fwd()	//線を引く:正方向(下→上、左→右)
 {
 	OnRev(OUT_A);
 	Wait(leng_y);
 	Off(OUT_A);
 	OnFwd(OUT_C);
 	Wait(leng_x);
 	Off(OUT_C);
 }
 sub Write_Line_Rev()	//線を引く:逆方向(上→下、右→左)
 {
 	OnFwd(OUT_A);
 	Wait(leng_y);
 	Off(OUT_A);
 	OnRev(OUT_C);
 	Wait(leng_x);
 	Off(OUT_C);
 } 
*** UP_TIME [#e6bddf1d]
*** dif_y・dif_x [#aa26afa1]
*** leng_y・leng_x [#x73c47e1]
~ サブルーチンに関しては大きく分け以下の3種類、計8個のサブルーチンを設定している。基本的にこちらもコメント文に書いてあるが、それぞれ説明していく。
*** Set_RU()・Set_RD()・Set_LU()・Set_LD() [#l97f1441]
 ペンを各線の書き始めの位置へ移動させる。移動する方向でそれぞれ作っており、右上・右下・左上・左下の4方向で分けている。
*** Pen_Up()・Pen_Down() [#jd6d0f1f]
 名前の通りペンの上げ下げを行うためのものである。
*** Write_Line_Fwd()・Write_Line_Rev() [#z6079570]
 線を引くためのものである。ロボットを初めに左下においてから動作を始めるため、左下を原点と考えている。そのため「左から右」と「下から上」を正方向、「右から左」と「上から下」を逆方向としている。
** メインタスク [#i19640ec]
* まとめ [#h1addc95]
* 感想 [#cdec8edc]

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