2012b/Member
目次
※2012年度後期/課題ページの図を使いました。
図のようなコースを各自で作成した上で、次のような動作をするロボットを作成せよ。
ピンポン玉をつかむ機構。 モーターの動力をゴムで歯車に伝えそれに応じて動く、という簡単な機構。
次は車体の後ろにある補助輪。 滑らかに曲がるためには地味に重要なパーツ。
パッと見てどうなっているかわからないので
これを、
ブロックの上の部分が360度回転するので平面内なら自由自在に移動できる。
最後に横からの写真
両側から本体を固定し、安定度を増した。
#define THRESHOLD 42 //しきい値、調節してこの値になった #define HIPOWER 7 //直線用のパワー #define LOWPOWER 2 //カーブ用のパワー #define set_power_H SetPower(OUT_AC,HIPOWER); //直線用のパワーをモーターにセット #define set_power_L SetPower(OUT_AC,LOWPOWER); //カーブ用のパワーをセット #define go_forward set_power_H; OnFwd(OUT_AC); //直進 #define turn_left1 set_power_L; OnRev(OUT_A); OnFwd(OUT_C); //左旋回 #define turn_left0 set_power_L; Off(OUT_A); OnFwd(OUT_C); //左折 #define turn_right0 set_power_L; OnFwd(OUT_A); Off(OUT_C); //右折 #define turn_right1 set_power_L; OnFwd(OUT_A); OnRev(OUT_C); //右旋回 #define STEP 1 //1回の判断で動作させる時間(これは1/100秒) #define n0MAX 15 //通常のカーブとして許容できる繰り返しの最大値 #define n1AMAX 2 //コース前半の急なカーブと判断される回数 #define n1BMAX 4 //コース後半の急なカーブと判断される回数 #define short_break Off(OUT_AC); Wait(100); //小休止 #define CROSS_TIME 20 //交差点を渡る時間 /* 交差点を渡る */ #define cross_line set_power_L; OnFwd(OUT_AC); Wait(CROSS_TIME); short_break; /* ピンポン玉をつかむ */ #define catch_ball set_power_L; Wait(300); OnRev(OUT_B);\ Wait(50); Off(OUT_B);OnFwd(OUT_AC); Wait(100); OnFwd(OUT_B);\ Wait(50); Off(OUT_B); OnRev(OUT_AC); Wait(20); Off(OUT_AC); Wait(100); /* ピンポン玉をゴールにねじ込む */ #define kick_ball OnFwd(OUT_AC); OnRev(OUT_B);\ Wait(150); Off(OUT_B); OnRev(OUT_AC); Wait(150); Off(OUT_AC); #define first_time 400 //交差点を認識する時間 task main() { SetSensor(SENSOR_2, SENSOR_LIGHT); //光センサーをセット int n0nline=0; //続けて黒になった回数(カウンタ) int n1nline=0; //急カーブの回数 catch_ball; while(n1nline < n1AMAX) //急なカーブが2回あるまで{}の中を繰り返す(n1AMAXは2なので) { while(n0nline < n0MAX) //急なカーブがあるまで繰り返す { if (SENSOR_2 < THRESHOLD -4){ turn_left1; n0nline++;} //より暗いとき左旋回してカウンタを1増やす else if (SENSOR_2 < THRESHOLD -2){ turn_left0; } //暗いとき左折 else if (SENSOR_2 < THRESHOLD +2){ go_forward; } //中間のとき直進 else if (SENSOR_2 < THRESHOLD +4){ turn_right0; } //明るいとき右折 else { turn_right1; } //より明るいとき右旋回 Wait(STEP); } PlaySound(SOUND_UP); //急なカーブの度に高い音を1回鳴らす n0nline=0; //カウンタをリセット n1nline++; //急なカーブの数をカウント } n1nline=0; ClearTimer(0); //タイマーをリセットして開始 while(FastTimer(0) <= first_time) //交差点を渡りきるまで繰り返す { while(n0nline < n0MAX) { if (SENSOR_2 < THRESHOLD -4){ turn_left1; n0nline++; } else if (SENSOR_2 < THRESHOLD -2){ turn_left0; } else if (SENSOR_2 < THRESHOLD +2){ go_forward; } else if (SENSOR_2 < THRESHOLD +4){ turn_right0; } else { turn_right1; } Wait(STEP); } short_break; //小休止 turn_right1; Wait(n0MAX*STEP); //進行方向修正 cross_line; //交差点を渡る n0nline=0; //カウンタをリセット } n0nline=0; while((FastTimer(0) > first_time)&&(n1nline <n1BMAX)) //急なカーブが4回あるまで(最後のT字路を含む)繰り返す { while(n0nline < n0MAX) { if (SENSOR_2 < THRESHOLD -4){ turn_left1; n0nline++; } else if (SENSOR_2 < THRESHOLD -2){ turn_left0; } else if (SENSOR_2 < THRESHOLD +2){ go_forward; } else if (SENSOR_2 < THRESHOLD +4){ turn_right0; } else { turn_right1; } Wait(STEP); } n1nline++; n0nline=0; PlaySound(SOUND_DOWN); //急なカーブがある度に低い音を鳴らす } short_break; turn_right1; Wait(n0MAX*STEP); Off(OUT_AC); //方向転換 kick_ball; //シュート }