目次 #contents *課題の説明 [#fc9d48da] B地点をスタートしてQ付近の3/4円周上でピンポン玉をつかみ、そのピンポン玉をC地点においたゴールへシュートする (二人目) Bスタート → R直進 → P右折 → Q直進 → (ピンポン玉をキャッチ) → Q直進 → R右折 → P直進 → S右折 → Cへシュート ただし、 なるべく速く正確に動くロボットになるように工夫して、交差点では1秒間停止すること。 ピンポン玉はQ近くの3/4円周上ならどこにおいてもよい 可能であればC,Dのゴールエリアライン上からシュートする #ref(2016b/Member/pengin/Mission2/課題.jpg,150%) 黒線の左側をジグザグしながらライトレイスを行い、途中でピンポン球を拾ってそれをゴール地点まで運ぶことを目的としている。 *ロボットの説明 [#m45f1514] **全体像 [#sb902f72] #ref(2016b/Member/pengin/Mission2/全体像.jpg,100%) モーターを前後の動き、アームの上げ下ろしにつか使った。センサーはライトセンサーを使用した。 機体が急なカーブを曲がれるようにするために大きなタイヤは使わずに機体の後部に滑らせるためのパーツをつけることで機体を小さくすることにした。 **アーム部分 [#g06bc864] #ref(2016b/Member/pengin/Mission2/アーム.jpg,100%) ピンポン球が左右にずれないようにするために長いパーツを先端部分にとりつけた。ピンポン球を捕まえる部分はシンプルにアームを降ろすだけで捕まえられるようにした。 **本体部分 [#n44674aa] #ref(2016b/Member/pengin/Mission2/ライト.jpg,100%) #ref(2016b/Member/pengin/Mission2/ウラ面.jpg,100%) ライントレイスの正確性をあげるために機体とライトセンサーの距離を小さくする必要があったために、機体もなるべく小さくして正確性をあげた。 捕まえたピンポン球がどこかへ行かないように機体前方に牙のようなものを取り付けた。 *プログラミングの説明 [#k30b9e02] 今回はライントレイスの部分をサブルーチンにすることによってプログラミングを簡略化した。 **定義の説明 [#m00673f9] #define tyousei_migi OnFwd(OUT_A);\\ライントレイス時に右に少し調整 #define tyousei_hidari OnFwd(OUT_C);\\ライントレイス時に左に少し調整 #define senkai_migi OnFwd(OUT_A);OnRev(OUT_C);\\ライントレイス時に右に大きく調整 #define senkai_hidari OnFwd(OUT_C);OnRev(OUT_A);\\ライントレイス時に左に大きく調整 #define go_straight OnFwd(OUT_AC);\\直進する #define usetu OnFwd(OUT_A);Wait(100);\\交差点での右折 #define tyokusinn OnFwd(OUT_AC);Wait(020);Off(OUT_AC);\\交差点での直進 #define senkai OnFwd(OUT_A);OnRev(OUT_C);Wait(019);Off(OUT_AC);\\交差点での軌道修正 #define up OnFwd(OUT_B);Wait(030);Off(OUT_B);\\アームを上げる #define down OnRev(OUT_B);Wait(030);Off(OUT_B);\\アームを下げる #define shoot OnRev(OUT_AC);Wait(100);Off(OUT_AC);up;OnFwd(OUT_AC);Wait(100);Off(OUT_AC);\\ゴールにシュート **サブルーチンの説明 [#je9d376c] 基本的にはラインの左側の部分に沿って進むものだが、交差点を判別するために0,27秒以上黒いラインの上にいる状態が続くと一時停止して音を鳴らして次へ進むものにした。 sub linetrace()\\ライントレイス { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); while(FastTimer(0)<027){ if(SENSOR_2>50){senkai_migi;ClearTimer(0);} else if(SENSOR_2>47){tyousei_migi;ClearTimer(0);} else if(SENSOR_2>43){go_straight;ClearTimer(0);} else if(SENSOR_2>37){tyousei_hidari;ClearTimer(0);} else if(SENSOR_2>35){senkai_hidari;} } Off(OUT_AC); PlaySound(SOUND_UP); Wait(100); senkai; } **メインタスク [#q6cf4e18] task main() { linetrace();\\ライントレイス usetu;\\交差点を右折 linetrace();\\ライントレイス tyokusinn;\\交差点を直進 tyokusinn;\\ボールを捕らえるために前進 down;\\バーを下ろす linetrace();\\ライントレイス tyokusinn;\\交差点を直進 linetrace();\\ライントレイス usetu;\\交差点を右折 linetrace();\\ライントレイス tyokusinn;\\交差点を直進 linetrace();\\ライントレイス usetu;\\交差点を右折 linetrace();\\ライントレイス shoot;\\ピンポン球をゴールにシュート } *結果 [#p976d7b0] なんとか完走しゴールすることが出来たことは良かった。しかし毎回完走できるわけではなく途中の交差点をご認識して右折すべきところを直進してしまうなどいくつかの問題があった。 *感想・まとめ [#t790fd68] 今回は前回の課題に比べてサブルーチンをうまく使ってプログラミングをより簡単なものに出来たと思った。一応完走させることには成功したが毎回必ず成功させる工夫を出来なかったことが少し残念だった。