今回の課題は自分の似顔絵を書くロボットの作成でした。条件は
・マクロや関数などを使い、main関数がなるべく単純になるようにプログラムを作ること。
・定数名やマクロなどは分かりやすい名前を用いること
・余裕をもってA4の紙の中に収まる大きさにすること などでした
私たちの作ったロボットは写真のように元の形を改良し、前にモーターをつけました
ペンを上げ下げするのに私たちはタイヤにはさみ回転させました
このロボの工夫したところはこの写真のようにギアとギアの接合部分のところにゴムをつけ、モーターのギアをある程度空回りさせたことです。
このことによりペンを下に下げすぎても途中でギアが空回りし、ロボが持ち上がることがなくなります。またペンを下げる時間を考えずにある程度長くすれば空回りしてくれるため電力が落ちても筆圧が一定で楽でした。
またペンが紙にひっかかり、ペンが傾かないようにこの赤で囲まれた部分でペンをロックしました
・定義したプログラム
#define go(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC); //前に進む #define left(t) OnRev(OUT_A);OnFwd(OUT_C);Wait(t);Off(OUT_AC) //左回転 #define right(t) OnRev(OUT_C);OnFwd(OUT_A);Wait(t);Off(OUT_AC) //右回転 #define back(t) OnRev(OUT_AC);Wait(t);Off(OUT_AC); //後ろに進む #define up OnRev(OUT_B);Wait(10);Off(OUT_B); //ペンを上げる #define down OnFwd(OUT_B);Wait(40);Off(OUT_B); //ペンを下げる
このほかの顔のパーツや髪の毛などの様々なプログラムはこの定義を組み合わせてつくりました。
もうすこし輪郭などを定義して作れば行数も少なくなったと思います。
たとえば輪郭は次のようになっています
・輪郭のプログラム
go(90); up; go(70) right(95); back(90); down; go(110); up; go(80) right(95); back(90); down; go(90); up; go(60) right(90); back(80); down; go(110);
このように輪郭だけでもとても長いプログラムになってしまいました。
・プログラムを書いて思ったこと
90度回転し線をつなげるのにもただ回転したのではロボットが前に行きすぎるのでバックを挟まなくてはいけなかったりと様々なところで私のイメージとは異なることがありました。
成功部分
・髪の毛の左側をロボを回転させたとこが一発本番でうまくいった
・右側の髪の毛の部分また右下の輪郭のつなぎ目以外は線と線がぴったり合っていた
・目と口の間隔の調整に成功した
失敗部分
・髪の毛の左の部分を手を抜いてロボを回転させて書こうとしたがこれがなかなか合わず
普通に四角で書いた方が早かった
・顔のサイズがわからず最初に置くところがわからなかった
・電力が落ちているのを気づかなく、回転が甘くなり輪郭の右側の線が斜めに傾いてしまった
・鼻をあきらめた
電力の上がり下がりが激しく、回転の角度や線の長さが変わってしまうのがめんどくさくテストぎりぎりまで調整していた。また細かな動きが予想以上に難しく、人の手はこんな微調整を繰り返しているのかと途中で感動した。