*課題内容 [#wcd30cdd] **ボール回収シュートロボット [#f14814a0] ***重要項目 [#c6ed76ee] ・ライントレース ・黒ラインの交差点を確認する ・ボール(ピンポン球)の回収、排出 ***主なプログラミング内容 [#n628e256] 課題フィールドのA(スタート地点)からC(ゴール枠)に行く。 途中でボールを回収しシュートする。 ボール位置は辺PQ間の折り目のところ。 ***微調整すべき項目 [#v7a4af08] ・黒の値 ・nMAX値 ・THRESHOLDの+値(旋回と右左折の判断値幅) ・方向微調整 *ロボット外観 [#t490a7b6] **全体 [#c23b5251] **ボール回収機構 [#d4f11142] *プログラミング [#taed3917] **定数について [#ee717ec2] 前進マクロ #define go_a OnFwd(OUT_AC);Wait(60);Off(OUT_AC); //前進 #define go_b OnFwd(OUT_AC);Wait(80);Off(OUT_AC); //前進 通常のカーブとして許容できる繰り返しの最大値 #define nMAX 7 一回の判断で動作させる時間(0.01秒) #define STEP 1 黒の値 #define THRESHOLD 32 パワー調整 #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); //右旋回 **メイン函数 [#r6bf1c9b] task main() { SetSensor(SENSOR_2, SENSOR_LIGHT); int nOnline=0; //続けて黒になった回数をカウント Off(OUT_AC);PlaySound(SOUND_UP);Wait(100); //スタート合図 ↑モーターにかかったままのエネルギーをリセットするために以下同様動作ごとにOffをかける。 その時に確認音を鳴らして行く。 OnRev(OUT_B);Wait(25);Off(OUT_B); //アームを開く go_a; //最初のライン越え AからT字路、十字路までライントレースを開始する 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); } Off(OUT_AC); ↑ライトセンサでの白と黒とその間の判別を32〜51の間で見て進み方を変えることでスムーズなライントレースが可能になる 左旋回の時に曲がっても黒である状態をカウントし、それが多くなったところで交差点を認識する。それ以外の進みをする時はカウンターをリセットする OnFwd(OUT_B);Wait(25);Off(OUT_B); //アームを閉じてボールをホールド Off(OUT_AC);PlaySound(SOUND_CLICK);Wait(200); //交差点で2秒小休止 OnFwd(OUT_A);OnRev(OUT_C);Wait(40); //進行方向修正 OnFwd(OUT_AC);Wait(70); Off(OUT_AC);PlaySound(SOUND_CLICK);Wait(50); //小休止 nOnline=0; //カウンタをリセット 次のライントレースは前と逆向きに走る。 ヘアピンカーブの内側をライントレースするとそれが交差点と誤って認識してしまうからである。 while(nOnline < nMAX) //逆方向のライントレース { 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); } Off(OUT_AC);PlaySound(SOUND_CLICK);Wait(100); //ゴール前の線で小休止 ゴールにボールをシュートするための操作を行う。 進行方向を修正し OnRev(OUT_AC);Wait(50); OnFwd(OUT_C);OnRev(OUT_A);Wait(30); Off(OUT_AC);PlaySound(SOUND_CLICK);Wait(50); アームを開き OnRev(OUT_B);Wait(25);Off(OUT_B); 押し出すようにしてボールをシュート go_b; OnFwd(OUT_B);Wait(25);Off(OUT_B); //アームを閉じる PlaySound(SOUND_DOWN); //終了確認音 }