目次 #contents *課題1 似顔絵を描くロボット [#fa456185] **ロボット本体 [#tf623006] ここでは自分たちの作成したロボットについて紹介していきます。 #ref(2012a/A5/Liwon7/M1/ロボティクス.jpg,ロボット本体) ロボット本体です。シンプルさを追及したところこの形になりました。(本当はプログラムを作りやすいように複雑なものを設計しようとしていたが、失敗した...なんて口が裂けても言えないw) #ref(2012a/A5/Liwon7/M1/ロボティクス4.jpg,ロボットアーム) 筆を上げ下げしたりする部分....俗に言うアームです。こいつを本体の前方につけてしまったことがプログラムを複雑にしてしまった元凶だったりします。 せめて本体の真横につけるべきだった...。 #ref(2012a/A5/Liwon7/M1/ロボティクス7.jpg,後輪) 本体の後輪部分。似顔絵を描くとき紙にしわができないように360度回転できるようになっています。 **定義 [#sbbcc9fa] プログラムを簡単にすべく定義を大量に作ったのですが、結局その定義が複雑になってしまいました。 #define M_A 200 //走行距離1 #define M_A_L 360 //走行距離2 #define M_A_l 150 //走行距離3 #define M_A_3 66 //走行距離4 #define M_A_a 60 //走行距離5 #define M_A_b 20 //走行距離6 #define M_A_c 40 //走行距離7 #define M_A_d 50 //走行距離8 #define T_A 360 //旋回時の角度 #define B_A 30 //ペンの上げ下げの角度 #define M_P 25 //モーターの出力(正回転) #define M_P2 -25 //モーターの出力(逆回転) #ref(2012a/A5/Liwon7/M1/似顔絵1.png,図1) #ref(2012a/A5/Liwon7/M1/似顔絵2.png,図2) *図の番号は下の定義の動作番号を表します。 #define FORWARD RotateMotor(OUT_B,M_P,B_A); //動作1 Off(OUT_B); //ペンを下げる→直進→停止 RotateMotor(OUT_AC,M_P,M_A); Off(OUT_AC); #define FORWARD2 RotateMotor(OUT_B,M_P2,B_A); //動作2 Off(OUT_B); //ペンを上げる→直進→停止 RotateMotor(OUT_AC,M_P,M_A_l); Off(OUT_AC); #define FORWARD3 RotateMotor(OUT_AC,M_P,M_A); //動作3 Off(OUT_AC); //直進→停止 #define FORWARD4 RotateMotor(OUT_AC,M_P,M_A_b); //動作4 Off(OUT_AC); //直進→ペンを下げる→直進→ RotateMotor(OUT_B,M_P,B_A); //ペンを上げる→直進→ Off(OUT_B); //ペンを下げる→直進→ RotateMotor(OUT_AC,M_P,M_A_a); //ペンを上げる→直進 Off(OUT_AC); RotateMotor(OUT_B,M_P2,B_A); Off(OUT_B); RotateMotor(OUT_AC,M_P,M_A_c); Off(OUT_AC); RotateMotor(OUT_B,M_P,B_A); Off(OUT_B); RotateMotor(OUT_AC,M_P,M_A_a); Off(OUT_AC); RotateMotor(OUT_B,M_P2,B_A); Off(OUT_B); RotateMotor(OUT_AC,M_P,M_A_d); Off(OUT_AC); #define FORWARD5 RotateMotor(OUT_AC,M_P,M_A_b); //動作5 Off(OUT_AC); //直進→ペンを下げる→直進→ RotateMotor(OUT_B,M_P,B_A); //ペンを上げる→直進 Off(OUT_B); RotateMotor(OUT_AC,M_P,M_A_3); Off(OUT_AC); RotateMotor(OUT_B,M_P2,B_A); Off(OUT_B); RotateMotor(OUT_AC,M_P,M_A_l); Off(OUT_AC); #define FORWARD6 RotateMotor(OUT_AC,M_P,M_A_b); //動作6 Off(OUT_AC); //直進→ペンを下げる→直進→ RotateMotor(OUT_B,M_P,B_A); //ペンを上げる Off(OUT_B); RotateMotor(OUT_AC,M_P,M_A_a); Off(OUT_AC); RotateMotor(OUT_B,M_P2,B_A); Off(OUT_B); #define TURN RotateMotor(OUT_C,M_P,T_A); //動作7(右旋回) Off(OUT_C); //右旋回→後進 RotateMotor(OUT_AC,M_P2,M_A_L); Off(OUT_AC); #define TURN2 RotateMotor(OUT_A,M_P,T_A); //動作7(左旋回) Off(OUT_A); //左旋回→後進 RotateMotor(OUT_AC,M_P2,M_A_L); Off(OUT_AC); **プログラム [#l09f4b43] 複雑な定義のおかげでプログラム自体はこれだけで済みました。やはり定義って素晴らしい(書くのは大変ですが...) task main () { for (int i=0; i<4; i++) { FORWARD; FORWARD2; TURN; } FORWARD3; TURN; FORWARD4; TURN2; FORWARD5; TURN2; FORWARD6; } **結果 [#f253f20e] #ref(2012a/A5/Liwon7/M1/似顔絵 練習.jpg,似顔絵 練習) #ref(2012a/A5/Liwon7/M1/似顔絵 結果.jpg,似顔絵 結果) 結果は下の写真の通りです。外枠の最後の一辺の前で紙がずれてしまい、そのまま最後まで見事にずれました。練習時(上の写真)と比べると、ずれの大きさがわかります。 やはり、ずれの対策をしていなかったのが良くなかったようです。 **感想 [#w0dcda87] 自分達の作成したロボットはペンが車軸の前方にあり一筆書きで描けません。 例えば四角形を描くとき、普通なら ペンを下ろす→(直進→90度回転)×4 というふうに出来ますが、自分達の場合 (ペンを下ろす→直進→ペンを離す→少し直進→90度回転→少し後進)×4(*定義の図を参照) というふうにプログラムが複雑になってしまいます。 そこをどう克服するかが今回の最大の難点でした。 そこが今回の最大の難点でした。 更に、紙のずれの対策をしていなかった(というより、どうしたらいいかわからなかった...)ことにより、発表時にずれが発生してしまいました。そこをどう解決していくかが今後の課題となりそうです。