[[2017a/Member]]
目次
#contents
*1.課題について [#o3b26b97]
この課題は書道ロボットの作成である([[課題1>http://yakushi.shinshu-u.ac.jp/robotics/?2017a%2FMission1]]参照)。松本での大学生活を表す漢字を書くということで、電車による通学から自転車による通学に変わり自力で走らなければならなくなったことから「走」という漢字を選んだ。
*2.ロボット [#ne27fd14]
全体像
#ref(./P_20170519_160248.jpg,50%,本体)
**本体 [#a9170697]
レゴブロックにもともと入っていた作り方説明書にあるものを基本形としており、本体は全く変更を加えておらず、アームから先を独自につくった。
#ref(./P_20170519_160641.jpg,50%,本体)
**ペン付近 [#h4135c7b]
右側から
#ref(./P_20170519_160525.jpg,50%,アーム)
左側から
#ref(./P_20170519_160303.jpg,50%,アーム2)
*3.書き順と完成品 [#vfe91090]
#ref(./P_20170519_161327.jpg,50%,完成系)
「走」という漢字は実際に書くと7画あるが、ロボットには2画目と4画目を一直線と考えて6回の動作で書かせた。
#ref(./20170526_155546298.jpg,50%,書き順)
*4.プログラム [#xd34c34f]
**工夫した点 [#d4fd784f]
・アームを右側のタイヤの上に取り付けたので右側に曲がるようになってしまった。そこで、右側のタイヤの出力を強めることでこれを改善した。
・左右への回転を4種類、前進を4種類、後進を2種類つくり、それらに加えてペンを上下にさせる部分を組み合わせて一つのプログラムとした。
→ロボット本体の制御が簡単になり、メイン部分に必要な長さのサブルーチンを指定するだけでよい。
**左右への回転(4種類) [#o5aebf87]
sub turn_r() //右折(90度)
{
OnFwd(OUT_C,SPEED); OnRev(OUT_B,SPEED2);
Wait(TURN_TIME);
Off(OUT_BC);
}
sub turn_l() //左折(90度)
{
OnFwd(OUT_B,SPEED2); OnRev(OUT_C,SPEED);
Wait(TURN_TIME);
Off(OUT_B);
}
sub turn_ll() //左折(over90度)
{
OnFwd(OUT_B,SPEED2); OnRev(OUT_C,SPEED);
Wait(TURN_TIME3);
Off(OUT_B);
}
sub turn_rl() //右折(over90度)
{
OnFwd(OUT_C,SPEED); OnRev(OUT_B,SPEED2);
Wait(TURN_TIME2);
Off(OUT_BC);
}
**前進(4種類) [#ce7837a5]
sub go_ss() //前進(短)
{
OnFwd(OUT_C,SPEED); OnFwd(OUT_B,SPEED2);
Wait(MOVE_TIME3);
Off(OUT_BC);
}
sub go_sm() //前進(中)
{
OnFwd(OUT_C,SPEED); OnFwd(OUT_B,SPEED2);
Wait(MOVE_TIME);
Off(OUT_BC);
}
sub go_sl() //前進(長)
{
OnFwd(OUT_C,SPEED); OnFwd(OUT_B,SPEED2);
Wait(MOVE_TIME4);
Off(OUT_BC);
}
sub go_sll() //前進(特長)
{
OnFwd(OUT_C,SPEED); OnFwd(OUT_B,SPEED2);
Wait(MOVE_TIME6);
Off(OUT_BC);
}
**後進(2種類) [#h384b1d6]
sub go_bl() //後進(長)
{
OnRev(OUT_C,SPEED); OnRev(OUT_B,SPEED2);
Wait(MOVE_TIME2);
Off(OUT_BC);
}
sub go_bm() //後進(中)
{
OnRev(OUT_C,SPEED); OnRev(OUT_B,SPEED2);
Wait(MOVE_TIME5);
Off(OUT_BC);
}
sub pen_u() //ペンを上げる
{
OnRev(OUT_A,SPEED2);
Wait(MOVE_TIME3);
Off(OUT_A);
}
sub pen_d() //ペンを下げる
{
OnFwd(OUT_A,SPEED);
Wait(MOVE_TIME7);
Off(OUT_A);
}
**全体 [#f73375a7]
#define SPEED 20
#define SPEED2 25
#define TURN_TIME 1200
#define TURN_TIME2 1500
#define TURN_TIME3 1300
#define MOVE_TIME 600
#define MOVE_TIME2 1300
#define MOVE_TIME3 300
#define MOVE_TIME4 1000
#define MOVE_TIME5 800
#define MOVE_TIME6 2000
#define MOVE_TIME7 300
sub turn_r() //右折(90度)
{
OnFwd(OUT_C,SPEED); OnRev(OUT_B,SPEED2);
Wait(TURN_TIME);
Off(OUT_BC);
}
sub turn_l() //左折(90度)
{
OnFwd(OUT_B,SPEED2); OnRev(OUT_C,SPEED);
Wait(TURN_TIME);
Off(OUT_B);
}
sub turn_ll() //左折(over90度)
{
OnFwd(OUT_B,SPEED2); OnRev(OUT_C,SPEED);
Wait(TURN_TIME3);
Off(OUT_B);
}
sub turn_rl() //右折(over90度)
{
OnFwd(OUT_C,SPEED); OnRev(OUT_B,SPEED2);
Wait(TURN_TIME2);
Off(OUT_BC);
}
sub go_ss() //前進(短)
{
OnFwd(OUT_C,SPEED); OnFwd(OUT_B,SPEED2);
Wait(MOVE_TIME3);
Off(OUT_BC);
}
sub go_sm() //前進(中)
{
OnFwd(OUT_C,SPEED); OnFwd(OUT_B,SPEED2);
Wait(MOVE_TIME);
Off(OUT_BC);
}
sub go_sl() //前進(長)
{
OnFwd(OUT_C,SPEED); OnFwd(OUT_B,SPEED2);
Wait(MOVE_TIME4);
Off(OUT_BC);
}
sub go_sll() //前進(特長)
{
OnFwd(OUT_C,SPEED); OnFwd(OUT_B,SPEED2);
Wait(MOVE_TIME6);
Off(OUT_BC);
}
sub go_bl() //後進(長)
{
OnRev(OUT_C,SPEED); OnRev(OUT_B,SPEED2);
Wait(MOVE_TIME2);
Off(OUT_BC);
}
sub go_bm() //後進(中)
{
OnRev(OUT_C,SPEED); OnRev(OUT_B,SPEED2);
Wait(MOVE_TIME5);
Off(OUT_BC);
}
sub pen_u() //ペンを上げる
{
OnRev(OUT_A,SPEED2);
Wait(MOVE_TIME3);
Off(OUT_A);
}
sub pen_d() //ペンを下げる
{
OnFwd(OUT_A,SPEED);
Wait(MOVE_TIME7);
Off(OUT_A);
}
task main()
{
go_sm(); //��
pen_u();
go_bl();
turn_r();
go_ss();
turn_l();
go_bm();
pen_d();
go_sl(); //��
pen_u();
go_sl();
turn_r();
go_bm();
go_bl();
pen_d();
go_sll(); //��
pen_u();
go_sm();
go_ss();
turn_l();
go_bl();
pen_d();
go_ss(); //��
pen_u();
go_sm();
turn_rl();
go_bl();
pen_d();
go_sl(); //��
pen_u();
go_sm();
turn_ll();
go_bl();
pen_d();
go_sll(); //��
}
※数字は書き順の写真に対応
※数字は書き順の写真の番号に対応
*5.まとめ・感想 [#r02e5b82]
プログラムというものに初めて触れた中である程度読める漢字をロボットに書かせることができたのはよかった。しかし、メインの部分が長くなってしまったことが反省点として挙げられる。ロボットを動かすために必要な基本部分は身についたと思うので、反省点に気をつけて次の課題ではもう少し"カッコイイ"プログラムにしたい。