目次
矢印の方向に番号順に描いていく
またロボットで描きやすくするために実際の書き順や方向、向きを変更した
上記の通りズレ抑制のため1動作完了ごとにモーターを止めている
ペンを上げている状態での移動は旋回によるズレを修正するためである
最初はペンを下した状態で始める
int i=0; for(i=0;i<3;i++){ RotateMotor(OUT_BC,40,90); //直線を描く stp; pen_up; turn: //左を向く RotateMotor(OUT_BC,30,5); //位置を調整 stp; pen_down; } RotateMotor(OUT_BC,40,90); stp; pen_up; turn; RotateMotor(OUT_BC,30,5); stp;
真っ直ぐ進み90度左を向く動作を4回繰り返すことで描く(プログラムの構成上、ただ4回繰り返すと最後に無意味にペンを下す動作が入るので、最後の一回だけ別枠に取った)
RotateMotor(OUT_BC,30,40); turn;まず「田」の中ほどに行き、左を向く
pen_down; RotateMotor(OUT_BC,30,110); stp;そして{一}を描く
pen_up; RotateMotor(OUT_BC,30,100); //位置を調整 stp; RotateMotor(OUT_B,-30,360); //右を向く stp; RotateMotor(OUT_BC,30,20); //位置を調整 stp; pen_down; RotateMotor(OUT_BC,30,100); //{|}を描く stp; pen_up;少し前に進み位置を調整した後、右を向かせ真っ直ぐ進ませることで{|}を描く
RotateMotor(OUT_BC,30,120); stp;
RotateMotor(OUT_B,-20,20); //斜め少し右を向く stp; pen_down; RotateMotor(OUT_C,30,100); //{ノ}を描く stp; pen_up;向きを調節し片側のモーターだけを動かすことで曲線を描く
RotateMotor(OUT_BC,30,55); stp; RotateMotorEx(OUT_BC,30,200,100,true,false); //旋回して右を向く stp; RotateMotor(OUT_BC,-30,60); //位置を調整 stp; int k=0; for(k=0;k<4;k++){ pen_down; RotateMotor(OUT_BC,30,40); stp; pen_up; RotateMotor(OUT_BC,30,40); //位置を調整 stp; RotateMotorEx(OUT_BC,30,100,100,true,false); //旋回して斜め少し右を向く stp; RotateMotor(OUT_BC,-30,40); //位置を調整 stp; } pen_down; RotateMotor(OUT_BC,30,40); stp;「の」の曲線を小さくまとめるのが難しいため、短い直線を書き、少しずつ角度を変えていく手法によって、曲線を描くようにした
pen_up; RotateMotor(OUT_B,30,100); stp; RotateMotor(OUT_BC,30,50); stp;
int l=0; for(l=0;l<4;l++){ pen_down; RotateMotor(OUT_BC,30,40); stp; pen_up; turn; RotateMotor(OUT_BC,20,5); stp; }「田」と同様ではあるが、少し小さめな{口}を描く
RotateMotor(OUT_BC,30,20); //移動 stp; turn; RotateMotor(OUT_BC,30,10); //位置を調整 stp; pen_down; RotateMotor(OUT_BC,30,40); //{一}を描く stp; pen_up; RotateMotor(OUT_BC,30,60); //位置を調整 stp; n_turn; //右を向く RotateMotor(OUT_BC,30,70); //下に降りる stp; RotateMotorEx(OUT_BC,30,320,100,true,false); //180度旋回する stp; pen_down; RotateMotor(OUT_BC,30,130); //{|}を描く stp;同じように{十}を描くが{|}の部分を長めにとるので、一度下に降りてから下から上に行くようにして描く
pen_up; turn; RotateMotor(OUT_BC,30,110); stp;
RotateMotor(OUT_B,30,60);Off(OUT_B); //斜め少し右を向く stp; pen_down; RotateMotor(OUT_BC,30,20); stp;上の点を描いた後
pen_up; RotateMotor(OUT_BC,30,120); //移動 stp; RotateMotorEx(OUT_BC,30,350,100,true,false); //旋回 stp; RotateMotor(OUT_BC,-30,25); //調整 stp; pen_down; RotateMotor(OUT_BC,30,70); //上の横棒 stp; pen_up; RotateMotor(OUT_BC,30,65); //調整 stp; RotateMotorEx(OUT_BC,30,240,100,true,false); stp; RotateMotor(OUT_BC,-30,20); //調整 stp; pen_down; RotateMotor(OUT_BC,30,100); //払い stp;{フ}の部分を描き
pen_up; RotateMotor(OUT_BC,-30,40); //調整 stp; RotateMotorEx(OUT_BC,30,500,100,true,false); //旋回 stp; RotateMotor(OUT_BC,-30,30); //調整 stp; pen_down; RotateMotor(OUT_BC,30,60); //真ん中の縦棒 stp; pen_up; RotateMotor(OUT_BC,-30,50); //調整 stp; RotateMotorEx(OUT_BC,30,500,100,true,false); //旋回 stp; RotateMotor(OUT_BC,-30,30); //調整 stp; pen_down; RotateMotor(OUT_BC,30,40); //横の払い stp;前後移動を繰り返しながら旋回して、残りの部分を描く
「田」はそこそこ判別できる程度だと思うが、「神」の{申}部分が判別しにくいほど崩れてしまった。
「の」の曲線部分はうまくできたと思う。
字を描くロボットを作成するのに思いのほか手間取り、あまり字を書くのに適していないロボットで課題に臨んでしまったように感じる。特に旋回によるペンの終点、始点のズレや、A4サイズの紙に収める大きさで描くのが大変だった。それでもプログラミングを頑張ったおかげか、何とか位置を修正、是正して形にすることができたのはよかったと思う。
字をロボットで描く中で、同じプログラムを使用しても同じように動作してくれないことがあり、変数の指定に難儀した。理由としては、自由駆動の後輪のようなロボットの機体が外的要因により何らかの変性を起こし、不変性が乱されていると考えられるので、今度作るロボットではあまり外的要因に左右されないような部品で作っていきたいと思う。
ロボット作成からレポートの完成まで時間がかかり、発表の時間に間に合わなかったり、妥協点や改善点が多くできてしまったので、次回からは適切にこなしていきたい。