[[2017a/Member]]~ 目次 #contents *課題1 [#g1e40900] 松本での新しい生活を表す7画以上の漢字1文字を15cm四方の紙に書く。詳しくは[[2017a/Mission1]]を参照。 **選んだ漢字 [#t33a2dc9] 松本の豊かな自然と北アルプスにかかる青空が印象的であったため「空」という漢字を選んだ。 *ロボットの説明 [#v307b7eb] **全体図 [#pe51c239] #ref(2017a/Member/mattu/Mission1/robo_mission1_1.jpg,100%,ロボットの全体図1) #ref(2017a/Member/mattu/Mission1/robo_mission1_3.jpg,100%,ロボットの全体図2) ペン先側を前方とする。 X軸Y軸方向の動作とペンを持たせたアームの上下の動作で書く仕組みのロボットを作った。それぞれの動きにモーターを1つずつ使用し、計3つのモーターを使っている。RISはモーターの回転速度をプログラムで調整できないため、基本的に動作をゆっくりにしたかったのだが、モーター部分のギヤ比を落とす構造を作るのに苦労した。ロボット本体の作成はとても大変だったが、それだけプログラムを書くのは楽だった。 ***前後移動 [#r5b96931] #ref(2017a/Member/mattu/Mission1/robo_mission1_2.jpg,100%,ロボットの側面) 前後移動はサンプルのロボットの構造を流用し、タイヤで移動する仕組みとなっている。当初はサンプルの構造をそのまま使っていたが、漢字の斜め線を書くときにx軸方向とy軸方向の速度に差がありすぎて上手く書けなかったため、ギヤ比を落としてゆっくり移動するように改良した。また上に載せるパーツの重みでタイヤの車軸がしなっていたため、しなりを改善する補強もした。 ***左右移動 [#u7a67a6d] #ref(2017a/Member/mattu/Mission1/robo_mission1_4.jpg,100%,ロボットのレール1) #ref(2017a/Member/mattu/Mission1/robo_misson1_5.jpg,100%,ロボットのレール2) ギヤの歯ブロックを細長い板状のブロックの上側に取り付け、下側に滑らかに動くように平らなパーツを取りつけたものを左右に移動させている。最終的にレールのような構造を作り、滑らかな左右移動を実現した。この可動部分にペンを上下させるアームを取り付けるのだが、重みで左右移動に支障をきたしたため、重みに耐えるための改良を何度か加えている。 この部分もギヤ比を落としてゆっくり移動ができるように工夫した。また3つ付いているうちの、中央の一つが動力を伝える歯車だが、動かすうちにレールがずれないように、両側に一つずつ歯車をつけてレールの移動を安定させた。 ***アーム上下 [#mf96d24a] #ref(2017a/Member/mattu/Mission1/robo_mission1_6.jpg,100%,アーム) マジックペンを取り付け、上下に動かすためのアーム部分である。ペンはゴムで固定してあり、取り外しと取り付け位置の移動がしやすいようにしてある。この部分もゴムを利用したプーリーを使ってギヤ比を下げて動作がゆっくりになるようにしてある。 一時期はマジックペンではなく筆ペンを使って文字を書いたが、筆圧が安定せず線の太さが一定ではなかったためマジックペンを使用することにした。また縦線を書くときにアームの構造上の問題で押しながら(前進しながら)書くことができない上に、何度も上げ下げしているとペンの角度にズレが生じてペンをうまく紙に押し付けられなくなるので、プログラム中で誤差の修正が必要な場合がある。 *プログラムについて [#l23a7ada] **文字の書き順 [#c6be9949] 「空」という漢字の書き順通りに書いている。 **プログラム概要 [#yc67d727] このロボットは前移動、後ろ移動、左移動、右移動、アーム下げ、アーム上げの6つの動きのみで文字を書くため、プログラムができる限り読みやすくなるように、定義とサブルーチンを6つ使用した。 ***定義とサブルーチン [#k346f72a] ペンの上げ下げは常に同じ動きを行えれば良いのでサブルーチンを利用したが、前後と左右移動は画の長さが一画ごとに異なるので、対応できるように"t"を変数とした定義を利用した。 #define go_fwd(t) OnRev(OUT_C); \ Wait(t);Off(OUT_C); //前移動 #define go_back(t) OnFwd(OUT_C); \ Wait(t);Off(OUT_C); //後ろ移動 #define move_left(t) OnFwd(OUT_A); \ Wait(t);Off(OUT_A); //左移動 #define move_right(t) OnRev(OUT_A); \ Wait(t);Off(OUT_A); //右移動 sub armdown() { OnFwd(OUT_B); Wait(110); Off(OUT_B); } //アーム下げ sub armup() { OnRev(OUT_B); Wait(130); Off(OUT_B); } //アーム上げ ***メイン [#r5d93972] task main () { armdown(); //1画目 go_back(60); armup(); move_left(750); armdown(); //2画目 go_back(60); armup(); go_fwd(60); armdown(); //3画目 move_right(1400); go_back(70); armup(); OnFwd(OUT_B); //アームの角度誤差修正 Wait(25); Off(OUT_B); go_fwd(30); move_left(1000); armdown(); //4画目 OnFwd(OUT_AC); Wait(70); Off(OUT_AC); armup(); go_fwd(70); move_right(680); armdown(); //5画目 go_back(70); move_right(370); armup(); go_back(80); move_left(1050); armdown(); //6画目 move_right(800); armup(); move_left(410); armdown(); //7画目 go_back(135); armup(); move_left(600); armdown(); //8画目 move_right(1100); armup(); //終了 } *まとめ [#db133fd6] **結果 [#m552c6ac] #ref(2017a/Member/mattu/Mission1/robo_mission1_7.jpg,100%,完成した漢字) 何度も書いて定義の変数の調整を繰り返した結果、きれいな「空」を書くことができたと思う。アームの構造上余計なハネができてしまったため、改善の余地があると思う。 **感想 [#q7207f09] C言語を使っての本格的なプログラミングははじめてだったため、上手く書けるか不安は大きかったが無事に終えることができてホッとしている。漢字は条件を満たす中で比較的簡単な字を選んだため、もう少し複雑な字でもよかったと思う。ロボットを作ったりプログラミングをする上でチームメイトの力を多く借りたので、自分一人では成し遂げられなかっただろう。 C言語を使っての本格的なプログラミングははじめてだったため上手く書けるか不安は大きかったが、楽しみながら無事に終えることができてホッとしている。漢字は条件を満たす中で比較的簡単な字を選んだため、もう少し複雑な字でもよかったと思う。ロボットを作ったりプログラミングをする上でチームメイトの力を多く借りたので、自分一人では成し遂げられなかっただろう。 この課題で最も大切なことは繰り返すことだと思う。ロボットの構造を考えて組み立てる時もうまく動くように試行錯誤したし、プログラミングをするときもうまく書けるように試行錯誤した。失敗したら何故失敗したのか徹底的に研究して改善するということを繰り返すべきである。