- 追加された行はこの色です。
- 削除された行はこの色です。
[[ロボティクス入門ゼミ]]
[[2006a/MemberOnly/進行状況C]]
[[2006a/C5/ロボコン]]
[[2006a/C5/ロボコン/本体編]]
[[2006a/C5/ロボコン/プログラム編]]
[[2006a/C5/ロボコン/プログラム編/左]]
[[2006a/C5/ロボコン/プログラム編/完成改]]
*プログラム 制作者:藤巻、坂口 [#ob812c9f]
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);
until((SENSOR_2<40)&&(SENSOR_3<40));//
line_number=line_number+1;//
OnFwd(OUT_A+OUT_B);
until((SENSOR_2<40)&&(SENSOR_30<40));//
line_number=line_number+1; //
}
sub back()//
{
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);
until((SENSOR_2<40)&&(SENSOR_3<40));
line_number=line_number+1;
OnRev(OUT_A+OUT_B);
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);
ClearMessage();
while(Message() !=0) //向こうから何かのメッセージを受け取る まで続けます。
{
SendMessage(1);
Wait(50); //メッセージ1を送り続けます。
}
until(Message() !=0); //何かのメッセージを受けたら、
OnFwd(OUT_A);OnRev(OUT_C);Wait(800); //180°旋回します。
OnRev(OUT_B);Wait(1000); //腕を上げ、
OnRev(OUT_A+OUT_C);
until(SENSOR_1==1); //タッチセンサーに触るまで(缶にあたるまで)します。
OnFwd(OUT_A+OUT_C);Wait(50);
OnFwd(OUT_B);Wait(1000); //少し後退し、腕をおろします。
OnFwd(OUT_A);OnRev(OUT_C);Wait(800); //180°旋回します。
line_number=0; //はじめに変数に0を代入します。
go(); //この動作が終わった後「line_number」は2なので
until(line_number==2); //交差を2回すぎた後、
OnFwd(OUT_A);OnRev(OUT_C);Wait(200); //90°旋回します。
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);
OnRev(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を送り続けます。
}
**ロボコンで使用したプログラム [#se18bd32]
製作者:水
int line_number;
#define arm_up OnRev(OUT_B);Wait(50);
#define arm_down OnFwd(OUT_B);Wait(50);
#define R_turn_90 OnFwd(OUT_C);OnRev(OUT_A);Wait(70);
#define L_turn_90 OnRev(OUT_C);OnFwd(OUT_A);Wait(70);
#define R_turn_360 OnFwd(OUT_A);OnRev(OUT_C);Wait(280);
#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;
#define back_line back light line_number=line_number+1;
#define message ClearMessage();until(Message() !=0) SendMessage(1);Wait(50);until(Message() !=0);
int line_number; //線の数を変数にしておきます。
#define arm_up OnRev(OUT_B);Wait(50); //腕を上げる
#define arm_down OnFwd(OUT_B);Wait(50); //腕を下げる
#define R_turn_90 OnFwd(OUT_C);OnRev(OUT_A);Wait(70); //右に90°旋回
#define L_turn_90 OnRev(OUT_C);OnFwd(OUT_A);Wait(70); //左に90°旋回
#define R_turn_180 OnFwd(OUT_A);OnRev(OUT_C);Wait(140); //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; //黒線まで後退し、変数を+1する
#define message ClearMessage();until(Message() !=0) SendMessage(1);Wait(50);until(Message() !=0); //メッセージの送信、受信
sub GO()
sub GO() //何度も使うのでサブルーチンにしました
{
go
Wait(50);Off(OUT_A+OUT_C);
Wait(50); //1つ目の直線を超えるまで直進
Off(OUT_A+OUT_C);
Wait(1);
go
light
R_turn_90
light //二つ目の直線まで直進
R_turn_90 //右に90°旋回
go_line
go
Wait(10);
go_line
go_line //線を2本越えるまで直進する
}
sub BACK()
sub BACK() //基本は行きと同じ、直進が後退になっただけ
{
back
Wait(50);
Off(OUT_A+OUT_C);
Wait(1);
back
light
R_turn_90
back_line
back
Wait(10);
back_line
}
task main()
{
SetSensor(SENSOR_2,SENSOR_TOUCH);
SetSensor(SENSOR_2,SENSOR_TOUCH); //センサー1をタッチセンサーに設定
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_3,SENSOR_LIGHT);
SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー2,3を光センサーに設定
line_number=0;
until(Message() !=0);
until(Message() !=0); //何かメッセージを受け取るまで待機
until(SENSOR_2==1); //缶がタッチセンサーに触ったら
arm_down //腕を下げる
until(SENSOR_2==1);
arm_down
GO();
until(line_number==2);
L_turn_90
until(line_number==2); //2本目の線まできたら
L_turn_90 //90°左旋回
Wait(50);
arm_up
Wait(10);
go
Wait(10); //腕を上げ、缶をゴールに入れる
BACK();
R_turn_90
back Wait(50);
BACK(); //帰る
R_turn_90 //受け取り位置の前まできたら
back Wait(50); //少し前進して待つ
message
message //メッセージの送信、受信
go
Wait(50);
R_turn_360
until(SENSOR_2==1);
arm_down
Wait(50); //少し下がり
R_turn_180 //180°回転
until(SENSOR_2==1); //缶がセンサーに触れたら
arm_down //腕を下ろす
R_turn_360
R_turn_180 //180°回転
GO();
GO(); //残りは1回目と同様の行動を2回繰り返す
until(line_number==6);
L_turn_90
Wait(50);
arm_up
go
Wait(10);
BACK();
R_turn_90
back Wait(50);
message
go
Wait(50);
R_turn_360
R_turn_180
until(SENSOR_2==1);
arm_down
R_turn_360
R_turn_180
GO();
until(line_number==10);
L_turn_90
Wait(50);
arm_up
go
Wait(10);
BACK();
R_turn_90
back Wait(50);
message
go
Wait(50);
R_turn_360
R_turn_180
until(SENSOR_2==1);
arm_down
R_turn_360
R_turn_180
}
**課題と反省 [#e0752922]
このプログラムは製作者が左と同じため課題と反省は左に載せておきます。