課題について

課題概要は→課題1

松本での大学生活を表す漢字と言われてもなかなか決まらず、最終的に自分が住む地区の名前、浅間温泉から「浅」という漢字を選んだ。ほかに思いつかなかったといえばそうなのだが、実際やってみて難しい字を選んでしまったと感じた。浅はかであった。向きも長さもバラバラな線が多く、曲線まである。どこまで正確に書こうとするかによって大きく難易度が違う。

ロボットの基本構造

ロボット本体の構造

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

IMG_06841.JPG

アーム部の構造

IMG_0683.JPG

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

IMG_0682.JPG

プログラム

定義

     
 #defineARM_DOWNOnFwd(OUT_B);Wait(40);Off(OUT_B)
 #defineARM_UPOnRev(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);

定義名を見ればだいたい分かるが上からペンを下げる、上げる、ロボットが前進、後進、左回転、右回転、停止するようにするプログラムである。なお一画ごとに調整が必要なため時間指定の定義は入れていない。

動作プログラム

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);GO_BACK;Wait(10);STOP;
  ARM_DOWN;GO_FRONT;Wait(15);STOP;ARM_UP;
}
DSC_0005.JPG

あまりに複雑なので図を入れた。矢印が書いた方向、紫は前進、青は後進で書いたことを表す。書き順通り、そしてスタートは一画目、さんずいからである。プログラムは複雑になるが左右の車輪を独立させて回転を命令したり、時間を調節することで様々な移動方法を組み合わせた。同じ長さで書こうと思っても微妙に時間を変えていかないといけなかたり、回転時間も計算通りにならなかったり、形にするのは難しかった。一応一連の動作ごとに改行しているものの、ハッキリ言って見にくく分かりにくい。打ち直すとなったら一苦労である。そこで新しく画ごとに定義してしまおうと思った。

追加の定義

 #define FIRST_STROKE 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;
 #define SECOND_STROKE 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;
 #define THIRD_STROKE 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;
 #define FOURTH_STROKE 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;
 #define FIFTH_STROKE 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;
 #define SIXTH_STROKE ARM_DOWN;GO_FRONT;Wait(50);STOP;ARM_UP;TURN_RIGHT;\
   Wait(60);GO_BACK;Wait(85);GO_FRONT;Wait(60);STOP;
 #define SEVENTH_STROKE 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;
 #define EIGHT_STROKE 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);GO_BACK;Wait(10);STOP;
 #define NINTH STROKE ARM_DOWN;GO_FRONT;Wait(15);STOP;ARM_UP;

改善プログラム

task main()
{
  FIRST_STROKE;
  SECOND_STROKE;
  THIRD_STROKE;
  FOURTH_DTROKE;
  FIFTH_STROKE;
  SIXTH_STROKE;
  SEVENTH_STROKE;
  EIGHTH_STROKE;
  NINTH_STROKE;
}

最初にことわっておくと、このプログラム自体は実際にロボットに入れて動作確認したものではない。だが定義を書き換えて分かりやすくしたプログラムの改善案として提示したい。定義部分はFTRSTから順に画数ごとに動作をまとめた。定義部分が複雑になったが、これにより完成プログラムは非常にスッキリした。調整を入れる時もだいたいどの辺を見れば良いかが分かりやすくなった。まとめる段階で知った方法なのでこのプログラムでの動作確認は出来ていないが、早くこのようにしていれば作業も楽だったかもしれない。

完成作品と振り返り

20170519_182546651.jpg

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


添付ファイル: fileDSC_0005.JPG 69件 [詳細] fileIMG_0682.JPG 58件 [詳細] fileIMG_0683.JPG 95件 [詳細] fileIMG_06841.JPG 67件 [詳細] file20170519_182546651.jpg 80件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-07-13 (木) 14:58:41 (769d)