[[2017a/Member]] ~目次 #contents *課題について [#zd83be0b] 詳しくは[[課題1>http://yakushi.shinshu-u.ac.jp/robotics/?2017a%2FMission1]]を参照。 **漢字 [#i2c6d787] 「松本の大学生活を表す漢字一文字」として『坂』を選択した。理由は、日々の生活の中で必ずと言って良いほど坂と遭遇することが、今までの自分の生活にはなく、新鮮だったからだ。なお、書き順は正規のものを参考にした。 *ロボット [#u013a95d] **ロボットの概要 [#qaf81170] #ref(./IMG_2600.JPG,70%,ロボット全体像) ロボット本体が移動することにより線を引くようにした。駆動車輪は前方につけ、後方はキャスターで支えるようにした。キャスターに負荷がかかると動きが悪くなるため、後方に重心がよらないようにコントローラー本体を横向きにし、できるだけ前方に寄せた。 &ref(2017a/Member/doita/Mission1/前方.JPG,50%,前から見た図); &ref(2017a/Member/doita/Mission1/後方.JPG,50%,後ろから見た図); &ref(2017a/Member/doita/Mission1/IMG_2582.JPG,50%,上から見た図); &ref(2017a/Member/doita/Mission1/IMG_2583.JPG,50%,下から見た図); **筆について [#s88e4f60] 筆には、筆圧が少なくても線が引けるように筆ペンを使用した。 ***昇降 [#da974430] 下の写真のように、モーターの回転によって筆が上下するような機構にした。 #ref(./筆の昇降.JPG,80%,筆の昇降機構) ***工夫 [#j2592d9a] ロボットの方向転換時に筆の位置がずれないよう、筆が左右のタイヤの軸の真ん中に来るように組み立てた。また、下の写真の黄色い枠で示されているいるように、筆の前後にストッパーを付け、移動時や筆の昇降時などに筆がぶれるのを防いだ。 #ref(./IMG_2605.JPG,80%,筆のストッパー) *問題点と解決策 [#mca71993] **問題点1[#w842e267] 機体の方向転換時に、左右の車軸の中心を回転軸とするはずが、実際にロボットを動かすとずれてしまった。 ***原因の考察 [#x796e8ea] ロボットの構造上、どうしてもロボットの重心が後方によってしまい、キャスターの動作が悪くなってしまったことが原因と思われる。 ***解決策 [#ie16db29] 問題に気がついた時点での残された時間から、ロボットとプログラムの大幅な改変は困難と判断し、「[[ロボットの概要>http://yakushi.shinshu-u.ac.jp/robotics/?2017a%2FMember%2Fdoita%2FMission1#qaf81170]]」で述べたように、コントローラーを前方に寄せ、できるだけキャスターの負荷を軽減し、誤差を極力小さくしたが、それでも誤差が生じてしまった。生じる誤差は毎回一定であったので、誤差修正用のプログラムを挿入したり、回転角度や移動距離などを細かく調整して誤差に対応した。下の写真は改造前のロボット。 #ref(./改造前.JPG,80%,改造前のロボット) **問題点2 [#ka0f06e7] 電池の消耗によりモーターの回転速度が徐々に低下し、それに対応するためにその都度プログラムの数値を調節しなければならなかった。 ***原因の考察 [#s131a8d0] 度重なる動作実験のために電池が消耗したものと思われる。 ***解決策 [#je7d4bfe] 機体の回転動作への影響が特に大きく、直線移動では電池の消耗による変化はあまり見られなかった。そのため、モーターの動作時間で調節していたプログラムを、機体の回転動作部分のみ、モーターの回転角度によって制御するものに書き換え、電池を消耗しても一定の動作ができるようにした。 *プログラム [#a1a33091] 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(); } *まとめ [#dcbd9ac5] **結果 [#x433a422] #ref(./坂.JPG,80%,書いた文字) バランスは悪いが、線と線の接合部のずれを小さくできたので、『坂』と認識できる程度には書けたと思う。 バランスは悪いが、線と線との接合部のずれを小さくできたので、『坂』と認識できる程度には書けたと思う。 **考察と感想 [#y05b2388] 今回、ロボット本体を組み立てた段階での動作実験を行わなかったために問題発見が遅くなり、正常な動作では必要がなかったはずのプログラムの追加や調節をする羽目になった。以後の課題では、ロボットの欠陥をプログラミングでカバーするのではなく、完璧なロボットを製作した上で無駄の無いプログラムを書けるようにしたい。