*目次 [#g158bac4] #contents *課題について [#la48239b] 課題1は簡単な図形を描くロボットの製作。 今年度は自分の名前に使われている七画以上の文字、ない場合は組み合わせて七画以上になる文字をA4用紙一枚の中に書く書道ロボットを目指す。ただし、筆順は無視してよい。ペン以外はキットの部品を使うこと。プログラムは読み手わかりやすく、かつ簡潔に書くこと。 * ロボット本体について [#jb85d4d2] ロボットは二つのモーター(B,C)を移動に用いた。左右に曲がることができる。もっとも初めに組み立てたロボットを基本とする。 ペンの上げ下げはもう一つのモーター(A)で行う。モーターにアームを取り付け、そのアームにペンを取り付けた。モーターの回転方向を歯車で変え、ペンはロボット本体の液晶側で跳ね上がるような形になっている。 ペンは筆ペンを用いた。これを輪ゴムで本体に留めたが、取り付け方の関係でペンは斜めに取り付けられている。また、ペンを取り付ける際、ペン先が紙に当たるまでの長さを調節してできるだけ二つのタイヤの中心になるようにした。 #ref(./ロボ22.jpg,30%) * プログラムについて [#y87a9378] まず、プログラムを書く際に気を付けたのが、変数の変更を行いやすくすることである。その前の三角形や四角形、星を描くプログラムを書く際にも、電池の消耗やタイヤと床面との摩擦の大きさによって出力が変化することがわかっていたからである。 また、書こうとしていた文字の画数が多かったため、最初から三つのグループに分けて少しずつ調整しながら書くことにした。そして、それらをつなぐため指標となるプログラムをはじめに書いた。 さらに、ペンが斜めについているので、なるべく負荷がかからないように動かすようにした。(この後の本文では、線を描く際に back や turn_right が多くなっている) **設計図とグループ分け [#dd2fa9f0] #ref(./ロボ11.gif,30%) 赤を一番目のグループ、金色を二番目のグループ、黄緑を三番目のグループとした。グループはなるべくプログラムが単純でわかりやすくなるような移動の仕方を考えて分けた。 文字はところどころロボットを回転させるなどして簡略化した。 **出力調整 [#m83f227c] 回転する角度をあわせる task main() { OnFwd(OUT_C,-40); Wait(); Off(OUT_BC); //だいたい一回転するように時間の長さを調整 Wait(3000); OnFwd(OUT_B,); OnFwd(OUT_C,); Wait(600); Off(OUT_BC); //90度くらい回るようにモーターの出力で調整 } 進む距離を合わせる task main() { OnFwdSync(OUT_BC,,0); Wait(1600); //長めに進む Off(OUT_BC);Wait(3000); //記録のための時間 OnFwdSync(OUT_BC,,0); Wait(800); //少し長めに進む Off(OUT_BC);Wait(3000); //記録のための時間 OnFwdSync(OUT_BC,,0); Wait(400); //短めに進む Off(OUT_BC); } 少し長めに進んだ距離や、短めに進んだ距離は書く文字のなかで使われる。また、これらをなるべく使うようにもした。 **定義 [#he6007e9] #ref(./ロボ33.gif,30%) #define go(s) OnFwdSync(OUT_BC,,0);Wait(s);sofa; #define back(t) OnRevSync(OUT_BC,,0);Wait(t);sofa; #define turn_left(u) OnFwd(OUT_B,SPEED);OnRev(OUT_C,SPEED);Wait(u);sofa; #define turn_right(v) OnRev(OUT_B,SPEED);OnFwd(OUT_C,SPEED);Wait(v);sofa; #define SPEED ロボットの液晶側を正面と仮定して前後左右を決めた。 go と back は二か所にモーターの出力を入れる。turn_leftとturn_leftはSPEEDの後ろに一か所モーターの出力を入れる。このようにするとロボットを動かす時間だけが必要になる。 #define up OnFwd(OUT_A,30);Wait(200);sofa; #define down OnFwd(OUT_A,-10);Wait(300);sofa; ペンの上げ下げを行う。この数値の調整はグループの人のを借りた。 #define sofa Off(OUT_ABC);Wait(1000); すすむ距離や回転の調整をより行いやすくするために書いた。本当はクッションという名前にしようと思ったのだが、長いのと綴りがわからなかったのでで、ソファという名前にした。 **本文 [#b5ae7d7a] 一つにまとめたものがどこかへ行ってしまったので、途中で切れている。ただし、これらは変数を少し変えればまとまるようになっていたはずである。 二番目と三番目に書いたプログラムは電池の調節をしなくてもよかったので、作った後すぐにまとめておいた。 また、//以降の上下左右は、ロボットではなく、文字を普通に読む向きから見た人にとってのものである task main() { down; OnFwd(OUT_C,-45);Wait(300);sofa; //�〆犬�ら右へ up; turn_left(750); back(1400); turn_left(450); back(1700); down; back(400); //�⊂紊�ら下へ up; turn_right(480); go(570); turn_left(500); down; back(400); //��上から下へ up; turn_right(350); go(400); turn_left(350); down; back(400); //�ぞ紊�ら下へ up; } #ref(./ロボ44.gif,30%) task main() { go(1250); turn_right(1100); down; turn_right(250); //�ケΔ�ら左へ up; go(600); turn_right(230); back(1380); down; back(400); //�Σ爾�ら上へ up; go(1250); turn_left(580); down; turn_right(750); //�ПΔ�ら左へ up; turn_left(460); back(380); down; back(590); //�┣爾�ら上へ up; turn_left(600); back(850); turn_left(600); back(1950); down; back(600); //��上から下へ up; go(1570); turn_right(600); down; back(800); //��右から左へ up; back(450); down; back(400); //��右から左へ up; turn_left(600); back(300); turn_right(600); go(1600); down; back(800); //��左から右へ } #ref(./ロボ55.gif,30%) *感想 [#k6c79e1a] このロボットは字を書くには向いていない。 ペン先がタイヤから遠く、二つのタイヤの中心から微妙にずれていて、誘導が大変だった。また、ペンの上げ下げの仕方が悪く、線のはじめと終わりに余計な線が書かれ、字が汚くなってしまった。モーターの回転数も落としていないので、このロボットで文字を小さく書くのは大変だと思う。 次回は本体も工夫をしたい