- 追加された行はこの色です。
- 削除された行はこの色です。
[[2013a/Member]]
-課題2の説明
-ロボットの説明
-プログラムの説明
-反省点
-次の機会があったら直したいこと
-授業で改善してほしい所
・ロボット同士の通信のやり方を詳しく資料に記述してほしい
・RotateMotorはほぼ必須なので、資料に記述してほしい
#define zone1 37
#define zone2 45
#define zone3 60
#define zone4 65
#define SPEED 45
#define LOWSPEED SPEED*0.625
#define mae OnFwd(OUT_BC,SPEED*0.8); //前進するだけ
#define STEP 1 //一回の判定でロボが進む時間
#define nMAX 100 //STEP秒間に赤外線センサーがnMAX回37以下の値を叩きだしたら次の動作へ
#define SIGNAL1 11 //「打った」と宣言する信号
#define SIGNAL2 12 //「打て」と宣言する信号
#define CONN 1
int p=0; //センサーが黒線の上にあるとき、pを使ってカウントし、pがnMAXの値を超えたらそこは交差点
int n=0;
int m=0;
sub migigawa(int x) //交差点をx回通過するまで右側をライントレースし続けるよ
{
while(m < x) {
while(p < nMAX && m<x) {
if (SENSOR_4 < zone1) {
OnFwd(OUT_B,SPEED);OnRev(OUT_C,LOWSPEED); //小回りな右折
p++;
} else {
if (SENSOR_4 < zone2) {
OnFwd(OUT_B,SPEED);Off(OUT_C); //普通の右折
} else if (SENSOR_4 < zone3) {
mae;
} else if (SENSOR_4 < zone4) {
OnFwd(OUT_C,SPEED);Off(OUT_B); // 普通の左折
} else {
OnFwd(OUT_C,SPEED);OnRev(OUT_B,LOWSPEED); //小回りな左折
}
p=0;
}
Wait(STEP);
}
OnFwd(OUT_C,SPEED);OnRev(OUT_B,LOWSPEED); //小回りな左折
Wait(nMAX*STEP);
OnFwd(OUT_BC,SPEED);Wait(300);
p=0;
m++;
}
m=0;
}
sub hidarigawa(int x) //交差点をx回通過するまでライントレースし続けるよ
{
while(m < x) {
while(p < nMAX && m<x) {
if (SENSOR_4 < zone1) {
OnFwd(OUT_C,SPEED);Off(OUT_B); // 普通の左折
p++;
} else {
if (SENSOR_4 < zone2) {
OnFwd(OUT_C,SPEED);OnRev(OUT_B,LOWSPEED); //小回りな左折
} else if (SENSOR_4 < zone3) {
mae;
} else if (SENSOR_4 < zone4) {
OnFwd(OUT_B,SPEED);Off(OUT_C); //普通の右折
} else {
OnFwd(OUT_B,SPEED);OnRev(OUT_C,LOWSPEED); //小回りな右折
}
p=0;
}
Wait(STEP);
}
OnFwd(OUT_B,SPEED);OnRev(OUT_C,LOWSPEED);
Wait(nMAX*STEP);
OnFwd(OUT_BC,SPEED);Wait(300);
p=0;
m++;
}
m=0;
}
task main ()
{
SetSensorLight(S4); //四番ポートに赤外線センサーを設置
Wait(2000); //ロボットを置く時間
migigawa(2); //交差点を二回カウントするまでライントレース
Off(OUT_BC);Wait(1000);
RotateMotor(OUT_C,-SPEED,200);RotateMotor(OUT_B,SPEED,120);Off(OUT_BC); //角度調整
mae;OnRev(OUT_A,20);Wait(1500);Off(OUT_A); //アームで球を捕獲
mae;until(SENSOR_4 < 50);Off(OUT_BC); //黒線まで直進
OnRev(OUT_BC,SPEED);Wait(500);OnRev(OUT_BC,SPEED);until(SENSOR_4 < 50); //後ろの黒線までバック
OnFwd(OUT_B,SPEED);OnRev(OUT_C,SPEED);Wait(500); //旋回
OnFwd(OUT_B,SPEED);OnRev(OUT_C,SPEED);until(SENSOR_4 < 50); //ライントレース出来る体制に戻る
hidarigawa(1); //左側をライントレースしながら交差点を一回カウント
Off(OUT_BC);Wait(1000);RotateMotor(OUT_BC,-SPEED,430);Wait(1000); //打つ地点までバック
RotateMotor(OUT_B,-SPEED,300);RotateMotor(OUT_C,SPEED,100);Off(OUT_BC); //角度調整
Wait(1000);OnFwd(OUT_BC,SPEED);RotateMotor(OUT_A,100,400);Off(OUT_ABC); //打つ
SendRemoteNumber(CONN,MAILBOX1,SIGNAL1); //打った後に信号を送る
RotateMotor(OUT_BC,-SPEED,100);
OnRev(OUT_BC,SPEED);until(SENSOR_4 < 50);RotateMotor(OUT_BC,SPEED,50); //打った状態から元に戻るその一
OnFwd(OUT_B,SPEED);OnRev(OUT_C,SPEED);until(SENSOR_4 < 50); //打った状態から元に戻るその二
Off(OUT_BC);Wait(5000); //五秒待つ
hidarigawa(1); //左側ライントレース交差点を一回カウント
RotateMotor(OUT_BC,SPEED,100);Off(OUT_BC); //受け取る場所まで移動
RotateMotor(OUT_BC,-SPEED,10);RotateMotor(OUT_C,SPEED,550);Off(OUT_BC); //90°旋回
SendRemoteNumber(CONN,MAILBOX2,SIGNAL2); // 相手に「打て」とメッセージを送る
Wait(500); //相手が打ってから球が来るまで待つ時間
OnRev(OUT_A,20);Wait(1500);Off(OUT_A); //球を受け取る
RotateMotor(OUT_BC,-SPEED,200);
OnFwd(OUT_B,SPEED);OnRev(OUT_C,SPEED);until(SENSOR_4 < 50); //ライントレース出来る体制に戻る
Off(OUT_BC);Wait(5000); //五秒待つ
hidarigawa(1); //左側、交差点を一回カウント
RotateMotor(OUT_BC,SPEED,50);Off(OUT_BC); //打つ地点まで移動
RotateMotor(OUT_B,-SPEED,400);Off(OUT_B); //角度調整
OnFwd(OUT_BC,SPEED);RotateMotor(OUT_A,100,270);Off(OUT_A); //打つ
SendRemoteNumber(CONN,MAILBOX3,SIGNAL1); //「打つぞ」と送る
RotateMotor(OUT_BC,-SPEED,50);Off(OUT_BC); //打った時のズレを修正
Wait(30000); //相手が準備できるまで待機
}