ロボティクス入門ゼミ

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);
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を送り続けます。
}

ロボコンで使用したプログラム

 製作者:水

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()  //何度も使うのでサブルーチンにしました
{
go
Wait(50); //1つ目の直線を超えるまで直進
Off(OUT_A+OUT_C);
Wait(1);

go
light //二つ目の直線まで直進
R_turn_90 //右に90°旋回
go_line
go
Wait(10);
go_line //線を2本越えるまで直進する
}
 
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); //センサー1をタッチセンサーに設定
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー2,3を光センサーに設定

line_number=0;
until(Message() !=0); //何かメッセージを受け取るまで待機 
until(SENSOR_2==1); //缶がタッチセンサーに触ったら
arm_down //腕を下げる

GO();
until(line_number==2); //2本目の線まできたら
L_turn_90 //90°左旋回
Wait(50);

arm_up

go
Wait(10); //腕を上げ、缶をゴールに入れる

BACK(); //帰る
R_turn_90 //受け取り位置の前まできたら
back Wait(50); //少し前進して待つ

message //メッセージの送信、受信

go
Wait(50); //少し下がり
R_turn_180 //180°回転
until(SENSOR_2==1); //缶がセンサーに触れたら
arm_down //腕を下ろす

R_turn_180 //180°回転

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_180
until(SENSOR_2==1);
arm_down

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_180
until(SENSOR_2==1);
arm_down

R_turn_180
}

課題と反省

このプログラムは製作者が左と同じため課題と反省は左に載せておきます。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2006-08-13 (日) 23:00:51