[[2012b/Member]] #contents *メンバー紹介 [#r9752e52] -tada0 工学部機械システム工学科 -KARINA 工学部土木工学科 *課題の内容 [#ff0e762b] -スタート地点から出発し、スタート地点外のすぐ近くに置かれたピンポン玉をつかむ。 -ピンポン玉をつかんだら速やかにスタート地点の境界の黒線に戻り、そこから黒線に沿って動いてゴール地点を目指す。ただしT字路では、直進、右折、左折を正しく判断させること。また、曲線部中央の障害物に接触しないようにすること。 -ゴール地点に到達したら、ゴールエリア外からピンポン玉をゴールにシュートする。 ただし、どうしてもエリア外からのシュートが難しい場合は、エリア内からシュートした後、エリアから出てもよい。 &ref(2012b/Member/tada0/Mission1/2012b-mission1.png,80%,画像の説明); ※2012年度後期・課題 のページを引用 *ロボットの説明 [#f38573ec] #ref(2012b/Member/tada0/Mission1/robo-0.jpg,100,robo-0) これが私たちのロボットです 機動性、安定性の面からタイヤを三輪にしました アームの機構は至って簡単で、上下に開閉するアームでボールをはさみ運搬するだけです #ref(2012b/Member/tada0/Mission1/robo-1.jpg,100%,open) #ref(2012b/Member/tada0/Mission1/robo-2.jpg,100,close) 上図のように、モーターによって前後に運動する棒と連動してアームが開閉します *プログラムの説明 [#e81fa90b] &ref(2012b/Member/tada0/Mission1/time.png,80%,画像の説明); -ロボットはラインの左側をトレースするようにプログラムされています -A-B間Aを、C-D間はCを、E-F間はEをそれぞれ基準とし、ある一定時間の間ライントレース&前進のプログラムが組んであります -B-C間、D-E間、F-G間はカウンターを用いて、濃い黒を3回または5回連続で感知するとロボットは直角と識別し、次の行動へ移ります --A-B間、C-D間、E-F間はカーブを直角と認識しないようにカウンターを使っていません --F-G間において、直角以外で濃い黒を3回連続で感知する場所があったため、ここだけ5回連続で濃い黒を感知すると次のプログラムに移るようになっています --直角と認識するとピロピロと音が鳴り思いどうりの動作が行われているか分かりやすくしています #define ikichi 43 //域値を指定 #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); //すべての動作を停止 } *まとめ・感想 [#g303fd87] -ロボットの機体の構想はすぐできたが、プログラムがうまくいかず苦戦した -まだ誤動作を行うことがあるため完全とは言えないものになってしまった -今回いろいろ苦戦したことを次の課題に生かしていきたい