目次
#contents
*ロボットの説明 [#eb5fc73a]
ロボット本体はLEGOのmindstorms educationの説明書p2〜p23に参考に土台部分を作成した。LEGOのmindstorms educationの説明書p2〜p23をそのまま活用すると筆の設置場所やもう一つのモーターの設置場所等のスペースの面でうまくいかなかったのでコンピュータを後ろに立てて設置し、その前方に移動する用途別に筆を上げ下げする用のモーターを取り付け、ロボットの中心に筆を設置した。このようにして紙の上を走りながら字を書くといったモーターの中心とペン先が5.5�僂離蹈椒奪箸鮴什遒靴拭�
#ref(IMG_0907(1).JPG)
*プログラムの説明 [#a7200bcd]
私は正確に距離を移動させるためにタイヤの直径、円周率、角度の計算、角度を返すことの定義を行い関数とした。そして、曲がる場所に事前に何秒間で何周するか調べることにより曲がる角度を計算し、プログラムに書き込んだ。
~○定義したプログラム
~注意 このプログラムは1秒を1000としてあらわす。
#define speed 50//モーターの出力が50%
#define turn_time30 200//30度回転するための時間
#define turn_time45 250//45度回転するための時間
#define turn_time45A 270//A地点での45度回転する時間
#define turn_time90 520//90度回転するための時間
#define turn_time90F 540//F地点で90度回転するための時間
#define turn_time90M 580//M地点で90度回転するための時間
#define turn_time100 600//100度回転するための時間
#define turn_right30 OnRev(OUT_B,speed);OnFwd(OUT_C,speed);Wait(turn_time30);Off(OUT_BC);//右に30度回転する
#define turn_right45 OnRev(OUT_B,speed);OnFwd(OUT_C,speed);Wait(turn_time45);Off(OUT_BC);//右に45度回転する
#define turn_right90 OnRev(OUT_B,speed);OnFwd(OUT_C,speed);Wait(turn_time90);Off(OUT_BC);//右に90度回転する
#define turn_right90F OnRev(OUT_B,speed);OnFwd(OUT_C,speed);Wait(turn_time90F);Off(OUT_BC);//F地点で右に90度回転する
#define turn_right100 OnRev(OUT_B,speed);OnFwd(OUT_C,speed);Wait(turn_time100);Off(OUT_BC);//右に100度回転する
#define turn_left30 OnRev(OUT_C,speed);OnFwd(OUT_B,speed);Wait(turn_time30);Off(OUT_BC);// 左に30度回転する
#define turn_left45 OnRev(OUT_C,speed);OnFwd(OUT_B,speed);Wait(turn_time45);Off(OUT_BC);//左に45度回転する
#define turn_left45A OnRev(OUT_C,speed);OnFwd(OUT_B,speed);Wait(turn_time45A);Off(OUT_BC);//A地点左に45度回転する
#define turn_left90 OnRev(OUT_C,speed);OnFwd(OUT_B,speed);Wait(turn_time90);Off(OUT_BC);//左に90度回転する
#define turn_left90M OnRev(OUT_C,speed);OnFwd(OUT_B,speed);Wait(turn_time90M);Off(OUT_BC);//M地点で左に90度回転する
#define turn_left100 OnRev(OUT_C,speed);OnFwd(OUT_B,speed);Wait(turn_time100);Off(OUT_BC);//左に100度回転する
#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);//angleの値により前進したり、後退したりする
#define Advantage(t) angle+=GetAngle(t);Let;//angleの値にtという値を加える
#define Return(t) angle-=GetAngle(t);Let;//angleの値にtという値を引く
#br
~○正確な距離を前進したり、後退するためのプログラム
float GetAngle(float d)
{
const float diameter=5.45;//タイヤの直径
const float pi=3.1415;//円周率
float ang=d/(diameter*pi)*360;//角度の計算
return ang;//角度を返す
}
#br
~○「近」を描くプログラム
~注意 Advantage(α)かReturn(β);//point? +or−数字
~これは図にある?の場所にあり、数字の�僂世荏或覆靴燭箸いΔ海箸任△襦�もし−の場合は後退したといことである。
#ref(斤.png)
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 「近」の「斤」部分完成
#ref(sinnyou.png)
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]
今回習字ロボットを製作して思ったのは、自分の行いたいことをロボットにさせたいときには自分自身のアイデアと環境の変化が小さいときに同じパフォーマンスが出来ることが重要だということである。私は繊維学部機械・ロボット学系に所属しておりこれからロボットを作っていく機会はほかの人と比べ多い。その中で自分自身のアイデアで行いたい行動をスムーズかつ最低限のエネルギーで行うことは重要な課題となる。また今回のロボットは摩擦や電池などの要因でうまくいくことが出来なかった。このようなことが起こってしまってはロボットを製作した意味がなくなるかつ全くと言っていいほどに役に立たない。このことからどのようにすれば効率よく目的の行動が出来るのかとどのようにすれば安定した成果を得ることのできるプログラムが出来るのか考えていきたい。