- 追加された行はこの色です。
- 削除された行はこの色です。
[[2014a/MemberOnly/進行状況]]
目次
#contents
* 課題の説明 [#a26960c6]
図のようなコースを各自で作成した上で、次のような動作をするロボットを作成せよ。 (下の図において、黒い線の太さは20mmで、線の中央までの距離がcm表示されている)。
1.スタート地点から出発し、黒い線をトレースしていく。
2.一つ目の十字の交差点と二つめの十字の交差点の間に置かれたピンポン玉をつかむ。
3.さらに黒線をトレースしていきゴール地点を目指す。
4.ゴールに向けてピンポン玉をシュートする。
ただしT字路では、直進、右折、左折を正しく判断させること。また二人または三人一組で同じロボットを使用し、互いにスタート地点とゴール地点を入れ替えること。ロボット本体は共通のものを使うとする。
さらに以下のような動作に挑戦することが望ましい。
•ゴールエリア外からピンポン玉をシュートする。
•曲線部中央の障害物に接触しないようにすること
#ref(
* ロボット本体 [#xf1a24b1]
** ドライブベース [#ucd7af01]
私たちが使用したロボットは、八の字のライントレースをしたときに使った4輪の基本的な形をしたロボットです。アームを取り付けることが初期のままだと困難だったので、光センサーを本体に近づけて設置しました。本体に近づけたことでトレースの誤差を小さくできているとおもいます。
** アーム [#afe90714]
ピンポン玉をつかむアームの動かし方は2012年後期に受講をしていた、KARINAさんtada0さんのものを参考にさせていただきました。
モーターを一つ追加してロボット上部にあるギザギザのついている棒状のパーツを前後に動かすことによってロボット前方のアームを上下させる構造になっています。
* プログラム [#af3f957e]
#define ikichi 45 //域値を指定
#define HIPOWER 7 //モーターの強さを強へ
#define LOWPOWER 2 //モーターの強さを弱へ
#define set_power_H SetPower(OUT_AC,HIPOWER); //モーターを強へ設定
#define set_power_L SetPower(OUT_AC,LOWPOWER); //モーターを弱へ設定
#define go set_power_H;OnFwd(OUT_AC); //直進
#define t_l_hp set_power_L;OnRev(OUT_A);OnFwd(OUT_C); //左旋回
#define t_l_lp set_power_L;Off(OUT_A);OnFwd(OUT_C); //左折
#define t_r_hp set_power_L;OnFwd(OUT_A);OnRev(OUT_C); //右旋回
#define t_r_lp set_power_L;OnFwd(OUT_A);Off(OUT_C); //右折
#define step 1 //動作の間隔
#define t_1 700 //A-B間のおおよその時間
#define t_2 800 //C-D間のおおよその時間
#define t_3 700 //E-F間のおおよその時間
#define balltime 50 //ボールを挟むためのアームを動かす時間
#define p_1 PlaySound(SOUND_CLICK); //ピッと音を鳴らす
#define p_2 PlaySound(SOUND_UP); //ピロピロと音を鳴らす
int n=0; //濃い黒の連続感知回数の初期値を0とする
task main()
{
SetSensor(SENSOR_2,SENSOR_LIGHT); //センサーの2番に光センサーを設置
OnFwd(OUT_AC); //ボールを掴むため前進しながらアームを閉じる
Wait(40);
OnRev(OUT_B);
Wait(30);
Off(OUT_B);
Wait(20);
ClearTimer(0); //点Aを基準とするためタイマー0をリセット
while(FastTimer(0)<t_1){ //タイマー0が所定の時間までの間繰り返す
if (SENSOR_2 < ikichi -5){t_l_hp} //濃い黒なら左旋回
else if (SENSOR_2 < ikichi -2){t_l_lp} //薄い黒なら左折
else if (SENSOR_2 < ikichi +2){go} //灰色なら直進
else if (SENSOR_2 < ikichi +5){t_r_lp} //薄い白なら右折
else {t_r_hp} //その他なら右旋回
Wait(step); //動作に間隔を設ける
}
do{ //n<3の間以下の動作を繰り返す
if (SENSOR_2 < ikichi -5){t_l_hp;n +=1;p_1;} //濃い黒なら左旋回&nに1を加える&音をピっと鳴らす
else if (SENSOR_2 < ikichi -2){t_l_lp;int n=0;} //薄い黒なら左折&nに0を代入
else if (SENSOR_2 < ikichi +2){go;int n=0;} //灰色なら直進&nに0を代入
else if (SENSOR_2 < ikichi +5){t_r_lp;int n=0;} //薄い白なら右折&nに0を代入
else {t_r_hp;int n=0;} //その他なら右旋回&nに0を代入
Wait(step); //動作に間隔を設ける
}while(n<3);
OnFwd(OUT_A); //Xラインを越えるため向きを修正し、前進する
Wait(10);
OnFwd(OUT_AC);
Wait(20);
p_2; //ピロピロと音を鳴らす
ClearTimer(0); //Xラインを越えた後、タイマー0を初期化
while(FastTimer(0)<t_2){ //タイマー0が所定の時間までの間繰り返す
if (SENSOR_2 < ikichi -5){t_l_hp} //濃い黒なら左旋回
else if (SENSOR_2 < ikichi -2){t_l_lp} //薄い黒なら左折
else if (SENSOR_2 < ikichi +2){go} //灰色なら直進
else if (SENSOR_2 < ikichi +5){t_r_lp} //薄い白なら右折
else {t_r_hp} //その他なら右旋回
Wait(step); //動作に間隔を設ける
}
n==0; //nに0を代入
do{ //n<3の間以下の動作を繰り返す
if (SENSOR_2 < ikichi -5){t_l_hp;n +=1;p_1;} //濃い黒なら左旋回&nに1を加える&音をピっと鳴らす
else if (SENSOR_2 < ikichi -2){t_l_lp;int n=0;} //薄い黒なら左折&nに0を代入
else if (SENSOR_2 < ikichi +2){go;int n=0;} //灰色なら直進&nに0を代入
else if (SENSOR_2 < ikichi +5){t_r_lp;int n=0;} //薄い白なら右折&nに0を代入
else {t_r_hp;int n=0;} //その他なら右旋回&nに0を代入
Wait(step); //動作に間隔を設ける
}while(n<3);
p_2; //ピロピロと音を鳴らす
ClearTimer(0); //タイマー0を初期化
while(FastTimer(0)<t_3){t_l_hp} //濃い黒なら左旋回
else if (SENSOR_2 < ikichi -2){t_l_lp} //薄い黒なら左折
else if (SENSOR_2 < ikichi +2){go} //灰色なら直進
else if (SENSOR_2 < ikichi +5){t_r_lp} //薄い白なら右折
else {t_r_hp} //その他なら右旋回
Wait(step); //動作に間隔を設ける
}
n==0; //nに0を代入
do{ //n<5の間以下の動作を繰り返す
if (SENSOR_2 < ikichi -5){t_l_hp;n +=1;p_1;} //濃い黒なら左旋回&nに1を加える&音をピっと鳴らす
else if (SENSOR_2 < ikichi -2){t_l_lp;int n=0;} //薄い黒なら左折&nに0を代入
else if (SENSOR_2 < ikichi +2){go;int n=0;} //灰色なら直進&nに0を代入
else if (SENSOR_2 < ikichi +5){t_r_lp;int n=0;} //薄い白なら右折&nに0を代入
else {t_r_hp;int n=0;} //その他なら右旋回&nに0を代入
Wait(step); //動作に間隔を設ける
}while(n<5);
t_r_hp; //ゴールの方向を向かせる
Wait(10);
p_2; //ピロピロと音を鳴らす
Off(OUT_AC);
Wait(100);
OnRev(OUT_AC); //ボール掴みながら下がる
Wait(130);
SetPower(OUT_ABC,9); //勢いをつけるため、モーターの力を強くする
OnFwd(OUT_ABC); //前進しながらアームをあげる
Wait(30);
Off(OUT_B); //アームのみ停止
Wait(80);
Off(OUT_AC); //すべての動作を停止
}