*ロボットの説明 [#eb5fc73a] ロボット本体はLEGOのmindstorms educationの説明書p2〜p23に参考に土台部分を作成した。LEGOのmindstorms educationの説明書p2〜p23をそのまま活用すると筆のおき場所やもう一つのモーターの設置場所等のスペースの面でうまくいかなかったのでコンピュータを後ろに立てて設置し、その前方に移動する用途別に筆を上げ下げする用のモーターを取り付け、ロボットの中心に筆を設置した。このようにして紙の上を走りながら字を書くといったロボットを製作した。 #ref(IMG_0907(1).JPG) *プログラムの説明 [#a7200bcd] 私は正確に距離を移動させるためにタイヤの直径、円周率、角度の計算、角度を返すことの定義を行い関数とした。そして、曲がる場所に事前に何秒間で何周するか調べることにより曲がる角度を計算し、プログラムに書き込んだ。 ~○定義したプログラム #define speed 50 #define turn_time30 200 #define turn_time45 250 #define turn_time45A 270 #define turn_time90 520 #define turn_time90F 540 #define turn_time90M 580 #define turn_time100 600 #define turn_right30 OnRev(OUT_B,speed);OnFwd(OUT_C,speed);Wait(turn_time30);Off(OUT_BC); #define turn_right45 OnRev(OUT_B,speed);OnFwd(OUT_C,speed);Wait(turn_time45);Off(OUT_BC); #define turn_right90 OnRev(OUT_B,speed);OnFwd(OUT_C,speed);Wait(turn_time90);Off(OUT_BC); #define turn_right90F OnRev(OUT_B,speed);OnFwd(OUT_C,speed);Wait(turn_time90F);Off(OUT_BC); #define turn_right100 OnRev(OUT_B,speed);OnFwd(OUT_C,speed);Wait(turn_time100);Off(OUT_BC); #define turn_left30 OnRev(OUT_C,speed);OnFwd(OUT_B,speed);Wait(turn_time30);Off(OUT_BC); #define turn_left45 OnRev(OUT_C,speed);OnFwd(OUT_B,speed);Wait(turn_time45);Off(OUT_BC); #define turn_left45A OnRev(OUT_C,speed);OnFwd(OUT_B,speed);Wait(turn_time45A);Off(OUT_BC); #define turn_left90 OnRev(OUT_C,speed);OnFwd(OUT_B,speed);Wait(turn_time90);Off(OUT_BC); #define turn_left90M OnRev(OUT_C,speed);OnFwd(OUT_B,speed);Wait(turn_time90M);Off(OUT_BC); #define turn_left100 OnRev(OUT_C,speed);OnFwd(OUT_B,speed);Wait(turn_time100);Off(OUT_BC); #define hurry_up Off(OUT_speed);OnRev(OUT_A,speed);Wait(200);Off(OUT_A); #define hurry_down Off(OUT_BC);OnFwd(OUT_A,speed);Wait(200);Off(OUT_A); #define Let RotateMotor(OUT_BC,SP,angle); #define Advantage(t) angle+=GetAngle(t);Let; #define Return(t) angle-=GetAngle(t);Let;} #define Return(t) angle-=GetAngle(t);Let; #br ~○正確な距離を前進したり、後退するためのプログラム ~float GetAngle(float d) { const float diameter=5.45;//タイヤの直径 const float pi=3.1415;//円周率 float ang=d/(diameter*pi)*360;//角度の計算 return ang;//角度を返す } #br ~○「近」を描くプログラム ~ task main() { Wait(1000); int angle=GetAngle(4.5); hurry_up; turn_right45; hurry_down; Let; hurry_up; Advantage(1.0);//pointA+4.5 turn_left45A; Return(10.0);//pointB-5.5 hurry_down; Advantage(13.0);//pointC+7.5 hurry_up; Return(10.5);//pointA-3.0 turn_left90; Return(2.5);//pointD-5.5 hurry_down; Advantage(10.5);//pointE+5.0 hurry_up; Return(0.5);//pointF+4.5 turn_right90F; Return(12.0);//pointG-7.5 hurry_down; Advantage(16.5);//pointH+9.0 hurry_up; Return(4.5);//pointI+5.5 turn_left45; Return(25.0);//pointJ-19.5 hurry_down; Advantage(21.5);//pointK+2.0 hurry_up; Advantage(3.5);//pointL+5.5 turn_right45; Return(4.0);//pointM+1.5 turn_left90M; Return(7.0);//pointN-5.5 hurry_down; Advantage(7.0);//pointO+1.5 hurry_up; Advantage(5.0);//pointP+6.5 turn_right100; Return(12.0);//pointQ-5.5 hurry_down Advantage(15.5);//pointR+10.0 hurry_up; Return(4.5);//pointS+5.5 turn_left100; Return(11.0);//point-5.5 hurry_down; Advantage(17.5);//point+12.0 hurry_up; Off(OUT_ABC); } *作成時に発生した問題とその解決 [#x597e233] 未完成のプログラムで習字ロボットを動かした際に4つの問題が発生した。 ~・曲がる角度が途中から変化してしまうというものである。 ~→思った通りに曲がらない場所をせチェックし、そこのプログラムを変更していくしかなかった。この際にはほとんどの曲がる場所で変わってしまったのでかなりの時間を要した。 ・筆を紙におろす時間を考えなかったために一筆ごとに少しずつ次の一筆への間隔が広がっていくというものである。 ~→全体のすすむ距離のプログラムを変換させることによって解決した。 ・筆自身の固定が甘く、筆が左右前後にずれやすいというものであった。 ~→部品を追加し、支えることで解決した。このことを下図において説明すると赤色の円で囲まれている部分が左右に揺れるのを抑え、黄色の円で囲まれている部分が文字を書いている際に前進するので筆が前方向に傾いてしまうそれを防ぐためものである。 #ref(IMG_0907.JPG) ~・ロボットを動かすモーターから筆までの距離を計算に入れていなかったために字の形が大幅にずれてしまったことである。 ~→筆を書きたい場所にいくように下がるというプログラムをすることで解決した。 *結果・反省 [#t4c2fff9] マシンとプログラムにおける問題を解決していき、「近」の字を書くことに挑戦したところ解決直後は「近」の字を書くことが出来た。しかし、習字ロボットの公開の際に下図のようにきれいに「近」の字を書くことが出来なかった。このようになった原因について私は三つの原因があると考える。一つ目は私が試験で行っていた時の紙と地面と公開する時の紙と地面が違ったということがある。このことは摩擦が違うことにより曲がる角度が違ったのである。二つ目に試験時に行っていた時の電圧と公開時の電圧の違いである。このことにより、一つ目と同様に曲がる角度が足りなくなってしまった。三つ目に紙の上を走りながら字を書くという形態である。このことは紙の上を走ることにより、紙の位置が地面から見てずれてしまう。これは曲がる角度に影響してしまう。また紙だけ動いてしまい進むことが出来ないという事態に陥ってしまう。これ以上のことにより今回作ったマシンでこれからも行くと仮定したら前進や後退のように秒数でない関数で曲がりかたを決定し、走る場所で変化しないことと電池により行動の内容が変わらないようにすること。新たなアイデアでマシンを構築していきプログラムを多く書かないようにすることが重要である。 #ref(IMG_0925.JPG) *感想 [#ubc6feb6] 今回習字ロボットを製作して思ったのは、自分の行いたいことをマシンにさせたいときには自分自身のアイデアと環境の変化が小さいときに同じパフォーマンスが出来ることが重要だということである。私は繊維学部機械・ロボット学系に所属しておりこれからロボットを作っていく機会はほかの人と比べ多い。その中で自分自身のアイデアで行いたい行動をスムーズかつ最低限のエネルギーで行うことは重要な課題となる。また今回のマシンは摩擦や電池などの要因でうまくいくことが出来なかった。このようなことが起こってしまってはマシンを製作した意味がなくなるかつ全くと言っていいほどに役に立たない。このことからどのようにすれば効率よく目的の行動が出来るのかとどのようにすれば安定した成果を得ることのできるプログラムが出来るのか考えていきたい。