私は、「長与」とかくロボットを作成しようと思った。そのために、人間が持つようにペンを持たせる形のロボットを作成した。本当は、我々も「XY型」を作成しようと思っていたが、この形でも想像以上に簡単に作成できたので、このままプログラミングをした。
私たちは、ロボットに対し、以下のような特徴を持つように意識して作った。
+分解・組み立てのしやすさ
私達の作ったロボットは、車のような部分とペン部分の2つに分かれており、この2つをくっつけるだけでロボットが完成する。また、ペン部分は、右側や左側、中央部分につけることができ、左右対称の字はペンを中央部分に取り付けて行うなど長与以外にも幅広い字を書くことができる。私は、ロボットの書く字が行書体に見えることと、私が右利きであることからペン部分を右側に取り付けた。
+ペン部分
私たちは、ペンを下げるときの出力を弱くする代わりに地面につくまでの時間よりも若干長くすることで、、確実に紙に書けるようにした。ペン部分の構造は、ペンをブロックで挟み、完全に固定した。このようにすることで、横へのズレは無くなった。また、ゴムを使ってペンが外れず、出力10%の動きに耐えられるようにした。ペンの上げ下げに関するプログラミングは次のとおりである。
OnFwd(OUT_A,15);//ペン下げ Wait(1000); Off(OUT_A);
OnRev(OUT_A,30);//ペン上げ Wait(200); Off(OUT_A);
私は、ロボットの構造に工夫をするというよりも、「長与」という字の書き方や、書き順に工夫をした。完成した字が次の写真である。
+筆を上げる回数を減らす。
筆を上げることで、字がつながらず、うまくかけないことが多かった。そこで、一筆書きを目指して作業を行った。しかし、つながっていると、文字がつまり、きれいに見えなかった。試行錯誤した結果、きれいに見せるためには、4画必要だった。下の写真のように4画を分けた。最初の1画を青、2画目は緑、3画目は赤、4画目を黒で書いてある。2画目はわかりにくいが、「長」の最後のはらいの部分である。
+同じコマンドを多用して、プログラム内容を簡潔にする。
「長」という字と「与」という字は、漢字の上半分の部分が角ばっていることから上の写真の通り、鉛筆で囲んである部分はすべて同じコマンドで、番号のある部分は、forコマンドで繰り返したことを表している。鉛筆で囲んである部分のコマンドは次のとおりである。
OnFwd(OUT_B,20);//右回転 OnRev(OUT_C,20); Wait(280); OnFwd(OUT_C,20); OnRev(OUT_B,20);//左回転 Wait(280); OnFwd(OUT_B,25); OnFwd(OUT_C,25); Wait(250); Off(OUT_BC);
右回転と左回転の出力を統一することで、ペンの軌跡が重なり、横の辺と縦の辺をつなげることに成功している。
+出力を調整し、斜め線や曲線を美しく書く。
「長」の下半分のプログラミングは次のとおりである。
OnFwd(OUT_B,25); OnFwd(OUT_C,25); Wait(350); OnRev(OUT_B,20);//斜め線 OnRev(OUT_C,60); Wait(300); Off(OUT_BC);//休憩 Wait(140); OnFwd(OUT_C,30);//上から4番目の横辺 OnRev(OUT_B,30); Wait(320); Off(OUT_BC); OnRev(OUT_A,30);//ペン上げ Wait(200); Off(OUT_A); OnFwd(OUT_B,30); OnRev(OUT_C,30); Wait(200); Off(OUT_BC); OnFwd(OUT_A,15);//ペン下げ Wait(1000); Off(OUT_A); OnFwd(OUT_B,40);//二画目はらい OnFwd(OUT_C,20); Wait(280); Off(OUT_BC);
ここでの工夫点は、斜め線と休憩にある。 斜め線は、出力を20と60にすることで、きれいに斜めの線を書くことができた。 休憩は、一瞬ではあるが、なかった場合、上から4番目の横辺と、斜め線がつながっている点が緩やかになってしまい、「長」という字に全く見えなかった。そこで、一旦行動を止めることで字に角ばった印象を与えることができた。
「与」の曲線部分とはね、最後の一画のプログラミングは次のとおりである。
OnFwd(OUT_B,25); OnFwd(OUT_C,55); Wait(450); Off(OUT_BC); Wait(100); OnFwd(OUT_C,20);//はね OnRev(OUT_B,40); Wait(50); Off(OUT_BC); OnRev(OUT_A,30); Wait(200); Off(OUT_A); OnFwd(OUT_C,30);//4画目に向けた回転 OnRev(OUT_B,30); Wait(120); OnRev(OUT_B,25); OnRev(OUT_C,25); Wait(350); Off(OUT_BC); OnFwd(OUT_A,15); Wait(1000); Off(OUT_A); OnFwd(OUT_B,20);//4画目 OnRev(OUT_C,35); Wait(550); Off(OUT_BC); OnRev(OUT_A,30); Wait(200); Off(OUT_A);
「与」の曲線に関しては、出力を25と55にし、前進させた。工夫点は最後の一画にある。ただの長い横辺ではあるが、単純に回転するだけという今までのやり方では線が長いことが原因で4画目の辺が半円状になった。そこで、前進するタイヤの出力をわずかに下げることで、行書体のような曲線を書くことに成功した。
以上の工夫点により、完成したプログラムの内容は次のとおりである。
task main () { OnFwd(OUT_A,15); Wait(1000); Off(OUT_A); int i=0; for(i=0;i<3;i++)//「長」の上半分 { OnFwd(OUT_B,20); OnRev(OUT_C,20); Wait(280); OnFwd(OUT_C,20); OnRev(OUT_B,20); Wait(280); OnFwd(OUT_B,25); OnFwd(OUT_C,25); Wait(250); Off(OUT_BC); } OnFwd(OUT_B,25); OnFwd(OUT_C,25); Wait(350); OnRev(OUT_B,20); OnRev(OUT_C,60); Wait(300); Off(OUT_BC); Wait(140); OnFwd(OUT_C,30); OnRev(OUT_B,30); Wait(320); Off(OUT_BC); OnRev(OUT_A,30); Wait(200); Off(OUT_A); OnFwd(OUT_B,30); OnRev(OUT_C,30); Wait(200); Off(OUT_BC); OnFwd(OUT_A,15); Wait(1000); Off(OUT_A); OnFwd(OUT_B,40); OnFwd(OUT_C,20); Wait(280); Off(OUT_BC); OnRev(OUT_A,30); Wait(200); Off(OUT_A);//一文字目終わり OnFwd(OUT_C,30); OnRev(OUT_B,30); Wait(200); OnFwd(OUT_B,25); OnFwd(OUT_C,25); Wait(350); Off(OUT_BC);
OnFwd(OUT_A,15);//二文字目始まり Wait(1000); Off(OUT_A); OnFwd(OUT_B,25); OnFwd(OUT_C,25); Wait(250); OnFwd(OUT_B,20); OnRev(OUT_C,20); Wait(280); OnFwd(OUT_C,20); OnRev(OUT_B,20); Wait(280); OnFwd(OUT_B,25); OnFwd(OUT_C,25); Wait(250); OnFwd(OUT_B,20); OnRev(OUT_C,20); Wait(300); // Off(OUT_BC); Wait(100); OnFwd(OUT_B,25); OnFwd(OUT_C,55); Wait(450); Off(OUT_BC); Wait(100); OnFwd(OUT_C,20); OnRev(OUT_B,40); Wait(50); Off(OUT_BC); OnRev(OUT_A,30); Wait(200); Off(OUT_A); OnFwd(OUT_C,30); OnRev(OUT_B,30); Wait(120); OnRev(OUT_B,25); OnRev(OUT_C,25); Wait(350); Off(OUT_BC); OnFwd(OUT_A,15); Wait(1000); Off(OUT_A); OnFwd(OUT_B,20); OnRev(OUT_C,35); Wait(550); Off(OUT_BC); OnRev(OUT_A,30); Wait(200); Off(OUT_A);//二文字目終わり。 }
私は、工夫した点として、同じコマンドを多用したことを挙げていたが、これらはすべて定義せず、自分で打ち込んで制作してしまった。私は、すべてを打ち込んでから、定義コマンドなどを利用してプログラミングを簡略化しようと考えていたが、NXTそのものの容量の空きが多く、現在のプログラミングでも問題なく作動したため、そのまま使ってしまった。しかし、この授業をより効果的に学修するという観点から、多彩なコマンドを利用したロボットを制作すべきであったと思う。次回のロボット製作では、この反省を活かすことのできるようなロボット製作を心がけようと思う。