目次 #contents *課題1 [#of8df6fe] -指定課題 --これまで住んだことのある都道府県名、市町村名、地区名などの中から2文字以上、かつ合計10画以上のものを選び、それをA4の紙を書くロボットを製作せよ。 -自分の描く文字 --自分の住んだことがある長野県須坂市の「田の神」という地名にした *ロボットの説明 [#oa58158e] **ロボットの概要 [#a10f158b] ---&size(15){タイヤによって紙面上を移動し、ペンを上げ下げすることで文字を描いていく}; ---&size(15){右前輪をモーターB、左前輪をモーターCとした前輪2輪と、自由駆動の後輪1輪の計3輪駆動のロボット}; #ref(rb_f.jpeg) #ref(rb_atach.jpeg) #ref(rb_bt.jpeg) ---&size(15){ペンの上げ下げにはモーターAを使用}; #ref(A_s.jpeg) #ref(A_f.jpeg) ***ロボットの移動 [#c693a8ce] ---主に2輪の前輪を回転させることで移動していく ---後輪は固定型にすると摩擦が大きくうまく曲がれなかったので自由駆動のタイヤを採用 ---時間指定によるモーターの稼働は電池残量による距離の変化が大きかったので、角度指定による稼働にした ***ペンの上げ下げ [#na1a81c1] ---モーターAを回転させペンと紙面を触れさせることで字を描いていく ---初期はモーターA前方で上下させていたが、前輪の旋回による回転前後のペン先のズレを抑制するため、タイヤの回転軸に近くなるようモーターB後方に修正した ---輪ゴムの止め方もペン先がぶれないように左右から固定した *プログラムの説明 [#n3de16bb] -主なコマンドの説明 :RotateMotor(OUT_モーター名,パワー,角度)|指定したモーターを指定した角度分前転させる&br; 今回のロボットにおいてB,Cどちらか片方を指定すると左右どちらかを向く&br; B,C両方を指定すると前進する :RotateMotorEx(OUT_モーター名1,モーター名2,パワー,角度,true,false)|指定した2種のモーターを指定した角度分反転して回転させる&br; 今回のロボットにおいてB,Cを指定すると旋回する :int X=0&br;for(X=0;X<Y;X++){プログラム}|{}内のプログラムを規定回数繰り返す(Xは任意のアルファベット、Yは繰り返したい回数の数字) -使用マクロ&br; よく行う動作をマクロとして以下のように定義した。 :#define pen_up RotateMotor(OUT_A,30,15);Off(OUT_A)|ペンを持ち上げる動作を行う :#define pen_down RotateMotor(OUT_A,30,-15);Off(OUT_A)|ペンを下げる動作を行う :#define turn RotateMotor(OUT_B,30,180);RotateMotor(OUT_C,-30,155);Off(OUT_BC)|90度左を向く :#define n_turn RotateMotor(OUT_B,-30,165);RotateMotor(OUT_C,30,180);Off(OUT_BC)|90度右を向く :#define stp Off(OUT_BC)|モーターの回転を止める(動作後の角度のズレを抑制するため1動作が終了するごとに回転を止める) **ロボットによる字の書き順 [#f9c466d0] &size(15){矢印の方向に番号順に描いていく};&br; &size(15){またロボットで描きやすくするために実際の書き順や方向、向きを変更した}; #ref(I_W.jpeg); **字を描くプログラム [#p12260c1] &color(red){上記の通りズレ抑制のため1動作完了ごとにモーターを止めている};&br; &color(red){ペンを上げている状態での移動は旋回によるズレを修正するためである};&br; &color(red){最初はペンを下した状態で始める}; ***「田」を描くプログラム [#x71f3e6f] ---最初に{口}を描く 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; ***「の」を描くプログラム [#w3e8ccd1] ---{ノ}を描く 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; ***「神」を描くプログラム [#n229af11] ---{申}を描く 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; } 「田」と同様ではあるが、少し小さめな{口}を描く&br;「田」との相違として繰り返しの初めにペンを下す動作を入れるために、最後にペンを下さないので4回繰り返すことができる 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; 前後移動を繰り返しながら旋回して、残りの部分を描く **実際にロボットで描いた「田の神」 [#vc8ffe50] #ref(R_W.jpeg); 「田」はそこそこ判別できる程度だと思うが、「神」の{申}部分が判別しにくいほど崩れてしまった。&br; 「の」の曲線部分はうまくできたと思う。 *感想・反省点 [#q2282226] 字を描くロボットを作成するのに思いのほか手間取り、あまり字を書くのに適していないロボットで課題に臨んでしまったように感じる。特に旋回によるペンの終点、始点のズレや、A4サイズの紙に収める大きさで描くのが大変だった。それでもプログラミングを頑張ったおかげか、何とか位置を修正、是正して形にすることができたのはよかったと思う。 字をロボットで描く中で、同じプログラムを使用しても同じように動作してくれないことがあり、変数の指定に難儀した。理由としては、自由駆動の後輪のようなロボットの機体が外的要因により何らかの変性を起こし、不変性が乱されていると考えられるので、今度作るロボットではあまり外的要因に左右されないような部品で作っていきたいと思う。 ロボット作成からレポートの完成まで時間がかかり、発表の時間に間に合わなかったり、妥協点や改善点が多くできてしまったので、次回からは適切にこなしていきたい。 *参考 [#ve7b2fff] ---instruction