[[2017a/Member]] #contents * 課題について [#sb2532c9] 詳しくは[[課題2>2017a/Mission2]]を参照。コースは、E地点直進コース。 * ロボットの説明 [#z1957ffa] &ref(2017a/Member/koki/Mission2/robo11.jpg,50%,全体); &ref(2017a/Member/koki/Mission2/robo14.jpg,50%,全体); 今回は出来るだけコンパクトにするために、タイヤを2つだけにした。このおかげで、細かい動きが出来るようになった。また、旋回もしやすくなったので、きついペアピンも問題なく曲がる事が出来た。光センサを出来るだけ地面に近くなるように工夫した。タイヤと光センサとの距離が、近すぎても遠すぎてもうまく行かなかったので、ちょうど良い設置位置を見つけるのに苦労した。 &ref(2017a/Member/koki/Mission2/robo10.jpg,50%,全体); &ref(2017a/Member/koki/Mission2/robo15.jpg,50%,全体); 後輪を外した代わりに、後ろの部分に支柱を付けた。なめらかに動かすために、支柱の下部に半球の部品を付けた。 * プログラムの説明 [#ocaf9c58] ** マクロ [#vb3162a2] マクロは以下のように定義した。 #define THRESHOLD 42 //直角用 #define HIPOWER 7 #define LOWPOWER 1 #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 l1 set_power_L;OnFwd(OUT_C); OnRev(OUT_A);//左旋回 #define l0 set_power_L;OnFwd(OUT_C); Off(OUT_A);//左折 #define r0 set_power_L;OnFwd(OUT_A); Off(OUT_C);//右折 #define r1 set_power_L;OnFwd(OUT_A); OnRev(OUT_C);//右旋回 //その他用 #define r3 Off(OUT_AC);Wait(1);OnFwd(OUT_A);OnRev(OUT_C);//右旋回 #define r2 Off(OUT_AC);Wait(1);OnFwd(OUT_A);//右折 #define l3 Off(OUT_AC);Wait(1);OnFwd(OUT_C);OnRev(OUT_A);//左旋回 #define l2 Off(OUT_AC);Wait(1);OnFwd(OUT_C);//左折 #define teisi Off(OUT_AC);PlaySound(SOUND_DOWN);Wait(100);//一時停止 光センサのしきい値は42とした。直角用のマクロは、曲がりやすくするために速度を落とした。ほかの部分のマクロは、一回ごとに動きを止めることにより、無駄な動きを出来るだけ減らした。 ** サブルーチン [#q57cb944] サブルーチンは以下のように定義した。 sub AEF_FQ_QR_SG_TH_RS_PE_EA(){int a=0; //AEF_FQ_QR_SG_TH_RS_PE_EA間 while(a < 20){ if (SENSOR_2 > THRESHOLD +7) { //白なら右旋回 r3; } else if (SENSOR_2 > THRESHOLD +3) {//白っぽいなら右折 r2; } else if (SENSOR_2 > THRESHOLD -3) {//灰色なら直進 go; } else if(SENSOR_2 > THRESHOLD -7) {//黒っぽいなら左折 l2; } else{ //黒なら左旋回 l3; a++; } Off(OUT_AC); }} sub F_Q_S_G_H_R_E(){ //センサが白を識別するまで左旋回 while(SENSOR_2 < THRESHOLD ){ l1; }} sub R_T_S(){ //交差点直進 while(SENSOR_2 < THRESHOLD ){ go; } int c=0; while(c < 20){ if (SENSOR_2 > THRESHOLD +7) { r3; } else if (SENSOR_2 > THRESHOLD +3) { r2; } else if (SENSOR_2 > THRESHOLD -3) { go; } else if(SENSOR_2 > THRESHOLD -7) { l2; } else{ l3; c++; } Off(OUT_AC); } while(SENSOR_2 < THRESHOLD ){ l1; }} sub RS_SP_TT_TR(){int d=0; //RS_SP_TT_TR間 while(d < 4){ if (SENSOR_2 > THRESHOLD +7) { r3; } else if (SENSOR_2 > THRESHOLD +3) { r2; } else { go; d++; } Off(OUT_AC); }} sub GH(){int f=0; //きついペアピン while(f < 270){ if (SENSOR_2 > THRESHOLD +7) { r1; } else if (SENSOR_2 > THRESHOLD +3) { r0; } else if (SENSOR_2 > THRESHOLD -3) { go; } else if(SENSOR_2 > THRESHOLD -7) { l0; } else{ l1; f++; } Off(OUT_AC); }} sub A(){ //A内進入 while(SENSOR_2 < THRESHOLD ){ go; } Off(OUT_AC); } このプログラムは、ロボットがラインの左側をなぞるように組み立てた。サブルーチンにも書いてあるようにコースをいくつかのゾーンに分けて組み立てた。センサの識別は5段階に分けたおかげで、綺麗に線をなぞることが出来た。特に難しかったところは、RS_SP_TT_TR間であり、交差点進入時に車体が線に対して少し斜めっているため、そこの部分は黒の識別のカウンタを減らして対応した。交差点の識別は、コースを分けたおかげで意外とスムーズに出来た。 ** メインプログラム [#vd8a52b3] task main() { SetSensor(SENSOR_2,SENSOR_LIGHT); AEF_FQ_QR_SG_TH_RS_PE_EA(); PlaySound(SOUND_UP); //F F_Q_S_G_H_R_E(); AEF_FQ_QR_SG_TH_RS_PE_EA(); teisi; //Q F_Q_S_G_H_R_E(); AEF_FQ_QR_SG_TH_RS_PE_EA(); PlaySound(SOUND_UP); //R R_T_S(); RS_SP_TT_TR(); PlaySound(SOUND_UP); //S F_Q_S_G_H_R_E(); AEF_FQ_QR_SG_TH_RS_PE_EA(); PlaySound(SOUND_UP); //G F_Q_S_G_H_R_E(); GH(); PlaySound(SOUND_UP); //H F_Q_S_G_H_R_E(); AEF_FQ_QR_SG_TH_RS_PE_EA(); teisi; //T R_T_S(); RS_SP_TT_TR(); teisi; //T R_T_S(); RS_SP_TT_TR(); teisi; //R F_Q_S_G_H_R_E(); AEF_FQ_QR_SG_TH_RS_PE_EA(); PlaySound(SOUND_UP); //S R_T_S(); RS_SP_TT_TR(); PlaySound(SOUND_UP); //P AEF_FQ_QR_SG_TH_RS_PE_EA(); teisi; //E F_Q_S_G_H_R_E(); AEF_FQ_QR_SG_TH_RS_PE_EA(); A(); PlaySound(SOUND_DOWN); //A } マクロとサブルーチンを活用したおかげで、メインプログラムは簡潔にすることが出来た。このプログラムはタイマなどを使用していなく、また、旋回時にもわざと速度を落としているので、電池の電圧低下の影響をほぼ受けないようにすることに成功した。 *反省と感想 [#a0d37a19] ロボットについては、初期の四輪駆動から二輪車の二輪駆動にしたおかげで、動きをなめらかにすることが出来たのでうれしかった。それと同時に四輪駆動では、ペアピンは難しいということが実感できた。プログラムについては、はじめはサブルーチンを使わないでプログラムを作っていたので途中で挫折した。その後、サブルーチンを使ったら、あっさり完成し、簡潔にまとめることに成功したので驚いた。今回の課題で、サブルーチンの素晴らしさをとても感じることが出来た。この課題が出来たときの達成感はとても気持ちよかったので、この調子で次の課題もサブルーチンを上手に活用して頑張りたい。