N14のロボットを作成しました。
課題1
これまで住んだことのある都道府県名、市町村名、地区名などの中から2文字以上、かつ合計10画以上のものを選び、それをA4の紙を書くロボットを製作せよ
に基づき、私の出身の浜田市からとって 「浜田」とした。
その他ハード全体としての工夫点~
正確な動きにするため低速での運転を想定して、極端に大きさの違うギアを2つかまして、低速でもパワーが落ちないようにした。またこれにより、ペン先の位置、すなわちクレーンの位置が定めやすくなった。
#define Turn_right(r) repeat(r){OnFwd(OUT_C,50);\ OnRev(OUT_B,50);Wait(1);Off(OUT_BC);} #define Turn_left(l) repeat(l){OnFwd(OUT_B,50);\ OnRev(OUT_C,50);Wait(1);Off(OUT_BC);} #define GO(g) repeat(g){OnFwd(OUT_B,50);\ OnFwd(OUT_C,48);Wait(1);Off(OUT_BC);} #define BACK(b) repeat(b){OnRev(OUT_B,50);\ OnRev(OUT_C,48);Wait(1);Off(OUT_BC);}順に右回転、左回転、直進、後退のマクロ定義である。
#define Turn_right(r) OnFwd(OUT_C,50);\ OnRev(OUT_B,50);Wait(r); #define Turn_left(l) OnFwd(OUT_B,50);\ OnRev(OUT_C,50);Wait(l) #define GO(g) OnFwd(OUT_B,50);\ OnFwd(OUT_C,48);Wait(g); #define BACK(b) OnRev(OUT_B,50);\ OnRev(OUT_C,48);Wait(b);のように、マクロの変数はWait()の中身となるようにしていた。
#define A_1 550 #define B_1 700 #define A_2 1260 #define B_2 1720 #define A_3 1880 #define A_4 2460 #define B_5 3920当初はプログラム上では、Aのn倍移動するときの時間設定をA_nと定義し、Bも同様に定義したが、トライアンドエラーをしているうちにrepeat記号を用いてA_1またはB_1の時間分の動作を繰り返した方が正確さが増すことに気づいたため、A_1とB_1以外は使わなくなった。(一応名残として取っておいた、というのも、制作過程において、もともとのA_3などがtask mainの中に残っていても、それはそれで修正前との違いを観察できるためであり、プログラム上のエラーは出ないからでもある。)
#define DEG_45 1900 #define DEG_90 3350しかし、A、Bの時同様に、45度の時間分の動作を整数倍して使うようになったので、必要なのはDEG_45のみとなった。以下補足も上に同じである。
#define P_ON;OnFwd(OUT_A,40);\ Wait(500);Off(OUT_A); #define P_OFF OnRev(OUT_A,40);\ Wait(500);Off(OUT_A);これに関しては、ひたすらトライアンドエラーを繰り返し、モーターのパワー、スピードを調節し、着実に動作するように定義した。それ以外は特に工夫点はない。
task main() { Turn_left(DEG_45); P_ON;BACK(B_1);//1 P_OFF;Turn_right(DEG_45); BACK(A_2);//2 Turn_left(DEG_45); P_ON; GO(B_1);//3 P_OFF; Turn_right(DEG_45); BACK(A_4);//4 Turn_right(DEG_45); P_ON; GO(B_1);//56:ペンを離し丘の右上まで移動
P_OFF; repeat(5){GO(B_1)};//6。ただし7はプログラム上の設計ミスのため消滅8~16:丘を書く
P_ON; BACK(B_1);//8 Turn_right(DEG_45); repeat(2){BACK(A_1)};//9 repeat(2){Turn_left(DEG_45)}; repeat(3){BACK(A_1)};//10 P_OFF; repeat(2){Turn_right(DEG_45)}; BACK(A_1);//11 P_ON; repeat(4){GO(A_1)};//12 P_OFF; BACK(A_1);//13 repeat(2){Turn_left(DEG_45)}; P_ON; repeat(2){GO(A_1)};//14 P_OFF; repeat(2){Turn_left(DEG_45)}; BACK(A_1);//15 P_ON; repeat(3){GO(A_1)};//1617~22:ハの左上まで移動しハを書く(ハまでの移動は17のみ)
P_OFF; repeat(2){Turn_right(DEG_45)}; repeat(3){BACK(A_1)};//17。ただし18はプログラム上の設計ミスのため消滅 P_ON; Turn_right(DEG_45); BACK(B_1);//19 P_OFF; Turn_left(DEG_45); repeat(2){Turn_left(DEG_45)}; repeat(4){BACK(A_1)};//20 Turn_right(DEG_45); P_ON; GO(B_1);//21 P_OFF; BACK(B_1);//2223~24:浜の右下から田の右上へ移動
Turn_right(DEG_45); repeat(2){BACK(A_1);};//23 repeat(2){Turn_left(DEG_45)};GO(A_1);//24
P_ON; repeat(4){GO(A_1)};//25 repeat(3){ repeat(2){ Turn_left(DEG_45)}; repeat(4){GO(A_1) } };//26から28これまではただ番号に従ってやってきたが、26~28は同じ動作の繰り返しが3回続いたので、repeat を使って繰り返しした。
P_OFF; repeat(2){BACK(A_1)};//29 repeat(2){Turn_left(DEG_45)}; P_ON; repeat(4){GO(A_1)};//30 P_OFF; Turn_right(DEG_45); repeat(2){BACK(B_1)};//31 Turn_right(DEG_45); P_ON; repeat(4){GO(A_1)};//32 P_OFF;//最後にペンを上げて完成 }完成した文字がこれである。
試行錯誤を繰り返すことで、そこそこ綺麗な文字を書くことができた。
しかしながら、色々な工夫を凝らしたつもりだが、まだ人間である私が書いた方が綺麗だ。これでは人間の代わりにはなり得ない。この設計ではここまでの正確さが一定の限界点だと感じた。言い換えれば、設計が安直すぎたというのが第1の反省点である。
第2の反省点は、マクロに頼っても簡略化など全くできていないということである。ロボットが動くまでも、完成したプログラムに説明を入れるのも、全体に煩雑ゆえに(文章的にも作業時間的にも)長すぎる事態となった。工夫をもっと凝らしていれば、頭をもっと捻っていれば、もっと簡略化できたのではないだろうか。
第3の反省点としては、ミスで番号がずれたことである。番号がずれるのは整合性を欠くという意味であまりよろしくない。このロボティックス入門ゼミ以外にも人間としての作業の正確さを問われる場面があるので、以後気をつけたい。
youtubeより実演動画・浜田を書くロボット
(URLからのみアクセスできる限定公開)