#contents *はじめに [#f9c16381] 紙コップをC地点、D地点にそれぞれ3個(合計6個)置き、C地点に置いた紙コップにはCを、~ D地点に置いた紙コップにはDを紙コップの底面にマークします。~ 最終的に黒線で囲まれた輪の中にC地点からの紙コップとD地点からの紙コップを交互に重ねます。~ (下側から数えて奇数番目はC地点からのコップ、偶数番目はD地点からのコップになるようにします)~ *ロボットについて [#q7bdba58] #ref(IMG_1.jpg) #ref(IMG_2.jpg) *プログラム [#g9684b70] -定義 #define roll_left OnRev(OUT_A); OnFwd(OUT_C); //左回転 #define turn_left OnFwd(OUT_C); Off(OUT_A); //左旋回 #define go OnFwd(OUT_A); OnFwd(OUT_C); //前進 #define turn_right OnFwd(OUT_A); Off(OUT_C); //右旋回 #define roll_right OnFwd(OUT_A); OnRev(OUT_C); //右回転 #define back OnRev(OUT_A); OnRev(OUT_C); Wait(200); Off(OUT_AC); //後進 #define top OnRev(OUT_C); OnFwd(OUT_A); Wait(CROSS_TIME); OnFwd(OUT_AC); Wait(10); #define left OnRev(OUT_A); OnFwd(OUT_C); Wait(20); #define right OnRev(OUT_C); OnFwd(OUT_A); Wait(80); OnFwd(OUT_AC); Wait(20); -サブルーチン~ sub line_l(){ int ch=0; //ループ脱出用変数 ClearTimer(0); //交差点判別用のタイマー初期化 ClearTimer(1); //交差点誤判別防止用のタイマー初期化 while(ch==0) //chが0の時はループを続ける { if(SENSOR_2 > 53) //白部分 右回転 { ClearTimer(0); //黒部分ではないので交差点判別用のタイマーを初期化 roll_right; } else if(SENSOR_2 > 52) //弱白部分 右旋回 { ClearTimer(0); //黒部分ではないので交差点判別用のタイマーを初期化 turn_right; } else if(SENSOR_2 > 44) //境界部分 直進 { ClearTimer(0); //黒部分ではないので交差点判別用のタイマーを初期化 go; } else if(SENSOR_2 > 41) //弱黒部分 左旋回 { ClearTimer(0); //黒部分ではないので交差点判別用のタイマーを初期化 turn_left; } else{ //黒部分 左回転 roll_left; } if(FastTimer(0)>CROSS_TIME&&FastTimer(1)>l_time){ //交差点判別 Off(OUT_AC); //車輪を止める PlaySound(SOUND_UP); //音を鳴らす Wait(100); //1秒待つ ch=1; //ループ脱出の為にchを1にする } Wait(1); //0.01秒待つ } } sub line_r(){ int ch=0; //ループ脱出用変数 ClearTimer(0); //交差点判別用のタイマー初期化 ClearTimer(1); //交差点誤判別防止用のタイマー初期化 while(ch==0) //chが0の時はループを続ける { if(SENSOR_2 > 53) //白部分 左回転 { ClearTimer(0); //黒部分ではないので交差点判別用のタイマーを初期化 roll_left; } else if(SENSOR_2 > 52) //弱白部分 左旋回 { ClearTimer(0); //黒部分ではないので交差点判別用のタイマーを初期化 turn_left; } else if(SENSOR_2 > 44) //境界部分 直進 { ClearTimer(0); //黒部分ではないので交差点判別用のタイマーを初期化 go; } else if(SENSOR_2 > 41) //弱黒部分 右旋回 { ClearTimer(0); //黒部分ではないので交差点判別用のタイマーを初期化 turn_right; } else{ //黒部分 右回転 roll_right; } if(FastTimer(0)>CROSS_TIME&&FastTimer(1)>l_time){ //交差点判別 Off(OUT_AC); //車輪を止める PlaySound(SOUND_UP); //音を鳴らす Wait(100); //1秒待つ ch=1; //ループ脱出の為にchを1にする } Wait(1); //0.01秒待つ } } -交差点判別~ if(FastTimer(0)>CROSS_TIME&&FastTimer(1)>l_time){ //交差点判別 Off(OUT_AC); //車輪を止める PlaySound(SOUND_UP); //音を鳴らす Wait(100); //1秒待つ ch=1; //ループ脱出の為にchを1にする } ClearTimer(0); if(FastTimer(0)>CROSS_TIME) if(FastTimer(0)>CROSS_TIME&&FastTimer(1)>l_time) -コップの回収~ sub cup(){ OnRev(OUT_B); //アームを下す Wait(50); Off(OUT_B); OnFwd(OUT_AC); //前進 while(SENSOR_1<42); //光センサーがコップを認識するまで前進する Off(OUT_AC); //停止 OnFwd(OUT_B); //アームを上げる Wait(50); Off(OUT_B); } -最後の処理~ sub last(){ OnRev(OUT_C); //姿勢をまっすぐにする OnFwd(OUT_A); Wait(40); OnFwd(OUT_AC); //前進 Wait(200); //2秒間待つ Off(OUT_AC); //停止 ClearTimer(0); //交差点判別用のタイマー初期化(初期化しなくてもよいが最後なので一応初期化) ClearTimer(1); //交差点誤判別防止用のタイマー初期化(初期化しなくてもよいが最後なので一応初期化 } -本文~ task main () { SetSensor(SENSOR_1, SENSOR_LIGHT); SetSensor(SENSOR_2, SENSOR_LIGHT); OnFwd(OUT_AC); Wait(60); line_l(); left; l_time=400; line_l(); right; l_time=100; balance_l(); cup(); bottom; turn(); balance_r(); cup(); bottom; turn(); OnFwd(OUT_A); OnFwd(OUT_C); Wait(20); balance_r(); cup(); bottom; turn(); OnFwd(OUT_A); OnFwd(OUT_C); Wait(20); balance_r(); cup(); bottom; bottom; bottom; bottom; l_time=200; OnFwd(OUT_C); OnRev(OUT_A); Wait(50); OnFwd(OUT_A); OnFwd(OUT_C); Wait(30); line_l(); left; line_l(); left; line_l(); OnFwd(OUT_AC); Wait(50); Off(OUT_AC); OnRev(OUT_B); Wait(50); Off(OUT_B); OnFwd(OUT_A); OnRev(OUT_C); Wait(100); OnRev(OUT_AC); Wait(200); Off(OUT_AC); } *プログラムの説明 [#j8118502] *感想 [#wfec7bfc]