[[2018b/Member]]
#contents
*課題1:書道ロボット [#t3ee7ac7]
 これまで住んだことのある都道府県名、市町村名、地区名などの中から2文字以上、かつ合計10画以上のものを選び、それをA4の紙を書くロボットを製作せよ。

ということで私は&size(20){ギンザ};という文字を書くことにしました。
※私が赤ちゃんの時、2,3年だけ住んでいました。
*ロボットの説明 [#pb179017]
**全体の構造 [#x27e37d6]
http://yakushi.shinshu-u.ac.jp/robotics/?plugin=ref&page=2018b%2FMember%2Fkozuka%2FMission1&src=hontai.jpeg

できるだけシンプルに、参考資料に載っていたボールをシュートするロボットを基本として、大まかには形を変えず、機体自体が動き、ペンをアームで上げ下げし、文字を書くロボットを作りました。横回転するアームの動作を単純に縦回転する動作に変えた。 [#q55d30c8]
***このロボットを製作した理由 [#t58b01ea]
参考資料のサンプルのロボットを基本とすることで常に安定した走りを行い、プログラムを作るのもやりやすいのではないかと考えた。
#ref(IMG_4603.JPG)
#ref(IMG_E4603.JPG)
※このロボットを参考に制作しました。
***全体の構造に関する反省点 [#p4b8b50d]
参考資料のサンプルのロボットに単に部品を付け加えて作ってしまったためか部品がタイヤに当たり抵抗になってしまうという問題が度々発生してしまった。もう少し工夫をこらして作るべきだった。
**ペンの上下を担うマジックアーム [#h35e5a8c]
http://yakushi.shinshu-u.ac.jp/robotics/?plugin=ref&page=2018b%2FMember%2Fkozuka%2FMission1&src=arm.jpeg

初めに配られたレゴの教材のボールをシュートするロボットのアームを参考にし、アームの部分の歯車を外し、アームの先端にペンを100円ショップで買ったヘアゴムを用いて固定することで、モータの回転によって単純にペンを上下に動かすマジックアームを組み立てた。ヘアゴムではやはり固定する力に限界があるので、文字が簡単に映る油性マジックの使用とロボット自体の動くスピードをゆっくりにすることによってできる限り文字がきれいに映るようにした。また前進ではなく後進によって文字を書くことで、あえてアームにペンをが当たるようにし、支えとしても活用し文字を書くときの安定感を得た。 [#gf041c53]

***アームに関する反省点 [#sb4afa47]
固定したペンの傾きが悪かったために車体を前に進めながら文字を書くときにペン先の摩擦が強くなり、滑らかに字を書くことができなかった。なので文字を書くときは後ろにバックしながら書くという方法に統一した。
*プログラムの説明 [#lb4512f4]
**挑戦した文字 [#j0f78455]
   ギンザ 漢字だと難しいのでカタカナにしました。
**予定した書き順と最終的な形 [#a9c8363f]
#ref(IMG_E4610.JPG)
#ref(IMG_E4610 (1).JPG)
一般的な書き順などはあまり考慮せず、縦線なら縦線を、横線なら横線をすべて書き終えてから次に移り、最後の一画を書き終えたところで1文字完成する形にした。1文字を書き終えて次の文字に向かうとき、線を引くためにロボットが回転してちょうど次の文字の第一画に来るようにすることで、ロボットができる限り無駄な動きをしないようにした。
**プログラム   [#a6113abb]
 ※スタートはペンを紙につけた状態から始める
task main()
{
     OnRev(OUT_BC,30);      //ギンザのギの一本目の横線を引く。
     Wait(1500);
     Off(OUT_BC);
     OnRev(OUT_A,30);      //アームを上に動かし、ペンを紙から離す。
     Wait(150);
     Off(OUT_A);
     OnRev(OUT_C,30);      //ギンザのギの二本目の先端にロボットの向きを合わせる。
     Wait(150);
     Off(OUT_C);
     OnFwd(OUT_B,30);
     Wait(100);
     Off(OUT_B);
     OnFwd(OUT_BC,30);      //ギンザのギの二本目の先端にロボットを進ませる。
     Wait(1500);
     Off(OUT_BC);
     OnFwd(OUT_C,30);      //一本目の横線に平行に線が引けるようにロボットの向きを合わせる。
     Wait(150);
     Off(OUT_C);
     OnRev(OUT_B,30);
     Wait(100);
     Off(OUT_B);
     OnFwd(OUT_A,30);      //アームを下に動かし、ペンを紙につける。
     Wait(150);
     Off(OUT_A);
     OnRev(OUT_BC,30);      //ギンザのギの二本目の線を引く。
     Wait(1500);
     Off(OUT_BC);
     OnRev(OUT_A,30);      //アームを上に動かし、ペンを紙から離す。
     Wait(150);
     Off(OUT_A);
     OnFwd(OUT_BC,30);      //ギンザのギの二本目の先端にロボットを戻す。
     Wait(1500);              (個人的に最後の一画が書きやすくなるため)
     Off(OUT_BC);
     OnRev(OUT_B,30);      //ギンザのギの最後の一画の先端へロボットを動かす。
     Wait(1200);
     Off(OUT_B);
     OnFwd(OUT_BC,30);
     Wait(1200);
     Off(OUT_BC);
     OnFwd(OUT_C,30);
     Wait(1000);
     Off(OUT_C);
     OnRev(OUT_BC,30);
     Wait(800);
     Off(OUT_BC);
     OnFwd(OUT_A,30);      //アームを下に動かし、ペンを紙につける。
     Wait(150);
     Off(OUT_A);
     OnRev(OUT_BC,30);      //ギンザのギの最後の一画を書く
     Wait(1400);
     Off(OUT_BC);
     OnRev(OUT_A,30);      //アームを上に動かし、ペンを紙から離す。
     Wait(150);
     Off(OUT_A);
     OnFwd(OUT_BC,30);     //ギンザのギの半濁点を書く位置へロボットを動かす。
     Wait(1700);
     Off(OUT_BC);
     OnRev(OUT_B,30);      //ギンザのギの半濁点を書く。
     Wait(400);
     Off(OUT_B);
     OnFwd(OUT_A,30);
     Wait(150);
     Off(OUT_A);
     OnRev(OUT_A,30);
     Wait(150);
     Off(OUT_A);
     OnRev(OUT_B,30);
     Wait(400);
     Off(OUT_B);
     OnFwd(OUT_A,30);
     Wait(150);
     Off(OUT_A);
     OnRev(OUT_A,30);
     Wait(150);
     Off(OUT_A);
     OnFwd(OUT_B,30);
     Wait(800);
     Off(OUT_B);
     OnRev(OUT_BC,30);
     Wait(00);
     Off(OUT_BC);
     OnRev(OUT_B,30);
     Wait(600);
     Off(OUT_B);
     OnFwd(OUT_A,30);      //アームを下に動かし、ペンを紙につける。
     Wait(150);
     Off(OUT_A);
     OnRev(OUT_BC,30);      //ンの左下がりの線を引く
     Wait(1000);
     Off(OUT_BC);
     OnRev(OUT_A,30);      //アームを上に動かし、ペンを紙から離す。
     Wait(150);
     Off(OUT_A);
     OnFwd(OUT_BC,30);
     Wait(1000);
     Off(OUT_BC);
     OnRev(OUT_C,30);   //右下がりの先の先端まで回転する
     Wait(500);
     Off(OUT_C);
     OnFwd(OUT_A,30);      //アームを下に動かし、ペンを紙につける。
     Wait(150);
     Off(OUT_A);
     OnRev(OUT_BC,30);   //ンの右下がりの線を書く
     Wait(400);
     Off(OUT_BC);
     OnRev(OUT_A,30);      //アームを上に動かし、ペンを紙から離す。
     Wait(150);
     Off(OUT_A);
     OnRev(OUT_B,30);   //ザの縦線の一本目の先端まで
     Wait(300);
     Off(OUT_B);
     OnFwd(OUT_A,30);      //アームを下に動かし、ペンを紙につける。
     Wait(150);
     Off(OUT_A);
     OnRev(OUT_BC,30);   //ザの縦線の一本目を書く
     Wait(700);
     Off(OUT_BC);
     OnRev(OUT_A,30);      //アームを上に動かし、ペンを紙から離す。
     Wait(150);
     Off(OUT_A);
     OnRev(OUT_B,30);   //ザの縦線の二本目の先端まで
     Wait(150);
     Off(OUT_B);
     OnFwd(OUT_C,30);
     Wait(150);
     Off(OUT_C);
     OnFwd(OUT_BC,30);
     Wait(550);
     Off(OUT_BC);
     OnFwd(OUT_B,30);
     Wait(150);
     Off(OUT_B);
     OnRev(OUT_C,30);
     Wait(150);
     Off(OUT_C);
     OnFwd(OUT_A,30);      //アームを下に動かし、ペンを紙につける。
     Wait(150);
     Off(OUT_A);
     OnRev(OUT_BC,30);   //ザの縦線の二本目を書く
     Wait(1000);
     Off(OUT_BC);
     OnRev(OUT_A,30);     //アームを上に動かし、 ペンを紙から離す。
     Wait(150);
     Off(OUT_A);
     OnFwd(OUT_BC,30);   //ザの横線の先端まで
     Wait(1200);
     Off(OUT_BC);
     OnRev(OUT_C,30);
     Wait(300);
     Off(OUT_C);
     OnFwd(OUT_B,30);
     Wait(300);
     Off(OUT_B);
     OnRev(OUT_C,30);
     Wait(300);
     Off(OUT_C);
     OnFwd(OUT_B,30);
     Wait(300);
     Off(OUT_B);
     OnRev(OUT_C,30);
     Wait(300);
     Off(OUT_C);
     OnFwd(OUT_B,30);
     Wait(300);
     Off(OUT_B);
     OnRev(OUT_C,30);
     Wait(300);
     Off(OUT_C);
     OnFwd(OUT_B,30);
     Wait(300);
     Off(OUT_B);
     OnRev(OUT_BC,30);
     Wait(1200);
     Off(OUT_BC);
     OnFwd(OUT_A,30);      //アームを下に動かし、ペンを紙につける
     Wait(150);
     Off(OUT_A);
     OnRev(OUT_BC,30);   //ザの横線を書く
     Wait(800);
     Off(OUT_BC);
     OnRev(OUT_A,30);     //アームを上に動かし、 ペンを紙から離す。
     Wait(150);
     Off(OUT_A);
     OnRev(OUT_B,30);   //ザの半濁点を書く
     Wait(450);
     Off(OUT_B);
     OnFwd(OUT_A,30);      //アームを下に動かし、ペンを紙につける
     Wait(150);
     Off(OUT_A);
     OnRev(OUT_A,30);     //アームを上に動かし、 ペンを紙から離す。
     Wait(150);
     Off(OUT_A);
     OnFwd(OUT_C,30);
     Wait(250);
     Off(OUT_C);
     OnFwd(OUT_A,30);      //アームを下に動かし、ペンを紙につける
     Wait(150);
     Off(OUT_A);
     OnRev(OUT_A,30);     //アームを上に動かし、 ペンを紙から離す。
     Wait(150);
     Off(OUT_A);  
}
**実際に出来上がった文字 [#s14f62ad]
#ref(IMG_E4609.JPG)
#ref(IMG_E4609 (1).JPG)
※薄かったためボールペンで重ね書きしてある。
予定していたものよりもかなり汚くなってしまったが、まだ読めないこともなく、途中でプログラムにミスが起き続行不可になることもなかったので、個人的には少しうれしかった。しかしながらEV3の班の文字が、自分の班の文字と比べ物にならないくらいきれいに書かれており、大変悔しかった。
**プログラムにおいて工夫した点 [#g834849d]
・できるだけ繊細な動きを可能にするために出力を控えめにした。
・右左折や旋回をするときに急に動きを変えることで紙がずれてしまわないように一つ一つの動きの間に1秒間の静止時間を設けた。
**プログラムの反省点 [#o6484c37]
-#defineや関数などを使わずに、単純な命令でプログラミングしてしまったため、とても長いプログラミングになってしまった。
-すべて秒数とモータのスピードでプログラミングしたため、その時その時の電池の残量に合わせてロボットの動きが変わってしまうため、細かい調整をするのが大変だった。
*考察・感想[#l30d0760]
銀嶺祭の準備やサークルの活動などが、ロボット製作期間と重なってしまい、とても限られた時間しかなくなってしまったが、逆にその時間に集中して作業に取り組むことができたのでよかった。プログラミング自体が初めてだったので最初は困惑していたが、グループで助け合いながら課題に打ち込むことができてよかった。またグループのメンバーにとても感謝している。しかしながら簡単な命令だけでプログラムを作ってしまったので、次回の課題では先生に教えていただいたより高度なプログラムを制作したい。



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