*課題2 [#d1ba60d2] #ref(./2019a-mission2.png,50%,コース) A地点を出発し、次のいずれかの経路を黒い線にそって動くロボットを作成する (他のメンバーとは別の経路になるようにする)。 A地点から出発 → B → C(直進) → D(一時停止の後、直進) → E → F → G(一時停止の後、右折) → H → I → J(右折) → K(左折) → L(ピンポン玉をつかむ) → K(直進) → M(一時停止) → シュート→ A地点に入る(ゴール) 私は上のコースを選んだ。 *プログラムについて [#o3817c79] #define gray 41 //灰色の値 #define turn_rightL OnFwd(OUT_A); OnRev(OUT_C); //右旋回 #define turn_leftL OnFwd(OUT_C); OnRev(OUT_A); //左旋回 #define go OnFwd(OUT_AC); //直進 #define turn_rightS OnFwd(OUT_A); Off(OUT_C); //右折 #define turn_leftS OnFwd(OUT_C); Off(OUT_A); //左折 動きの定義の部分。明るさは中間値を決めてそれに足し引きをしていく。 sub follow_line() { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); while(FastTimer(0)<24){ //時間が24以内の時にループする if (SENSOR_2 > gray +5){ //色が白の時右旋回 turn_rightL; ClearTimer(0); } else if (SENSOR_2 > gray +3){ //白灰の時右折 turn_rightS; ClearTimer(0); } else if (SENSOR_2 > gray){ //灰色の時直進 go; ClearTimer(0); } else if (SENSOR_2 > gray -2){ //黒灰の時左折 turn_leftS; ClearTimer(0); } else { turn_leftL //黒の時左旋回をして、ループを抜ける } } Off(OUT_AC); Wait(50); } 一番多用するライントレースのサブルーチン。 sub follow_lineB() { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); while(FastTimer(0)<24){ if (SENSOR_2 > gray +5){ turn_leftL; ClearTimer(0); } else if (SENSOR_2 > gray +3){ turn_leftS; ClearTimer(0); } else if (SENSOR_2 > gray){ go; ClearTimer(0); } else if (SENSOR_2 > gray -2){ turn_rightS; ClearTimer(0); } else { turn_rightL } } Off(OUT_AC); Wait(50); } 1つ目のライントレースのルーチンとは曲がる方向を逆にしたサブルーチン。もとのライントレースではうまく線を探すことができなかったため、主にGからJまでのサークルに沿って動くときに使っています。 sub follow_line1() { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); while(FastTimer(0)<20){ //1つ目のものよりも時間の条件を短くした if (SENSOR_2 > gray +6){ turn_rightL; ClearTimer(0); } else if (SENSOR_2 > gray +3){ turn_rightS; ClearTimer(0); } else if (SENSOR_2 > gray){ go; ClearTimer(0); } else if (SENSOR_2 > gray -2){ turn_leftS; ClearTimer(0); } else { turn_leftL } } Off(OUT_AC); Wait(50); } 円の部分の交差点を判別するためのサブルーチン。直角交差点よりも黒の時間が短くても判別するようにしている。 sub cross_line() { OnRev(OUT_C); Off(OUT_A); //傾いた車体を線と平行にする Wait(40); Off(OUT_C); OnFwd(OUT_AC); //線を越える Wait(50); Off(OUT_AC); } 交差点を越えるためのサブルーチン。 sub cross_line2() { OnRev(OUT_A); Off(OUT_C); Wait(40); Off(OUT_A); OnFwd(OUT_AC); Wait(50); Off(OUT_AC); } 円の中の交差点を越えるためのルーチン。元のものとは車体の角度の調整を逆にしている。 sub ball_tukamu() { OnRev(OUT_B); //アームを開く Wait(20); Off(OUT_B); OnFwd(OUT_AC); //車体を前進させてアーム内に玉を入れる Wait(70); Off(OUT_AC); OnFwd(OUT_B); //アームを閉じる Wait(20); Off(OUT_B); } 玉を掴む動き。 task main() { follow_line(); //AからDの手前まで移動 cross_line(); //Dの交差点を越える follow_line(); //DからFまで follow_line1(); //FからGまで OnRev(OUT_C); //ここから、Gを左折する部分 Wait(30); Off(OUT_C); turn_rightS; Wait(70); Off(OUT_A); //ここまで follow_lineB(); //GからHまで cross_line2(); //Hを越える follow_lineB(); //HからI cross_line2(); //Iを越える follow_lineB(); //IからKまで移動 turn_leftS; //ここから、Kを左折 Wait(70); Off(OUT_C); //ここまで ball_tukamu(); //玉を掴む follow_line(); //掴んでからMまで移動 cross_line(); //車体の向きを真っ直ぐにする OnRev(OUT_B); //アームを開く Wait(20); OnFwd(OUT_AC); //車体で玉を押してシュート Wait(30); Off(OUT_AC); } 動き全体のプログラム. **交差点の判断方法 [#h022c7a8] このロボットでは交差点に差し掛かった時に,線に沿って曲がろうとする.この時にセンサーが黒い線を認識する時間が,直線の時と比べて長くなる.この時間を1つの動作ごとに計り,黒い線を抜けるまでの時間がある値よりも大きいときにライントレースのループを抜けるようにしている.円形の交差点ではその時間が直線の交差点よりも短いため,条件の時間も少し短くしている. *ロボットについて [#x39489af] ロボット全体の写真.冊子に書いてあるものを少し改良して,車体の幅を狭くした.前方にはピンポン玉をつかむためのアームと光センサーを取り付けている. #ref(./image1.jpeg,50%,ロボット全体) アーム部分を拡大した画像.歯車を3つかみ合わせてモーターとの距離をとることで光センサーの邪魔をしないようにした.また,ある程度車体の向きがずれても玉をつかめるように支えを取り付けた. #ref(./image2.jpeg,50%,アーム部分) *まとめ [#ie3f8401] 時間の条件がなかなか丁度いいものにならず、意図しない場所で止まったり、止まってほしいところでとまらないということが何度もあり非常に苦労した。FからGに移動して止まらせることができず、その部分だけクリアすることができなかった。その問題を解決するためには、Fで一度止まって、時間の条件を短くしたルーチンに変更すれば良かったかもしれないと思った。また、ライントレース後の車体の向きによって次の動きがうまくいくときと、いかない時があった。