[[2015a/Member/luminous/Mission2]] *ロボコン課題 [#ha78ed24] ルールは此方のページを参照↓ http://yakushi.shinshu-u.ac.jp/robotics/?2015a%2F%A5%ED%A5%DC%A5%B3%A5%F3 *走行動画 [#e7cb9d3c] **https://www.youtube.com/watch?v=XnC5LGhUhQM [#i3976163] *プログラミング [#ke6155a7] プログラミングは私の手がけた方(1台目)のみを記す。 2台目のプログラミングについては↓URLを参照 http://yakushi.shinshu-u.ac.jp/robotics/?2015a%2FMember%2Fmorinokumasan%2FMission2 #define go_a OnFwd(OUT_AC);Wait(100);Off(OUT_AC); //前進 #define go_b OnFwd(OUT_AC);Wait(40);Off(OUT_AC); // シュート用前進 #define nMAX 7 //通常のカーブとして許容できる繰り返しの最大値 #define STEP 1 //一回の判断で動作させる時間(0.01秒) #define THRESHOLD 34 //黒の値 #define HIPOWER 7 // 直線用のパワー #define LOWPOWER 4 // カーブのパワー #define set_power_H SetPower(OUT_AC,HIPOWER); #define set_power_L SetPower(OUT_AC,LOWPOWER); #define go_forward set_power_L; OnFwd(OUT_AC); #define turn_left1 set_power_L; OnFwd(OUT_C); OnRev(OUT_A); #define turn_left0 set_power_L; OnFwd(OUT_C); Off(OUT_A); #define turn_right0 set_power_L; OnFwd(OUT_A); Off(OUT_C); #define turn_right1 set_power_L; OnFwd(OUT_A); OnRev(OUT_C); /* ライントレース部分は後に定数化して軽量化する */ int nOnline=0; //続けて黒になった回数をカウント sub line_right() { nOnline=0; //カウンタリセット while(nOnline < nMAX) //右側付けのライントレースでPを直進しQの交差点まで行く { if (SENSOR_2 < THRESHOLD+2) { turn_right1; // 右旋回 nOnline++; //カウント+1 } else if (SENSOR_2 < THRESHOLD+10) { turn_right0; // 右折 nOnline=0; } else if (SENSOR_2 < THRESHOLD+15) { go_forward; // 直進 nOnline=0; } else if (SENSOR_2 < THRESHOLD+19) { turn_left0; // 左折 nOnline=0; } else { turn_left1; // 左旋回 nOnline=0; } Wait(STEP); } } sub line_left() { nOnline=0; //カウンタリセット while(nOnline < nMAX) //左側をライントレース開始 { if (SENSOR_2 < THRESHOLD+2) { turn_left1; // 左旋回 nOnline++; //カウント+1 } else if (SENSOR_2 < THRESHOLD+10) { turn_left0; // 左折 nOnline=0; //カウンタリセット } else if (SENSOR_2 < THRESHOLD+15) { go_forward; // 直進 nOnline=0; } else if (SENSOR_2 < THRESHOLD+19) { turn_right0; // 右折 nOnline=0; } else { turn_right1; // 右旋回 nOnline=0; } Wait(STEP); } } task main() { Off(OUT_ABC); Wait(10); SetSensor(SENSOR_2,SENSOR_LIGHT); int nOnline=0; //続けて黒になった回数をカウント /* Aからボールを取ってCまで向かう */ PlaySound(SOUND_UP);Wait(10); //スタート合図 OnRev(OUT_B);Wait(25);Off(OUT_B); //アームを開く go_a;//最初のラインを越えてボールまで近づく OnFwd(OUT_B);Wait(25);Off(OUT_B); //ボールを回収 line_right(); //右側のライントレース Off(OUT_AC);PlaySound(SOUND_CLICK);Wait(10); //交差点で小休止 OnRev(OUT_A);OnFwd(OUT_C);Wait(30);OnFwd(OUT_A);Wait(40); //交差点を渡る Off(OUT_AC); PlaySound(SOUND_CLICK); line_left(); //左側のライントレース Off(OUT_AC);PlaySound(SOUND_CLICK);Wait(30); //ゴール前の線で小休止 OnRev(OUT_AC);Wait(40);Off(OUT_AC); OnRev(OUT_C);Wait(34); //進行方向修正Bのロボットに向く Off(OUT_AC); PlaySound(SOUND_CLICK);OnRev(OUT_B);Wait(30);Off(OUT_B); //アームを開きシュートしつつAC小休止 go_b; //ボールをBにシュート ClearTimer(0); //メッセージ1を送信後、メッセージ2の返信を1秒以内に受信して移動を開始する ClearMessage(); while((Message() != 2)&&(FastTimer(0) < 100)) //返信が1秒以内に来なければ勝手に移動する { SendMessage(1); } if(Message() == 2) { PlaySound(SOUND_CLICK); } else { PlaySound(SOUND_DOWN); } /* 2台目が始動するので回避しながらCまで行く */ OnRev(OUT_AC);Wait(160);Off(OUT_AC); //後退秒数 OnFwd(OUT_A);Wait(230);OnFwd(OUT_C);Wait(210);Off(OUT_AC); //秒数調整してCへのライントレース右側へつける line_right(); //右側つけのライントレース Off(OUT_AC);PlaySound(SOUND_CLICK);Wait(40); OnFwd(OUT_C);OnRev(OUT_A);Wait(32);Off(OUT_AC);PlaySound(SOUND_CLICK);Wait(50); //Cに垂直に向く OnFwd(OUT_AC);Wait(150);Off(OUT_AC);PlaySound(SOUND_CLICK);Wait(50); //Cの中央まで入る OnFwd(OUT_A);OnRev(OUT_C);Wait(200);Off(OUT_AC);PlaySound(SOUND_CLICK);Wait(30); //180度回転 OnRev(OUT_AC);Wait(45);Off(OUT_AC);OnRev(OUT_C);Wait(25);Off(OUT_AC); OnFwd(OUT_B);Wait(5);Off(OUT_B); Off(OUT_ABC);PlaySound(SOUND_DOWN); /* 2台目が到着するまで待機 */ Wait(500); ClearMessage(); //メッセージ3を受信後、メッセージ4を返信する until(Message()==3); PlaySound(SOUND_CLICK); SendMessage(4); Off(OUT_AC);PlaySound(SOUND_CLICK); OnFwd(OUT_B);Wait(30);Off(OUT_ABC); /* ↓以下2台目と調整部分↓ */ /* AからCまで。Qは直進で */ PlaySound(SOUND_CLICK);Wait(90); //2台目の逃げる時間をかせぐ OnFwd(OUT_C);Wait(20);Off(OUT_C); OnFwd(OUT_AC);Wait(205);Off(OUT_AC); //Cのライン越え OnFwd(OUT_B);Wait(10);Off(OUT_B); //ボールを確実にキャッチ nOnline=0; while(nOnline < nMAX) //左側付けのライントレース。ここは狭いところを通るからカクカクで行かせるように敷居値を変える { if (SENSOR_2 < THRESHOLD+6) { turn_left1; // 左旋回 nOnline++; //カウント+1 } else if (SENSOR_2 < THRESHOLD+10) { turn_left0; // 左折 nOnline=0; //カウンタリセット } else if (SENSOR_2 < THRESHOLD+15) { go_forward; // 直進 nOnline=0; } else if (SENSOR_2 < THRESHOLD+15) { turn_right0; // 右折 nOnline=0; } else { turn_right1; // 右旋回 nOnline=0; } Wait(STEP); } Off(OUT_AC);PlaySound(SOUND_CLICK);Wait(30); OnFwd(OUT_A);OnRev(OUT_C);Wait(60);OnFwd(OUT_AC);Wait(70);Off(OUT_AC);PlaySound(SOUND_CLICK); //進行方向修正 line_right(); //右側つけのライントレース Off(OUT_AC);PlaySound(SOUND_CLICK);Wait(40); //ゴール前の線で小休止 OnFwd(OUT_C);Wait(40);OnFwd(OUT_A);Wait(110);Off(OUT_AC);//ゴールのライン越え PlaySound(SOUND_DOWN); //終了 }