目次
詳しくは課題1を参照。
「松本の大学生活を表す漢字一文字」として『坂』を選択した。理由は、日々の生活の中で必ずと言って良いほど坂と遭遇することが、今までの自分の生活にはなく、新鮮だったからだ。なお、書き順は正規のものを参考にした。
ロボット本体が移動することにより線を引くようにした。駆動車輪は前方につけ、後方はキャスターで支えるようにした。キャスターに負荷がかかると動きが悪くなるため、後方に重心がよらないようにコントローラー本体を横向きにし、できるだけ前方に寄せた。
筆には、筆圧が少なくても線が引けるように筆ペンを使用した。
下の写真のように、モーターの回転によって筆が上下するような機構にした。
ロボットの方向転換時に筆の位置がずれないよう、筆が左右のタイヤの軸の真ん中に来るように組み立てた。また、下の写真の黄色い枠で示されているいるように、筆の前後にストッパーを付け、移動時や筆の昇降時などに筆がぶれるのを防いだ。
機体の方向転換時に、左右の車軸の中心を回転軸とするはずが、実際にロボットを動かすとずれてしまった。
ロボットの構造上、どうしてもロボットの重心が後方によってしまい、キャスターの動作が悪くなってしまったことが原因と思われる。
問題に気がついた時点での残された時間から、ロボットとプログラムの大幅な改変は困難と判断し、「ロボットの概要」で述べたように、コントローラーを前方に寄せ、できるだけキャスターの負荷を軽減し、誤差を極力小さくしたが、それでも誤差が生じてしまった。生じる誤差は毎回一定であったので、誤差修正用のプログラムを挿入したり、回転角度や移動距離などを細かく調整して誤差に対応した。下の写真は改造前のロボット。
電池の消耗によりモーターの回転速度が徐々に低下し、それに対応するためにその都度プログラムの数値を調節しなければならなかった。
度重なる動作実験のために電池が消耗したものと思われる。
機体の回転動作への影響が特に大きく、直線移動では電池の消耗による変化はあまり見られなかった。そのため、モーターの動作時間で調節していたプログラムを、機体の回転動作部分のみ、モーターの回転角度によって制御するものに書き換え、電池を消耗しても一定の動作ができるようにした。
sub penup()//筆を上げる { OnRev(OUT_A,20); Wait(500); Off(OUT_A); } sub pendown()//筆を下げる { OnFwd(OUT_A,20); Wait(500); Off(OUT_A); } sub TurnRight()//その場で右に90度回転 { RotateMotorEx(OUT_BC,30,181,100,true,false); } sub TurnLeft()//その場で左に90度回転 { RotateMotorEx(OUT_BC,30,181,-100,true,false); } sub Correction()//方向転換の誤差修正 { OnFwd(OUT_BC,20); Wait(300); Off(OUT_BC); } sub ikkakume()//1画目 { OnFwd(OUT_BC,20); Wait(600); Off(OUT_BC); penup(); } sub nikakume()//2画目 { OnRev(OUT_BC,20); Wait(300); Off(OUT_BC); TurnRight(); OnRev(OUT_BC,20); Wait(300); Off(OUT_BC); pendown(); OnFwd(OUT_BC,20); Wait(900); Off(OUT_BC); penup(); } sub sankakume()//3画目 { TurnLeft(); RotateMotorEx(OUT_BC,30,10,-100,true,false); OnRev(OUT_BC,20); Wait(400); Off(OUT_BC); pendown(); OnFwd(OUT_BC,20); Wait(800); Off(OUT_BC); penup(); } sub yonkakume()//4画目 { OnFwd(OUT_BC,20); Wait(400); Off(OUT_BC); TurnLeft(); OnFwd(OUT_BC,20); Wait(1000); Off(OUT_BC); TurnRight(); pendown(); OnFwd(OUT_BC,20); Wait(800); Off(OUT_BC); penup(); } sub gokakume()//5画目 { OnRev(OUT_BC,20); Wait(1000); Off(OUT_BC); TurnRight(); Correction(); pendown(); OnFwd(OUT_C,40); OnFwd(OUT_B,20);//曲線を書くために左右のタイヤの回転速度をずらした Wait(1100); Off(OUT_BC); penup(); } sub rokkakume()//6画目 { OnRev(OUT_C,40); OnRev(OUT_B,20); Wait(800); Off(OUT_BC); RotateMotorEx(OUT_BC,30,210,-100,true,false); Correction(); pendown(); OnFwd(OUT_BC,20); Wait(800); Off(OUT_BC); penup();//方向転換前に筆を上げ RotateMotorEx(OUT_BC,30,250,100,true,false);//方向転換し Correction();//方向転換による誤差を修正する pendown(); OnFwd(OUT_BC,20); Wait(1200); Off(OUT_BC); penup(); } sub nanakakume()//7画目 { RotateMotorEx(OUT_BC,30,290,100,true,false); OnFwd(OUT_BC,20); Wait(1000); Off(OUT_BC); RotateMotorEx(OUT_BC,30,340,100,true,false); pendown(); OnFwd(OUT_BC,20); Wait(1200); Off(OUT_BC); penup(); } task main()//筆を下ろした状態からスタート { ikkakume(); nikakume(); sankakume(); yonkakume(); gokakume(); rokkakume(); nanakakume(); }
バランスは悪いが、線と線との接合部のずれを小さくできたので、『坂』と認識できる程度には書けたと思う。
今回、ロボット本体を組み立てた段階での動作実験を行わなかったために問題発見が遅くなり、正常な動作では必要がなかったはずのプログラムの追加や調節をする羽目になった。以後の課題では、ロボットの欠陥をプログラミングでカバーするのではなく、完璧なロボットを製作した上で無駄の無いプログラムを書けるようにしたい。