#contents
*課題について [#xb5307ba]
課題概要は→[[課題1:http://yakushi.shinshu-u.ac.jp/robotics/?2017a%2FMission1]]
~松本での大学生活を表す漢字と言われてもなかなか決まらず、最終的に自分が住む地区の名前、浅間温泉から「浅」という漢字を選んだ。ほかに思いつかなかったといえばそうなのだが、実際やってみて難しい字を選んでしまったと感じた。浅はかであった。向きも長さもバラバラな線が多く、曲線まである。どこまで正確に書こうとするかによって大きく難易度が違う。
*ロボットの基本構造 [#i1cc8a41]
**ロボット本体の構造[#c1df2ec7]

ロボット本体が動き回って字を書くタイプであり、初期に作ったロボットをベースに駆動系に関してはほとんど改良していない。分解と組み直しが容易であると同時にある程度の耐久性がある。しかし前途の通りベースのままであるため車幅が広く、小回りがききにくい。また移動範囲も広くなるという多くの欠点を残した。意外にバランスは良い。アームを設置する構造上の問題でモーターAとCについてはコードが逆向きに接続されており、(実際にはAが正しく繋げないだけなのだが左右の車輪でそれぞれ入力が逆向きではプログラムを書きにくいので統一した)順回転入力で後ろに、逆回転入力で前に走るという特徴を持つ。ちなみにペンを持つほうが後ろである。
#ref(./IMG_06841.JPG,right,20%);

**アーム部の構造 [#f6c10e39]

#ref(./IMG_0683.JPG,20%)
ペンを上下に動かすための構造にはタイヤを用いた。2つのタイヤでペンを挟み、同じ速度で回転させる。そこで、2つのタイヤは同じ大きさの歯車でつなぎ、片方にはモーターの回転を伝えるプーリーを付けた。写真を見れば分かるがモーター→プーリーは小→大の関係であるから、回転数が落ち適正なスピードでペンを動かせる。モーターから見て奥側にプーリーを置くことで輪ゴムを丁度よい具合で張ることができた。(余談だが両方にプーリーを付けると同じ方向に回転する。当然、ペンを持つ構造にはならない。)輪ゴムをそれなりの力で張るため水平方向の負荷がかかる。そのためタイヤを付ける軸の他に2本の支柱らしきものをいれて補強した。それでも油断すると外れるので注意が要る。また、写真では分かりにくいがペンの下部を支える部品を付け、ペン先が暴れるのを防いでいる。この構造の欠点は取り付けられるペンの太さには制限があることだ。一般的なネームペン等が取り付けられるためそこまで大きな問題では無いが、融通が利かない。
#ref(./IMG_0682.JPG,center,20%)

*プログラム [#hef60635]
**定義 [#w5877a18]
 #define ARM_DOWN OnFwd(OUT_B);Wait(40);Off(OUT_B);
 #define ARM_UP OnRev(OUT_B);Wait(40);Off(OUT_B);
 #define GO_FRONT OnRev(OUT_AC);
 #define GO_BACK OnFwd(OUT_AC);
 #define TURN_LEFT OnFwd(OUT_A);OnRev(OUT_C);
 #define TURN_RIGHT OnRev(OUT_A);OnFwd(OUT_C);
 #define STOP Off(OUT_AC);
定義名を見ればだいたい分かるが上からペンを下げる、上げる、ロボットが前進、後進、左回転、右回転、停止するようにするプログラムである。なお一画ごとに調整が必要なため時間指定の定義は入れていない。
**動作プログラム [#c99f29aa]
 task main()
 {
 ARM_DOWN;GO_FRONT;Wait(20);STOP;ARM_UP;
 OnRev(OUT_A);Wait(70);Off(OUT_A);OnRev(OUT_C);Wait(50);Off(OUT_C);
 GO_BACK;Wait(30);STOP;ARM_DOWN;GO_BACK;Wait(20);STOP;ARM_UP;
 TURN_LEFT;Wait(100);GO_FRONT;Wait(40);TURN_RIGHT;Wait(30);STOP;
 GO_BACK;Wait(5);STOP;ARM_DOWN;GO_BACK;Wait(25);STOP;ARM_UP;
 GO_FRONT;Wait(30);STOP;OnRev(OUT_A);Wait(100);Off(OUT_A);
 GO_BACK;Wait(5);STOP;ARM_DOWN;GO_FRONT;Wait(40);STOP;ARM_UP;
 OnRev(OUT_A);Wait(50);Off(OUT_A);OnRev(OUT_C);Wait(50);Off(OUT_C);
 GO_BACK;Wait(45);STOP;ARM_DOWN;GO_BACK;Wait(40);STOP;ARM_UP;
 OnFwd(OUT_A);Wait(50);Off(OUT_A);OnFwd(OUT_C);Wait(50);Off(OUT_C);
 GO_FRONT;Wait(35);STOP;ARM_DOWN;GO_FRONT;Wait(50);STOP;ARM_UP;
 TURN_RIGHT;Wait(60);GO_BACK;Wait(85);GO_FRONT;Wait(60);STOP;
 ARM_DOWN;GO_FRONT;Wait(110);TURN_RIGHT;Wait(20);STOP;ARM_UP;
 GO_BACK;Wait(20);TURN_RIGHT;Wait(70);GO_FRONT;Wait(30);STOP;
 ARM_DOWN;GO_FRONT;Wait(75);STOP;ARM_UP;TURN_RIGHT;Wait(55);GO_FRONT;Wait(90);
 TURN_RIGHT;Wait(50);GO_FRONT;Wait(30);OnRev(OUT_A);Wait(15);STOP;
 ARM_DOWN;GO_FRONT;Wait(15);STOP;ARM_UP;
 }

*完成作品と振り返り [#v6e0aa7a]
#ref(./20170519_182546651.jpg,30%);
ロボットに字を書かせるにあたって、電池が減るに従ってモーターの回転数が少しずつ落ちていくことで時間の調整は毎回必要になった。そしてプログラム完成間近でモーターAの動きが完全におかしくなったため電池を変えたのだが、それにより一気に回転数が上がり調整にかなりの時間がかかってしまった。最終的になんとか読める字に仕上がったものの次回からの課題でもこの性質は理解しておきたいと思った。今回のタイプのロボットで曲線を書かせるのはあまりにも難しく、仮にできたとしても労力に見合う結果は出ないだろう。直線で妥協して正解だった。成果としてはロボットを回転させるにも両輪を動かすパターンと片輪だけを動かすパターンがあり、回転半径が違う2つの使い分けがうまくできたことがあげられる。プログラムを増やして微調整するよりも楽になることがある。もっと上手くプログラムを書ければもっと楽に、美しくなると思った。

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