*課題2(第2コース) [#n2ab6bc0]
下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ。
**ミッション [#j6a6c3cd]
次のいずれかのコースで黒い線に沿って動き、途中でボールをゴール付近に立てた350mlの空き缶(黄色で表示)に当てるロボットを製作せよ。 (相棒と違うコースを選ぶこと)
http://yakushi.shinshu-u.ac.jp/robotics/?plugin=ref&page=2018b%2FMember%2FJerry%2FMission2&src=%A5%B3%A1%BC%A5%B9.png
+ロボットを正方形X内におき、Lをスタート
+Eを一時停止して直進
+Iを一時停止して左折
+Hを直進
+Kを直進
+Jを左折
+Cを一時停止して右折
+Eを一時停止して直進
+Gを一時停止して直進
+長方形X内に入って停止

(一時停止の指定がある場所は、1秒間停止すること)

ボールはロボットが弧IHKJ上にある時にQ地点の空き缶に当てる
*ロボットの説明[#sd3ebdf4]
**全体像 [#s5157bea]
http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&pcmd=open&file=C28CF2AD-EBF7-4DC6-BAD4-E41C3BCDE9D9.jpeg&refer=2018b%2FMember%2Fyamada%2FMission2 [#d0f606ea]
**各種センサーの位置 [#a9f92a47]
http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&pcmd=open&file=721D9563-2EBC-45A6-92F9-D74A4BE851C6.jpeg&refer=2018b%2FMember%2Fyamada%2FMission2


*プログラムについて [#t8183ddf]
**基本動作に関する定義 [#gd0a5a5e]
#define THRESHOLD 54 [#o897b273]
#define SPEED 30
#define speed 20
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL);
#define LEFT OnRL(speed,-speed);
#define left OnRL(speed,0);
#define straight OnRL(SPEED,SPEED);
#define right OnRL(0,speed);
#define RIGHT OnRL(-speed,speed);
#define STEP 1
#define nMAX 300
#define short_break Off(OUT_BC);Wait(1000);
#define CROSS_TIME 700
#define cross_line OnFwd(OUT_BC,speed);Wait(CROSS_TIME);short_break;
#define turn_time 3000
#define turn_left LEFT;Wait(turn_time);short_break;
#define turn_right RIGHT;Wait(turn_time);short_break;
#define kaiten OnRL(SPEED,-SPEED);
#define kaiten_time 5500
#define arm_up OnRev(OUT_A,SPEED);Wait(500);Off(OUT_A);
**まとまった動作に関する定義 [#ja1f6d69]
***黒線の右側をトレースするプログラム [#mc631e28]
sub line_trace_R()
{
 while (true) {
    if(SENSOR_3<THRESHOLD-8){RIGHT;}
    else if(SENSOR_3<THRESHOLD-3){right;}
    else if(SENSOR_3<THRESHOLD+2){straight;}
    else if(SENSOR_3<THRESHOLD+6){left;}
    else{LEFT;}
   Wait(STEP);
}
***黒線の左側をトレースするプログラム [#m060bc2b]
sub line_trace_L()
{
 while (true) {
    if(SENSOR_3<THRESHOLD-8){LEFT;}
    else if(SENSOR_3<THRESHOLD-3){left;}
    else if(SENSOR_3<THRESHOLD+2){straight;}
    else if(SENSOR_3<THRESHOLD+6){right;}
    else{RIGHT;}
   Wait(STEP);
   }
***黒線の右側トレース時に交差点で一時停止して横断するプログラム [#z725f4b9]
sub kousaten_trace_R()
{
   SetSensorLight(S3);
   int nOnline=0;
 while (nOnline < nMAX) {
   if (SENSOR_3 < THRESHOLD-10) {
    RIGHT;
    nOnline++;}
   else {
    if (SENSOR_3 < THRESHOLD-3) {right;}
    else if (SENSOR_3 < THRESHOLD+2) {straight;}
    else if (SENSOR_3 < THRESHOLD+6) {left;}
    else {LEFT;}
    nOnline=0;}
   Wait(STEP);
  }
  short_break;
  LEFT;
  Wait(nMAX*STEP);
  cross_line;
  nOnline=0;
 }
***黒線の左側トレース時に交差点で一時停止して横断するプログラム [#j0b5a596]
sub kousaten_trace_()
{
   SetSensorLight(S3);
   int nOnline=0;
 while (nOnline < nMAX) {
   if (SENSOR_3 < THRESHOLD-10) {
    LEFT;
    nOnline++;}
   else {
    if (SENSOR_3 < THRESHOLD-3) {left;}
    else if (SENSOR_3 < THRESHOLD+2) {straight;}
    else if (SENSOR_3 < THRESHOLD+6) {right;}
    else {RIGHT;}
    nOnline=0;}
   Wait(STEP);
  }
  short_break;
  RIGHT;
  Wait(nMAX*STEP);
  cross_line;
  nOnline=0;
 }
***黒線の右側トレース時に一時停止して左折するプログラム [#t6696adb]
sub kousaten_sasetsu_R()
{
   SetSensorLight(S3);
   int nOnline=0;
 while (nOnline < nMAX) {
   if (SENSOR_3 < THRESHOLD-8) {
    RIGHT;
    nOnline++;}
   else {
    if (SENSOR_3 < THRESHOLD-3) {right;}
    else if (SENSOR_3 < THRESHOLD+2) {straight;}
    else if (SENSOR_3 < THRESHOLD+6) {left;}
    else {LEFT;}
    nOnline=0;}
   Wait(STEP);
  }
  short_break;
  LEFT;
  Wait(nMAX*STEP);
  turn_left;
  nOnline=0;
 }
***黒線の左側トレース時に一時停止して右折するプログラム [#o0dd26fa]
sub kousaten_usetsu_L()
{
   SetSensorLight(S3);
   int nOnline=0;
 while (nOnline < nMAX) {
   if (SENSOR_3 < THRESHOLD-8) {
    LEFT;
    nOnline++;}
   else {
    if (SENSOR_3 < THRESHOLD-3) {left;}
    else if (SENSOR_3 < THRESHOLD+2) {straight;}
    else if (SENSOR_3 < THRESHOLD+6) {right;}
    else {RIGHT;}
    nOnline=0;}
   Wait(STEP);
  }
  short_break;
  RIGHT;
  Wait(nMAX*STEP);
  turn_right;
  nOnline=0;
 }
***缶の位置を探すプログラム [#z382c818]
sub serch_kan()
{
SetSensorLowspeed(S4);
long t10,t11;
int L=10000;
while(CurrentTick()-t10<=kaiten_time){
 OnRL(speed,-speed);
 if(SensorUS(S4)<L)
 {
  L=SensorUS(S4);
  t11=CurrentTick()-t10;
 }
}
OnRL(-speed,speed);
Wait(kaiten_time-t11);
Off(OUT_BC);
}
***ボールをシュートするプログラム [#ge658b27]
sub shoot()
{
 arm_up;
 OnFwd(OUT_BC,100);
 Wait(200);
 Off(OUT_BC);
 }

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS