目次
黄色いホイールを2個以上連射するロボットを作成し、以下の動きをするようにプログラムを作成せよ。ただし1は懐中電灯を2個使用し、ロボットの動作中は懐中電灯を動かさないがいろいろな距離や方向にある懐中電灯に対応できるロボットにすること。2は懐中電灯を1個使用し懐中電灯をゆっくり動かす。
新谷・みのう
int tmax_1; int tmax_2;//明るいところを見つけた時間を代入する変数 int lmax_1; #define TURN_TIME 400//一周する時間 #define SHOT_TIME 1480//撃つために必要な時間 task main(){ tmax_1=0; lmax_1=0; tmax_2=0;//変数に0代入 SetSensor(SENSOR_2,SENSOR_LIGHT);//SENSOR_2はSENSOR_LIGHT OnRev(OUT_C);//回り始める OnFwd(OUT_A); ClearTimer(0);//タイマー動かす while(FastTimer(0)<TURN_TIME){//TURN_TIMEの時間回り続ける if (SENSOR_2>lmax_1){ lmax_1=SENSOR_2;//lmax_1にSENSOR_2の値を代入 tmax_1=FastTimer(0);//tmax_1にFastTimer(0)の値を代入 Wait(10); }else if (lmax_1-15>SENSOR_2 & tmax_2==0){//lmax_1よりSENSOR_2の値が大幅に小さくなるとき tmax_2=tmax_1;//tmax_2にtmax_1の値を代入 lmax_1=0;//lmax_1を0にする } } PlaySound(SOUND_DOWN) ;//音を鳴らす Off(OUT_A+OUT_C);//回り終わる Wait(50); OnRev(OUT_A);//回り始める OnFwd(OUT_C); Wait(400-tmax_1);//二回目に見つけた明るい光源の方向を向く Off(OUT_A+OUT_C);//止まる start shot;//shotのタスクを動かし始める Wait(500);//撃つまで待つ //撃つ PlaySound(SOUND_UP) ; //音を鳴らす OnRev(OUT_A);//回り始める OnFwd(OUT_C); Wait(tmax_1-tmax_2);//初めに見つけた明るい光源の方向を向く Off(OUT_A+OUT_C);//撃つまで待つ //撃つ Wait(50); PlaySound(SOUND_FAST_UP) ;//音を鳴らす Wait(30);//待つ PlaySound(SOUND_LOW_BEEP) ; //音を鳴らす } task shot(){ OnRev(OUT_B);//撃つ動作を始める Wait(SHOT_TIME); Off(OUT_B); Wait(20); OnRev(OUT_B); Wait(SHOT_TIME); Off(OUT_B);//撃つ動作終了 }
// 定数定義 #define TURN_ONCE 430 // 1回転する時間 #define SHOT_TIME 1480 // ホイールを発射し、次発射する準備までの時間 #define THRESHOLD 45 // この値だけ暗くなったら回転方向を変える // 変数宣言 int max_bright; // 最大の明るさ int mb_count; // 最大の明るさの時間 int turn_direction; // 回転方向 int shot_count; // ホイールを投げた回数 task main() { SetSensor(SENSOR_1, SENSOR_TOUCH); SetSensor(SENSOR_2, SENSOR_LIGHT); SetSensor(SENSOR_3, SENSOR_TOUCH); // 懐中電灯の方向を探す max_bright = 0; mb_count = 0; ClearTimer(0); while(FastTimer(0)<TURN_ONCE) { OnFwd(OUT_A); OnRev(OUT_C); if(max_bright < SENSOR_2) { max_bright = SENSOR_2; mb_count = FastTimer(0); } } Off(OUT_A+OUT_C); // 懐中電灯の方向を向く ClearTimer(0); while(FastTimer(0)<TURN_ONCE-mb_count) { OnRev(OUT_A); OnFwd(OUT_C); } Off(OUT_A+OUT_C); // 懐中電灯の方向を追いかける SetSensorMode(SENSOR_2, SENSOR_MODE_RAW); turn_direction = 0; // 始めは右回転 max_bright = 0; shot_count = 0; // ホイール発射回数リセット ClearTimer(0); while(shot_count <= 1) { if(turn_direction == 0) { // turn_directionが0のとき、右回転 OnFwd(OUT_A); Float(OUT_C); if(max_bright < SENSOR_2) { // 明るくなったら最大値変更 max_bright = SENSOR_2; } else if(max_bright-THRESHOLD > SENSOR_2) { // 暗くなったら回転方向逆転 max_bright = SENSOR_2; turn_direction = 1; // turn_directionを1にする ClearTimer(0); } } else if(turn_direction == 1) { // turn_directionが1のとき、左回転 Float(OUT_A); OnFwd(OUT_C); if(max_bright < SENSOR_2) { // 明るくなったら最大値変更 max_bright = SENSOR_2; } else if(max_bright-THRESHOLD > SENSOR_2) { // 暗くなったら回転方向逆転 max_bright = SENSOR_2; turn_direction = 0; // turn_directionを0にする ClearTimer(0); } } if(FastTimer(0) > 500) { // 5秒以上一定以上の明るさの場合は停止し発射 Off(OUT_A+OUT_C); // 停止 start shot; // ホイール発射 shot_count++; // ホイール発射回数増加 Wait(500); ClearTimer(0); Wait(10); } } } task shot() { // 発射のタスク OnRev(OUT_B); Wait(SHOT_TIME); Off(OUT_B); }