[[2016a/Member]] 目次 #contents *機体の説明 [#h3618312] 全体の画像を見てもらうとわかるがタイヤあたりにパーツが集中しているのがわかると思う。これはできる限り軽量化したのとペン先をタイヤに近づけた結果だ。 そのほかタイヤを最初の4つから2つにすることで回転のときの摩擦を少なくし回転させやすくしている。 また、なくした後ろタイヤの代わりに半球のブロックを用いているが、 これは摩擦を少なくするという理由のほかに、紙の段差をどうするかというときに 球体なら乗り越えられたため、という理由もある。 &ref(./01.jpg,15%,機体画像1); &ref(./03.jpg,15%,機体画像2); 次に重要なペンの出し入れ部分だが下の画像のように上下左右の両方から固定することで ペンが強い力で書かれても、持つ部分が壊れないようにできている。 (大きな力がかかった場合、後ろが崩れるようにできている。) 画像を見ると持つ部分が大きいと思ってしまうかもしれないが、 これでも最初のプロトタイプから改良を重ね、1/3以上はブロックを削っている。 &ref(./02.jpg,15%,機体画像3); これは分解したときの画像だが、先生の言った通り3つのパーツによって構成できていることがわかると思う。実はこれは先生が言う前からこうなっていた。 理由としては、パーツごとに分けることで改良がしやすく、また逆にどこがいけないのかも分かりやすいと思ったためだ。 &ref(./04.jpg,15%,機体画像4); 左:車体 右上:ペンを持つ部分 右下:本体 &ref(./05.jpg,45%,機体画像1); &ref(./05.jpg,45%,顔1); 画像が暗いがご愛嬌。 一応メンバーの鈴木に似ている気がしなくもない。(どちらかというと松本先生に似ている) 小さいので最後にもう一回張ってある *プログラムの説明 [#j62118fe] #define MoveTime 8 //1cm進むための時間 #define TurnTime 16 //15度進むための時間 定義処理は進む距離と回転の時間のみ マクロは定義0(自分が嫌いなため) task main() { Setting(); //初期設定(タイヤのスピード、ペンのスピード) //お絵かきすたーと pen_move(); ////////////////円 OnRev(OUT_C); Wait(1000); ////////////////円終了(顔の外郭) //:::::::::::::::::::::髪の毛 turn(45); move(5); turn(30); move(5); turn(30); move(5); //:::::::::::::::::::::髪の毛終了 pen_back(); /*目は一筆では無理なので一旦ペンを離す(上に上げる) 今後もペンを離すときがある*/ turn(45); turn(45); OnFwd(OUT_AC); Wait(4); Off(OUT_AC); pen_move(); move(2);/////////////右目 pen_back(); turn(3); move(3); turn(3); Off(OUT_AC); pen_move(); move(2);/////////////左目 pen_back(); ///////////////////////口(クチ) OnRev(OUT_A); OnFwd(OUT_C); Wait(48); //半時計回りは使うのがこの一箇所だけだったためメソッド化していない move(1); pen_move(); OnRev(OUT_A); OnFwd(OUT_C); Wait(100); ///////////////////////口終了 pen_back(); Off(OUT_ABC);//end } メイン(task)では顔→髪→右目→左目→口 の順に書いている 一番凝っているのは髪だ。 だが、最初からこう書こうとしていたわけではなく、8角形で顔を書こうとしていた時の 失敗がそのまま使われている。 void Setting() { SetPower(OUT_B,5);//力が小さいとペンが動かないため(大きすぎるとペンが飛ぶ) SetPower(OUT_AC,1); //スピードが速いと誤差が大きくなりやすいため } セットパワーがあるのをネットで見つけたときは「まじかよ」と思った。 正直これがなかったら速くて制御しづらいし、 この後のペンの制御ももっと長くなっていたと思う void pen_move() { OnRev(OUT_B); Wait(100);//先が地面につくまで待機 //Offすると進む抵抗に負けてペン先が出ないので常にON } void pen_back() { OnFwd(OUT_B); Wait(100); Off(OUT_B); } ここで注目してほしいのはpen_move()している間は常にOUT_B(モータB)が常にONになっていることだ。OFFするとペンの抵抗が大きいため、書く前に上に逃げてしまう。 ONにすることで、常にペンを地面につけ、書くことを可能にしている。 void turn(int kakudo) { //時計回りのみ //反時計は使用回数が少なかったため書いていない(56行目のみ使用) OnRev(OUT_C); OnFwd(OUT_A); if(kakudo ==3) Wait(5);//細かい角度の変更(微調整用の値) else if(kakudo%15==0) Wait((kakudo/15)*TurnTime); Wait(7); } ここが一番雑に作ってしまったところだ。 (引数が雑なのは言ってはいけない。) 実はこれはmainが書き終わった後書き直したもので、その前はif () else if () else if という形になっていた。これはもし45度と90度などで誤差がでたとき調整できるようにだった のだが、結局TurnTimeの誤差が少なかったためこの形に落ち着いた。 *15の倍数以外の例外処理はめんどくさくてしていない* kakudo==3のときは3度動かすわけではない(if(kakudo == 0)にすればよかったと今になって思う) void move(int cench){ int time=cench*MoveTime; OnRev(OUT_AC); Wait(time); Off(OUT_AC); Wait(100); } void back(int cench){ int time=cench*MoveTime; OnFwd(OUT_AC); Wait(time); Off(OUT_AC); Wait(100); } 一番最初に作ったメソッド、なんで作ったかというとFwdとRevが設計上逆になったため 自分で自分のプログラムにケチをつけるのはあれだが、全体の感想としてはあまり美しくない というか機体の性質上、ペンが上にあるか下にあるかで摩擦の大きさがかなり違うので グローバル変数を用いて、現時点でペンがどこにあるのか判断してWait(t)のtを変化させていればもう少し似顔絵設計に統一性が生まれたのではないかといらんことまで考えてしまう。 *感想と反省点[#b489d4e9] とにかく大変だった。こんなに大変だと知っていたら、このゼミ受けなかったのにと思えるぐらいには大変だった。でも普段は考えないロボットの設計や3人で意見を出し合うなど、大学生に なっただと実感できる課題だった。課題2はもっと難しいが、過去の方たちのものを見たりして 頑張っていこうと思う。 &ref(./06.jpg,15%,機体画像2); &ref(./06.jpg,15%,顔2);