[[戻る>2013b/Member]] #contents *課題 [#f8d8effa] 自作したコース(下図)に沿って一周するロボットを作成せよ。 -次のステップでプログラムを作成すること。 交差点をきちんと認識し、正しく判断して通過できるようにする。 --確実に一周できるようにする。スタート地点から出発して元にもどるようにする。 --空き缶を交差点から10cm以上離した線上に起き、それを一旦どけて再び元の位置にもどすように改良する。 --1個の空き缶でうまくいったら、2個の空き缶でやってみる。 ~(下図は、授業で示された松本先生画のコース図)&br; #ref(zu.jpg)&br; 筆者は反時計回りを担当した。 *ロボット [#r5a0698c] -ドライブベースを小型化した。 -光センサーをより駆動部に近づけた。 -車輪を2つに減らした。 ~→小回りがきくようになった。&br; -支えとして、車輪ではなく底の丸いパーツを使用した。 ~→可動部を減らし、故障しうる箇所を減らした。&br;&br;(ドライブベースの写真) #ref(image_1.jpeg) #ref(image_2.jpeg) (ロボットの写真) #ref(image.jpeg) *プログラム [#s5e6edef] #define THRESHOLD 45 //ライントレースの閾値 #define set_H SetPower(OUT_AC,7); //直進用速度 #define set_L SetPower(OUT_AC,1); //カーブ用速度 #define turn_l1 set_L;OnFwd(OUT_C);OnRev(OUT_A); //反時計回り旋回 #define turn_l0 set_L;OnFwd(OUT_C);Off(OUT_A); //反時計回り移動 #define turn_r0 set_L;OnFwd(OUT_A);Off(OUT_C); //時計回り移動 #define turn_r1 set_L;OnFwd(OUT_A);OnRev(OUT_C); //時計回り旋回 #define go_fwd set_H;OnFwd(OUT_AC); //前進 #define STEP 1 //ライントレースの各動作時間 #define C1 1300 //1つ目の交差点までの時間(仮) #define C2 2100 //2つ目の交差点までの時間(仮) #define C3 2900 //3つ目の交差点までの時間(仮) #define TROAD_G 5150 //ゴール探索を始めるまでの時間(仮) #define TURN_T 72 //90°回転するにあたっての所要時間 task main() { SetSensor(SENSOR_1,SENSOR_TOUCH); //センサー定義 SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); //タイマーリセット・スタート int n=0; //カウンタ定義 go_fwd;until(SENSOR_2>=THRESHOLD+10);PlaySound(2);Wait(5);Off(OUT_AC); //スタート直後の交差点を超えるまで前進 turn_r0;until(SENSOR_2<=THRESHOLD-5);PlaySound(2);Off(OUT_AC); //黒いところを感知するまで時計回り移動 turn_r0;until(SENSOR_2>=THRESHOLD+10);PlaySound(2);Off(OUT_AC); //もう一度白いところを感知するまで移動を続ける turn_l0;until(SENSOR_2<=THRESHOLD+5);PlaySound(2);Off(OUT_AC); //ラインの境界まで反時計回り回転 while(n==0){ //ゴールを感知するまで if(FastTimer(0)==C1){go_fwd;Wait(50);} //交差点を通る時間になったら直進 if(FastTimer(0)==C2){go_fwd;Wait(50);} if(FastTimer(0)==C3){go_fwd;Wait(50);} if(FastTimer(0)>TROAD_G&&SENSOR_2<THRESHOLD-1){ //ゴール前の直線部に入る時間になったらゴール探索,ラインから外れたら通常のライントレースに戻す PlaySound(2);turn_r1;Wait(TURN_T);Off(OUT_AC); //90°回転 if(SENSOR_2<THRESHOLD-3){PlaySound(3);go_fwd;Wait(100);n++;} //ゴールを発見したら向きを変えずに直進し、停止用のカウンタに+1 else{turn_l1;Wait(TURN_T);Off(OUT_AC);go_fwd;Wait(10);} //ゴールを発見できなければ元の向きに戻って探索を続行 } else{ //ライントレース if(SENSOR_2<THRESHOLD-7){turn_l1;} //黒い部分を感知したら反時計回り旋回 else if(SENSOR_2<THRESHOLD-5){turn_l0;} //黒寄りの境界を感知したら反時計回り移動 else if(SENSOR_2<THRESHOLD+3){go_fwd;} //境界を探知したら直進 else if(SENSOR_2<THRESHOLD+5){turn_r0;} //白寄りの境界を感知したら時計回り移動 else{turn_r1;} //白い部分を感知したら時計回り旋回 Wait(STEP); //決定した動作を10ミリ秒間行う } } while(n>0){Off(OUT_AC);} //カウンタが0でなくなったら停止する } *反省点 [#s5f73126] -プログラム制作の所要時間を甘く見積もりすぎた結果、プログラムが完成しなかった。 --交差点を判別するプログラムが出来ず、時間による判定となってしまった。 --缶を移動するプログラムが出来なかった。