- 追加された行はこの色です。
- 削除された行はこの色です。
[[ロボティクス入門ゼミ]]
[[2006a/MemberOnly/進行状況C]]
[[2006a/C5/ロボコン]]
[[2006a/C5/ロボコン/本体編]]
[[2006a/C5/ロボコン/プログラム編]]
[[2006a/C5/ロボコン/プログラム編/右]]
[[2006a/C5/ロボコン/プログラム編/完成改]]
プログラム制作者:水
int line_number;
sub go() //行きのサブルーチンです。何度も使いそうなのでまとめました。
{
OnRev(OUT_A+OUT_C);
until((SENSOR_2<40)&&(SENSOR_3<40)); //はじめの交差している線まで後退します。
OnRev(OUT_A);OnFwd(OUT_C);Wait(200); //そこで左に旋回
OnFwd(OUT_A+OUT_B);
OnFwd(OUT_A+OUT_C);
until((SENSOR_2<40)&&(SENSOR_3<40)); //一本目の交差している線まで前進します。
line_number=line_number+1; //線についたら変数「line_number」のはじめの数に1を足します。
OnFwd(OUT_A+OUT_B);
OnFwd(OUT_A+OUT_C);
until((SENSOR_2<40)&&(SENSOR_30<40)); //次の線まで前進します。
line_number=line_number+1; //変数にさらにもう1足します。これで2足したことになります。
//缶をとる位置まで2回線が交差しているので2数えさせます。
}
sub back() //帰りのサブルーチンです。
//基本はsub go()と同じです。前進と後退が逆になっています。
{
OnFwd(OUT_A+OUT_C);
until((SENSOR_2<40)&&(SENSOR_3<40));
OnRev(OUT_A);OnFwd(OUT_C);Wait(200);
OnRev(OUT_A+OUT_B);
OnRev(OUT_A+OUT_C);
until((SENSOR_2<40)&&(SENSOR_3<40));
line_number=line_number+1;
OnRev(OUT_A+OUT_B);
OnRev(OUT_A+OUT_C);
until((SENSOR_2<40)&&(SENSOR_3<40));
line_number=line_number+1;
}
task main()
{
SetSensor(SENSOR_1,SENSOR_TOUCH);
SetSensor(SENSOR_2,SENSOR_LIGHT);
SetSensor(SENSOR_3,SENSOR_LIGHT);
line_number=0; //はじめに変数に0を代入します。
go(); //この動作が終わった後「line_number」は2なので
until(line_number==2); //交差を2回すぎた後、
OnFwd(OUT_A);OnRev(OUT_C);Wait(200); //90°右旋回します。
OnFwd(OUT_A+OUT_C);
until(SENSOR_1==1); //タッチセンサーに触るまで(缶にあたるまで)前進します。
OnRev(OUT_A+OUT_C);Wait(50);
OnFwd(OUT_B);Wait(1000); //少し後退し、腕をおろします。
back(); //缶をつかんだ後、そのままスタート地点まで戻ります。
OnRev(OUT_A);OnFwd(OUT_C);Wait(200); //90°左旋回し後ろ向きになって
OnRev(OUT_A+OUT_C);Wait(100); //スタート地点まで戻ります。
ClearMessage();
while(Message() !=0) //向こうから何かのメッセージを受け取るまで続けます。
{
SendMessage(1);
Wait(50); //メッセージ1を送り続けます。
}
until(Message() !=0); //何かのメッセージを受けたら、
OnRev(OUT_A+OUT_C);Wait(50); //少し後退して、
OnFwd(OUT_A);OnRev(OUT_C);Wait(800); //180°旋回します。
OnRev(OUT_B);Wait(1000); //腕を上げ、
OnFwd(OUT_A+OUT_B);Wait(50); //少し缶を押します。
go(); //2つ目の缶をとりにいきます。
until(line_number==6) //今まですべてで6つの交差をすぎたら、つまり2回目で
OnRev(OUT_C);Wait(200); //2つ交差をすぎたら、少し右目に右旋回します。
OnFwd(OUT_A+OUT_C);
until(SENSOR_1==1); //缶にあたるまで前進します。
OnRev(OUT_A+OUT_C);Wait(50);
OnFwd(OUT_B);Wait(1000); //缶をつかみ、
back(); //そのまま帰ります。
OnRev(OUT_A);OnFwd(OUT_C);Wait(200); //スタート地点前まで行ったら、後ろ向きにします。
OnRev(OUT_A+OUT_C);Wait(100); //そのまま前進します。
ClearMessage(); //今まで受けたメッセージをなしにします。
while(Message() !=0) //一回目同様何かのメッセージを受けるまで続けます。
{
SendMessage(1); //メッセージ1を送ります
Wait(50);
}
until(Message() !=0); //何かメッセージを受けたら、
OnRev(OUT_A+OUT_C);Wait(50);
OnFwd(OUT_A);OnRev(OUT_C);Wait(800); //前を向くように旋回します。
OnRev(OUT_B);Wait(1000);
OnFwd(OUT_A+OUT_B);Wait(50); //腕を上げ、缶を押し出します
go(); //3つ目の缶をとりにいきます。
until(line_number==10); //今まですべてで10の交差をすぎたら、つまり2回目で
OnFwd(OUT_A);Wait(200); //2つ交差をすぎたら、少し左目に左旋回します。
OnFwd(OUT_A+OUT_C);
until(SENSOR_1==10); //缶にあたるまで前進します。
OnRev(OUT_A+OUT_C);Wait(50);
OnFwd(OUT_B);Wait(1000); //缶をつかみ、
back(); //そのままきた道を戻ります
OnRev(OUT_A);OnFwd(OUT_C);Wait(200);
OnRev(OUT_A+OUT_C);Wait(100); //後ろを向いてスタート地点まで出ます。
ClearMessage(); //2回目までに受けたメッセージをなしにします。
while(Message() !=0) //何かのメッセージを受けるまで続けます。
{
SendMessage(1);
Wait(50); //メッセージ1を送り続けます。
}
until(Message() !=0); //何かのメッセージを受けたら、
OnRev(OUT_A+OUT_C);Wait(50);
OnFwd(OUT_A);OnRev(OUT_C);Wait(800); //前向きになり、
OnRev(OUT_B);Wait(1000);
OnFwd(OUT_A+OUT_B);Wait(50); //缶を押し出します。
}
*課題 [#m4a51c7b]
自分としてはできるだけ簡略化したつもりでしたが、もう少し簡単にできる気がします。一番簡単にできるのは缶を渡すところと、缶をつかむところです。サブルーチンをもう一つ使ってまとめようと思います。このプログラムはまだ実際に動かしてないので、しっかりと動くかわかりませんが、その動き具合によって調節していこうと思います。
***実際にロボコンで使用したプログラム [#ib8dcf57]
製作者:水
実際に二つのプログラムが完成したのは、一回目のロボコンを保留にして、二回目のロボコンが始まるほんの五分前でした。
しかし、そのプログラムでは缶を取りに行く事すらできなかったので、もう一度プログラムを見直し、このプログラムになりました。(希望者のみ参加の三回目のロボコンにぎりぎりで間に合いました。)
しかし、このプログラムでは、缶は取れてももって行く事はできませんでした。そのため、この後に予想で改良したプログラムを載せておきます。
#define arm_up OnFwd(OUT_B);Wait(80); //腕を上げる
#define arm_down OnRev(OUT_B);Wait(80); //腕を下ろす
#define R_turn_90 OnFwd(OUT_C);OnRev(OUT_A);Wait(85); //右に90°旋回
#define L_turn_90 OnRev(OUT_C);OnFwd(OUT_A);Wait(85); //左に90°旋回
#define R_turn_180 OnFwd(OUT_A);OnRev(OUT_C);Wait(170); //180°回転
#define light until((SENSOR_2<40)&&(SENSOR_3<40)); //光センサーが黒線を感知するまで
#define touch until(SENSOR_1==1); //缶に触れるまで
#define go OnFwd(OUT_A+OUT_C); //直進
#define back OnRev(OUT_A+OUT_C); //後退
#define go_line go light line_number=line_number+1; //線を1本感知するまで直進
#define back_line back light line_number=line_number+1; //線につくまで後退
#define message ClearMessage();while(Message() !=0 {SendMessage(1);Wait(50);} until(Message() !=0); //メッセージを送信、受信
int line_number; //線の本数を変数とします
sub GO() //上同様何度も使うのでサブルーチンにしました
{
go
Wait(50); //少しだけ直進、1本目の線を過ぎる
Off(OUT_A+OUT_C);
Wait(1);
go
light //2本目の線に達したら
R_turn_90 //右に90°回転
go_line
go
Wait(10);
go_line //直進し2本線を過ぎるまで進み続ける
}
sub BACK() //行き同様サブルーチンにしました(ほとんど行きと同じ全身が後退になっただけ)
{
back
Wait(50);
back
light
L_turn_90
back_line
back
Wait(10);
back_line
}
task main()
{
SetSensor(SENSOR_1,SENSOR_TOUCH); //センサー1をタッチセンサーとします
SetSensor(SENSOR_2,SENSOR_LIGHT);
SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー2,3を光センサーとします
line_number=0;
GO();
until(line_number==2); //線が2本になったら
R_turn_90 //右に90°旋回
go
touch //缶に触れるまで直進
arm_down //腕を下ろす
BACK();
L_turn_90 //受け渡し場所の前まできたら90°左旋回
back //後退(前進)する
Wait(50);
message //メッセージの作業が済んだら
go //少し下がって
Wait(50);
R_turn_180 //180°回転
arm_up
go
Wait(50); //腕を上げ、缶を渡す
back
Wait(50); //少し下がり
R_turn_180 //180°回転
GO();
until(line_number==6); //1回目と同じ動作
OnRev(OUT_C);
Wait(85); //少し小さめに右寄りに回転
go
touch
arm_down
BACK();
L_turn_90
back Wait(50);
message
go
Wait(50);
R_turn_180
arm_up
go
Wait(50);
back
Wait(50);
R_turn_180 //1回目と同じ
GO();
until(line_number==10); //1回目、2回目と同じ
OnFwd(OUT_A);Wait(85); //今度は少し大きめに左よりに回転
go
touch
arm_down
BACK();
L_turn_90
back
Wait(50);
message
go
Wait(50);
R_turn_180
arm_down
go
Wait(50); //1,2回目と同じ
}
**課題と反省 [#a5eb1703]
ロボット同様このプログラムが完成したのはロボコン中のかなり後でした。そのため、試運転も何も出来なく、実際に動かしたのはロボコンのときのみになってしまいました。結果は何も出来ずに終わってしまい、もっと早くに完成させていればと後悔ばかりが残ってしまいました。ロボコン中での問題点を改善したものはプログラム編完成改に載せておきます。最終的に分かっている問題点は缶を取って帰る時に、しっかりと曲がれないという事です。