2014a/Member/suiden/Mission1
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
目次
#contents
* メンバー [#ibb85475]
kiyomizu : スタート→ゴールを担当
suiden : ゴール→スタートを担当
* 課題の内容 [#w222b816]
図のようなコースを各自で作成した上で、次のような動作をす...
+ スタート地点から出発し、黒い線にそって動く。
+ 一つ目の十字の交差点と二つめの十字の交差点の間に置かれ...
+ さらに黒線に沿って動いてゴール地点を目指す。
+ ゴールに向けてピンポン玉をシュートする。
ただしT字路では、直進、右折、左折を正しく判断させること。...
さらに以下のような動作に挑戦することが望ましい。
+ ゴールエリア外からピンポン玉をシュートする。
+ 曲線部中央の障害物に接触しないようにすること。
&ref(2014a-mission1.png);
* ロボットの紹介 [#qd0e48a4]
** ロボットの外観 [#e9cd888b]
&ref(robo2.jpg);
&ref(robo1.jpg);
&ref(robo3.jpg);
アームを上げた状態のロボット ...
** 光センサー・バンパー[#ld0a546a]
&ref(robo4.jpg);
中央にあるのが光センサーであり、ラインをトレースするとき...
両サイドにあるのがバンパーであり、より確実にボールを確保...
** アーム [#d4f186e7]
&ref(robo8.jpg);
&ref(robo9.jpg);
アームは輪のような構造になっており、モーターを回転させ、...
輪の中にボールが入れば、確実にゴールまで持っていきシュー...
しかし、輪の中にボールが入らないことがあったので、L字形の...
** ボールの捕り方・シュートの打ち方 [#s1fd127d]
&ref(robo5.jpg);
&ref(robo6.jpg);
&ref(robo7.jpg);
アームを下げてボールを捕る ...
* プログラムの内容 [#n91931a1]
&ref(2014a-mission1-kouryaku.png);
プログラムの内容を上図で示されたPartごとに分けて説明する。
** Part0:定義 [#c2c9cc66]
#define THRESHOLD 50 ...
#define turn_left0 OnFwd(OUT_B,30); ...
#define turn_left1 OnFwd(OUT_B,20);OnFwd(OUT_C,-20); ...
#define turn_right0 OnFwd(OUT_C,30); ...
#define turn_right1 OnFwd(OUT_C,20);OnFwd(OUT_B,-20); ...
#define STEP 1 ...
#define nMAX 250 ...
#define short_break Off(OUT_BC);Wait(1000); ...
#define cross_line OnFwd(OUT_BC,30);Wait(300);short_bre...
** Part1 [#u87a2841]
task main()
{
SetSensorLight(S1); // 光センサーをポート1に...
long t0 = CurrentTick(); // タイマー?を用意
int nOnline = 0; // ライン上に存在した回数...
int nPoint = 0; // 次のPartに移行するため...
OnFwd(OUT_BC,30); // 0.7秒間直進
Wait(700);
Part1は、スタートの枠内から出るためのプログラムである。
** Part2 [#q3248486]
while (CurrentTick() - t0 < 10000) { // 開始...
if (SENSOR_1 < THRESHOLD -10) { // 黒...
turn_left1;
} else {
if (SENSOR_1 < THRESHOLD -5) { // や...
turn_left0;
} else if (SENSOR_1 < THRESHOLD +2) { // 黒...
OnFwd(OUT_BC,30);
} else if (SENSOR_1 < THRESHOLD +15) { // や...
turn_right0;
} else { // 白...
turn_right1;
}
Wait(STEP); // 1/100...
}
}
Part2は、開始から10秒未満のとき、ラインの左側をトレースす...
** Part3 [#c5040110]
while (nPoint == 0) { // nPoin...
while (nOnline < nMAX){ // 交...
if (SENSOR_1 < THRESHOLD -10) { // ...
turn_left1;
nOnline++; //...
} else {
if (SENSOR_1 < THRESHOLD -5) { // ...
turn_left0;
} else if (SENSOR_1 < THRESHOLD +2) { // ...
OnFwd(OUT_BC,30);
} else if (SENSOR_1 < THRESHOLD +15) { // ...
turn_right0;
} else { // ...
turn_right1;
}
nOnline=0; // n...
}
Wait(STEP); // 1/100...
} // 交...
short_break; // ...
turn_right1; Wait(nMAX*STEP); // ...
cross_line; // ...
nOnline=0; // n...
nPoint++; // n...
}
Part3は、"nPoint=0"のとき(初期状態)、ラインの左側をトレー...
また、交差点を渡ったとき、nPointを+1してPart4に移行する。
** Part4 [#x2bdc966]
long t1 = CurrentTick(); // タイマ...
while (nPoint == 1) { // nPoint=...
if (CurrentTick() - t1 == 5000) { // 5秒経...
Off(OUT_BC); // ロ...
RotateMotor(OUT_A,85,210); // ア...
nPoint++; // nPo...
PlaySound(SOUND_UP); // 音...
} else {
if (SENSOR_1 < THRESHOLD -10) { // 黒い...
turn_left1;
} else if (SENSOR_1 < THRESHOLD -5) { // やや...
turn_left0;
} else if (SENSOR_1 < THRESHOLD +15) { // やや...
turn_right0;
} else { // 白い...
turn_right1;
}
Wait(STEP); // 1/1000...
}
}
Part4は、"nPoint=1"のとき、ラインの左側をトレースしつつ、...
タイマーを利用してボールを確保するために安定した動きが必...
また、ボールを確保したとき、nPointを+1してPart5に移行す...
** Part5 [#m89b5795]
while (nPoint == 2) { // nPoin...
while (nOnline < nMAX -100){ // 交...
if (SENSOR_1 < THRESHOLD -10) { // ...
turn_left1;
nOnline++; //...
} else {
if (SENSOR_1 < THRESHOLD -5) { // や...
turn_left0;
} else if (SENSOR_1 < THRESHOLD +2) { // 黒...
OnFwd(OUT_BC,30);
} else if (SENSOR_1 < THRESHOLD +15) { // や...
turn_right0;
} else { // 白...
turn_right1;
}
nOnline=0; // nOn...
}
Wait(STEP); // 1/100...
} // 交...
short_break; // ...
turn_right1; Wait(nMAX*STEP); // ...
cross_line; // ...
nOnline=0; // n...
nPoint++; // n...
}
Part5は、"nPoint=2"のとき、ラインの左側をトレースしつつ、...
中央の交差点を渡るとき、交差点ではなくカーブと誤認識して...
また、交差点を渡ったとき、nPointを+1してPart6に移行する。
** Part6 [#oa31f38f]
while (nPoint == 3) { // nPoin...
while (nOnline < nMAX){ // 交...
if (SENSOR_1 < THRESHOLD -10) { // ...
turn_left1;
nOnline++; //...
} else {
if (SENSOR_1 < THRESHOLD -5) { // ...
turn_left0;
} else if (SENSOR_1 < THRESHOLD +2) { // ...
OnFwd(OUT_BC,50);
} else if (SENSOR_1 < THRESHOLD +15) { // ...
turn_right0;
} else { // ...
turn_right1;
}
nOnline=0; // n...
}
Wait(STEP); // 1/100...
} // 交...
short_break; // ...
turn_left1; Wait(nMAX*STEP -50); // ...
cross_line; // ...
nOnline=0; // n...
nPoint++; // n...
}
Part6は、"nPoint=3"のとき、ラインの左側をトレースしつつ、...
上部の交差点を渡るとき、斜めに横断してしまいラインの右側...
また、交差点を渡ったとき、nPointを+1してPart7に移行する。
** Part7 [#ibc0bdc7]
while (nPoint == 4) { // nPoin...
while (nOnline < nMAX){ // 交...
if (SENSOR_1 < THRESHOLD -10) { // ...
turn_left1;
nOnline++; //...
} else {
if (SENSOR_1 < THRESHOLD -5) { // ...
turn_left0;
} else if (SENSOR_1 < THRESHOLD +2) { // ...
OnFwd(OUT_BC,30);
} else if (SENSOR_1 < THRESHOLD +15) { // ...
turn_right0;
} else { // ...
turn_right1;
}
nOnline=0; // n...
}
Wait(STEP); // 1/100...
} // 交...
short_break; // ...
turn_right1; Wait(nMAX*STEP +100); // ...
OnFwd(OUT_BC,-50); Wait(500); // 0...
nOnline=0; // n...
nPoint++; // n...
}
Part7は、"nPoint=4"のとき、ラインの左側をトレースするプロ...
ゴール前の直角カーブを交差点と認識するが、"cross_line"を...
また、nPointを+1してPart8に移行する。
** Part8 [#d79427ce]
while (nPoint == 5) { // nPoint=5のとき以下...
Off(OUT_BC); // ロボットを止める
RotateMotor(OUT_A,-100,90); // アームを上げる
PlaySound(SOUND_UP); // 音を鳴らす
Off(OUT_A); // アームを止める
nPoint++; // nPointに+1する(...
}
}
Part8は、"nPoint=5"のとき、アームを上げ、シュートを打つプ...
また、シュートを打った後、nPointを+1して"nPoint=6"にする...
** 実際のプログラム [#g3c01e9c]
理解しやすくするためにPartごとに区切って説明したが、実際...
また、次のことに注意が必要である。
+ 電池残量が100%のときを想定してプログラムを組んだため、...
+ しきい値が日や時間によって変わることがあるため、しきい...
* 感想・反省 [#y966b4ba]
ロボットは、試行錯誤を繰り返しただけあってベストに近いも...
プログラムは、成功率10割を目指す中で同じようなプログラム...
また、当初は超音波センサーを利用してボールを確保する予定...
最終的な成功率は、正確に数えて計算したわけではないが、8...
次の課題では、妥協することなく、ベストなプログラムを組め...
終了行:
目次
#contents
* メンバー [#ibb85475]
kiyomizu : スタート→ゴールを担当
suiden : ゴール→スタートを担当
* 課題の内容 [#w222b816]
図のようなコースを各自で作成した上で、次のような動作をす...
+ スタート地点から出発し、黒い線にそって動く。
+ 一つ目の十字の交差点と二つめの十字の交差点の間に置かれ...
+ さらに黒線に沿って動いてゴール地点を目指す。
+ ゴールに向けてピンポン玉をシュートする。
ただしT字路では、直進、右折、左折を正しく判断させること。...
さらに以下のような動作に挑戦することが望ましい。
+ ゴールエリア外からピンポン玉をシュートする。
+ 曲線部中央の障害物に接触しないようにすること。
&ref(2014a-mission1.png);
* ロボットの紹介 [#qd0e48a4]
** ロボットの外観 [#e9cd888b]
&ref(robo2.jpg);
&ref(robo1.jpg);
&ref(robo3.jpg);
アームを上げた状態のロボット ...
** 光センサー・バンパー[#ld0a546a]
&ref(robo4.jpg);
中央にあるのが光センサーであり、ラインをトレースするとき...
両サイドにあるのがバンパーであり、より確実にボールを確保...
** アーム [#d4f186e7]
&ref(robo8.jpg);
&ref(robo9.jpg);
アームは輪のような構造になっており、モーターを回転させ、...
輪の中にボールが入れば、確実にゴールまで持っていきシュー...
しかし、輪の中にボールが入らないことがあったので、L字形の...
** ボールの捕り方・シュートの打ち方 [#s1fd127d]
&ref(robo5.jpg);
&ref(robo6.jpg);
&ref(robo7.jpg);
アームを下げてボールを捕る ...
* プログラムの内容 [#n91931a1]
&ref(2014a-mission1-kouryaku.png);
プログラムの内容を上図で示されたPartごとに分けて説明する。
** Part0:定義 [#c2c9cc66]
#define THRESHOLD 50 ...
#define turn_left0 OnFwd(OUT_B,30); ...
#define turn_left1 OnFwd(OUT_B,20);OnFwd(OUT_C,-20); ...
#define turn_right0 OnFwd(OUT_C,30); ...
#define turn_right1 OnFwd(OUT_C,20);OnFwd(OUT_B,-20); ...
#define STEP 1 ...
#define nMAX 250 ...
#define short_break Off(OUT_BC);Wait(1000); ...
#define cross_line OnFwd(OUT_BC,30);Wait(300);short_bre...
** Part1 [#u87a2841]
task main()
{
SetSensorLight(S1); // 光センサーをポート1に...
long t0 = CurrentTick(); // タイマー?を用意
int nOnline = 0; // ライン上に存在した回数...
int nPoint = 0; // 次のPartに移行するため...
OnFwd(OUT_BC,30); // 0.7秒間直進
Wait(700);
Part1は、スタートの枠内から出るためのプログラムである。
** Part2 [#q3248486]
while (CurrentTick() - t0 < 10000) { // 開始...
if (SENSOR_1 < THRESHOLD -10) { // 黒...
turn_left1;
} else {
if (SENSOR_1 < THRESHOLD -5) { // や...
turn_left0;
} else if (SENSOR_1 < THRESHOLD +2) { // 黒...
OnFwd(OUT_BC,30);
} else if (SENSOR_1 < THRESHOLD +15) { // や...
turn_right0;
} else { // 白...
turn_right1;
}
Wait(STEP); // 1/100...
}
}
Part2は、開始から10秒未満のとき、ラインの左側をトレースす...
** Part3 [#c5040110]
while (nPoint == 0) { // nPoin...
while (nOnline < nMAX){ // 交...
if (SENSOR_1 < THRESHOLD -10) { // ...
turn_left1;
nOnline++; //...
} else {
if (SENSOR_1 < THRESHOLD -5) { // ...
turn_left0;
} else if (SENSOR_1 < THRESHOLD +2) { // ...
OnFwd(OUT_BC,30);
} else if (SENSOR_1 < THRESHOLD +15) { // ...
turn_right0;
} else { // ...
turn_right1;
}
nOnline=0; // n...
}
Wait(STEP); // 1/100...
} // 交...
short_break; // ...
turn_right1; Wait(nMAX*STEP); // ...
cross_line; // ...
nOnline=0; // n...
nPoint++; // n...
}
Part3は、"nPoint=0"のとき(初期状態)、ラインの左側をトレー...
また、交差点を渡ったとき、nPointを+1してPart4に移行する。
** Part4 [#x2bdc966]
long t1 = CurrentTick(); // タイマ...
while (nPoint == 1) { // nPoint=...
if (CurrentTick() - t1 == 5000) { // 5秒経...
Off(OUT_BC); // ロ...
RotateMotor(OUT_A,85,210); // ア...
nPoint++; // nPo...
PlaySound(SOUND_UP); // 音...
} else {
if (SENSOR_1 < THRESHOLD -10) { // 黒い...
turn_left1;
} else if (SENSOR_1 < THRESHOLD -5) { // やや...
turn_left0;
} else if (SENSOR_1 < THRESHOLD +15) { // やや...
turn_right0;
} else { // 白い...
turn_right1;
}
Wait(STEP); // 1/1000...
}
}
Part4は、"nPoint=1"のとき、ラインの左側をトレースしつつ、...
タイマーを利用してボールを確保するために安定した動きが必...
また、ボールを確保したとき、nPointを+1してPart5に移行す...
** Part5 [#m89b5795]
while (nPoint == 2) { // nPoin...
while (nOnline < nMAX -100){ // 交...
if (SENSOR_1 < THRESHOLD -10) { // ...
turn_left1;
nOnline++; //...
} else {
if (SENSOR_1 < THRESHOLD -5) { // や...
turn_left0;
} else if (SENSOR_1 < THRESHOLD +2) { // 黒...
OnFwd(OUT_BC,30);
} else if (SENSOR_1 < THRESHOLD +15) { // や...
turn_right0;
} else { // 白...
turn_right1;
}
nOnline=0; // nOn...
}
Wait(STEP); // 1/100...
} // 交...
short_break; // ...
turn_right1; Wait(nMAX*STEP); // ...
cross_line; // ...
nOnline=0; // n...
nPoint++; // n...
}
Part5は、"nPoint=2"のとき、ラインの左側をトレースしつつ、...
中央の交差点を渡るとき、交差点ではなくカーブと誤認識して...
また、交差点を渡ったとき、nPointを+1してPart6に移行する。
** Part6 [#oa31f38f]
while (nPoint == 3) { // nPoin...
while (nOnline < nMAX){ // 交...
if (SENSOR_1 < THRESHOLD -10) { // ...
turn_left1;
nOnline++; //...
} else {
if (SENSOR_1 < THRESHOLD -5) { // ...
turn_left0;
} else if (SENSOR_1 < THRESHOLD +2) { // ...
OnFwd(OUT_BC,50);
} else if (SENSOR_1 < THRESHOLD +15) { // ...
turn_right0;
} else { // ...
turn_right1;
}
nOnline=0; // n...
}
Wait(STEP); // 1/100...
} // 交...
short_break; // ...
turn_left1; Wait(nMAX*STEP -50); // ...
cross_line; // ...
nOnline=0; // n...
nPoint++; // n...
}
Part6は、"nPoint=3"のとき、ラインの左側をトレースしつつ、...
上部の交差点を渡るとき、斜めに横断してしまいラインの右側...
また、交差点を渡ったとき、nPointを+1してPart7に移行する。
** Part7 [#ibc0bdc7]
while (nPoint == 4) { // nPoin...
while (nOnline < nMAX){ // 交...
if (SENSOR_1 < THRESHOLD -10) { // ...
turn_left1;
nOnline++; //...
} else {
if (SENSOR_1 < THRESHOLD -5) { // ...
turn_left0;
} else if (SENSOR_1 < THRESHOLD +2) { // ...
OnFwd(OUT_BC,30);
} else if (SENSOR_1 < THRESHOLD +15) { // ...
turn_right0;
} else { // ...
turn_right1;
}
nOnline=0; // n...
}
Wait(STEP); // 1/100...
} // 交...
short_break; // ...
turn_right1; Wait(nMAX*STEP +100); // ...
OnFwd(OUT_BC,-50); Wait(500); // 0...
nOnline=0; // n...
nPoint++; // n...
}
Part7は、"nPoint=4"のとき、ラインの左側をトレースするプロ...
ゴール前の直角カーブを交差点と認識するが、"cross_line"を...
また、nPointを+1してPart8に移行する。
** Part8 [#d79427ce]
while (nPoint == 5) { // nPoint=5のとき以下...
Off(OUT_BC); // ロボットを止める
RotateMotor(OUT_A,-100,90); // アームを上げる
PlaySound(SOUND_UP); // 音を鳴らす
Off(OUT_A); // アームを止める
nPoint++; // nPointに+1する(...
}
}
Part8は、"nPoint=5"のとき、アームを上げ、シュートを打つプ...
また、シュートを打った後、nPointを+1して"nPoint=6"にする...
** 実際のプログラム [#g3c01e9c]
理解しやすくするためにPartごとに区切って説明したが、実際...
また、次のことに注意が必要である。
+ 電池残量が100%のときを想定してプログラムを組んだため、...
+ しきい値が日や時間によって変わることがあるため、しきい...
* 感想・反省 [#y966b4ba]
ロボットは、試行錯誤を繰り返しただけあってベストに近いも...
プログラムは、成功率10割を目指す中で同じようなプログラム...
また、当初は超音波センサーを利用してボールを確保する予定...
最終的な成功率は、正確に数えて計算したわけではないが、8...
次の課題では、妥協することなく、ベストなプログラムを組め...
ページ名: