名前 tako(ru-)
本編とは別に自分でプログラム作ってみました。
**三角形を描く [#oa4e6440]
task main() { OnFwd(OUT_A+OUT_C); Wait(200); OnFwd(OUT_A); Wait(175); OnRev(OUT_C); Wait(175); OnFwd(OUT_A+OUT_C); Wait(200); OnFwd(OUT_A); Wait(175); OnRev(OUT_C); Wait(175); OnFwd(OUT_A+OUT_C); Wait(200); OnFwd(OUT_A); Wait(175); OnRev(OUT_C); Wait(175); Off(OUT_A+OUT_C); }
線をつなげる所のタイム設定に苦労した。
バランスを重視してタイヤではなくキャタピラにしてみました。
初めてのプログラミングでもあったが、それにしてもプログラムを作るのに時間がかかりすぎた。もっと慣れなければこの先きついと思うので少しでも多くプログラミングしなければならない。 それとロボットが床を変えると微妙に回転角度がずれることがある。やはり摩擦が大きいキャタピラにしたためでしょうか。次はホイールでも実験しておきます。
task main () { OnFwd(OUT_B); Wait(25); OnFwd(OUT_A+OUT_C); Wait(60); OnRev(OUT_B); Wait(25); OnRev(OUT_A+OUT_C); Wait(30); OnFwd(OUT_A); Wait(70); OnRev(OUT_C); Wait(70); OnFwd(OUT_B); Wait(25); OnFwd(OUT_A+OUT_C); Wait(20); OnRev(OUT_B); Wait(25); OnRev(OUT_A+OUT_C); Wait(20); OnFwd(OUT_B); Wait(25); OnRev(OUT_A+OUT_C); Wait(70); OnRev(OUT_B); Wait(25); OnFwd(OUT_A+OUT_C); Wait(70); OnFwd(OUT_A); Wait(160); Wait(160); OnFwd(OUT_B); Wait(25); OnFwd(OUT_A+OUT_C); Wait(60); OnRev(OUT_B); Wait(25); OnRev(OUT_A+OUT_C); Wait(60); OnFwd(OUT_A); Wait(75); OnRev(OUT_C); Wait(75); OnFwd(OUT_B); Wait(25); OnFwd(OUT_A+OUT_C); Wait(60); OnRev(OUT_B); Wait(25); Off(OUT_A+OUT_B+OUT_C); }
動くたびにペンがずれたり、外れたりするので、ペンをロボット内部に装着し、ずれを最小限に抑えたこと。
木の線をつなげる所にまだ改善の余地あり。と言うかプログラムは あってるはずなんですが、うまく動いてくれません。やはりロボットの重さや左右のキャタピラのバランスに関係があるかもしれません。今回ペンを内部につけたため、バランスの関係上ホイールを装着できませんでした。すみません。
車体の重さやキャタピラの左右のバランスの誤差を考慮したつもりだったがまだ甘かった。次回は完璧とまではいかないかもしれないが、それに近いものを目指します。
** ロボット画像
ちなみに腕についてる鉛筆は全く動きません。ただの飾りなので気にしないで下さい。本当の筆はロボット内部に仕込んであります。
**タッチセンサープログラム編(90度曲がる)
task main() { SetSensor(SENSOR_1, SENSOR_TOUCH); while(true) { OnFwd(OUT_A+OUT_C); until (SENSOR_1==1); OnRev(OUT_A+OUT_C); Wait(70); Off(OUT_A+OUT_C); OnFwd(OUT_A); Wait(70); OnRev(OUT_C); Wait(70); Off(OUT_A+OUT_C); } }
プログラム自体は単純なものなのでさほど苦労はありませんでした。だんだんプログラム作りがなれて、早くなりました。この調子でがんばりたいです。
前回のロボットを解体するときに時間がなかったので、かなりおおざっぱに片付けたため、今のロボットを作る際、とても時間を要しました。(パーツが見つからなくて...)解体するときは気をつけます。今回がホイールにしてみました。やはりキャタピラよりは誤差が小さかったです。ですがシングルバンパーでは、感知範囲がダブルと比べて小さいので、手間をかけてでもダブルをつけるべきでした。
#define turn_RIGH OnFwd(OUT_A);OnRev(OUT_C);Wait(200);Off(OUT_A+OUT_C); task main () { SetSensor(SENSOR_1, SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); SetSensor(SENSOR_2,SENSOR_TOUCH); while (true) { OnFwd(OUT_A+OUT_C); if (SENSOR_1 < 40) { OnFwd(OUT_A); OnRev(OUT_C); until (SENSOR_1>40);} if(SENSOR_3<40) { OnRev(OUT_C); OnFwd(OUT_A); until(SENSOR_3>40); } if(SENSOR_2==1) { OnRev(OUT_A+OUT_C); Wait(80); turn_RIGHT } } }
**苦労点
ロボットは手間ひまかけて、そして試行錯誤のすえ、どの角度からのぶつかりにも対応できるものを完成させました。
** 反省点 たまにカーブあたりでぶつかると後ろに下がっても線を追えないときがあります。プログラムを作る際、後ろに下がったあとに頭を振って、線を見つけるプログラムを追加しとけばよかったです。
**光を追うプログラム
#define KURUKURU OnFwd(OUT_A);OnRev(OUT_C);Wait(610); #define GOAHEAD OnFwd(OUT_A+OUT_C); #define KOKODOKO OnFwd(OUT_A);OnRev(OUT_C); Wait(610);OnFwd(OUT_C);OnRev(OUT_A);Wait(610);Off(OUT_A+OUT_C); #define MAIGO OnFwd(OUT_A+OUT_C);Wait(200);OnFwd(OUT_A);OnRev(OUT_C);Wait(305);
task main() { SetSensor(SENSOR_1, SENSOR_LIGHT); int lightmax = 0, timemax=0; ClearTimer(0); while(FastTimer(0) < 4650) { if(SENSOR_1 >=lightmax) { GOAHEAD; } else { KOKODOKO; MAIGO; KURUKURU; } } }
まず始めにイメージしたのは、光を見失った時、まるで迷子のようにあたふたするプログラムが作りたかった。.. そして完成したプログラムがこれです。 まず初め、ロボは回転しだします。そして1回転後に前方に向かって進行します。そして振り返りあたふた回転します。 その姿はまるで、はじ●めての●つかいで迷子になった子供の姿を連想させます。
本当にプログラムが関数やらマックスやら使って複雑化してきた。プログラムっをつくるのにも時間を要したが、プログラムを考えるにも時間がかかった。 限られた時間の中でロボコンは行われるので、レベルアップしなければならない。...以上今回の愚痴です。 さて、プログラムについての反省点ですが、確かにこの迷子プログラムはほんとに迷子の様に見えます。しかしこの場合、時間内に光を見つけなければいけないので、2回行動分(行動合計時間)のプログラムになってしまいました。.. ほんとであればもっと長い時間行動できて、迷子をリアルに表したプログラムを作りたかったです。
task main() { OnFwd(OUT_A+OUT_C); //前進 Wait(320); //3,2秒間行動 OnFwd(OUT_A);OnRev(OUT_C); //左旋回 Wait(175); //90度左回転 OnFwd(OUT_A+OUT_C); //前進 Wait(320); //3,2秒行動 OnFwd(OUT_A);OnRev(OUT_C); //左旋回 Wait(168); //90度左回転 OnFwd(OUT_A+OUT_C); //前進 Wait(190); //1,9秒行動 缶到着 Off(OUT_A+OUT_C); //モーター停止 Wait(50); //0,5秒待機 OnFwd(OUT_B); //アーム下げる Wait(110); //缶キャッチ Off(OUT_B); //アーム下げたまま待機 OnRev(OUT_A+OUT_C); //後退 Wait(210); //2,1秒行動(ここから缶を考慮して時間を行 きと変えている) Off(OUT_A+OUT_C); //モーター停止 OnFwd(OUT_A); OnRev(OUT_C); //右旋回 Wait(165); //90度右回転 OnFwd(OUT_A+OUT_C); //前進 Wait(345); //3,45秒行動 OnFwd(OUT_C); OnRev(OUT_A); //65度左旋回(缶にぶつからずショート カット) Wait(165); //65度左回転 OnFwd(OUT_A+OUT_C); //前進 Wait(200); //2秒行動 Off(OUT_A+OUT_C); //モーター停止 OnRev(OUT_B); //アーム上げる Wait(200); //缶を手放す Off(OUT_B); //モーター停止 OnRev(OUT_A+OUT_C); //後退 Wait(50); //缶の後ろに回る OnFwd(OUT_B); //アーム下げる Wait(200); //缶を押すために下げる Off(OUT_B); //モーター停止 OnFwd(OUT_A+OUT_C); //前進 Wait(300 ); //3秒間かんを押し、2機目に缶を渡す Off(OUT_A+OUT_C); //一時停止(缶を完全に渡すため) OnRev(OUT_A+OUT_C); //後退(2機目にぶつかるから) Wait(200); //2秒後退 Off(OUT_A+OUT_C); //モーター停止 OnRev(OUT_B); //次のテストに備えアームを上げる Wait(200); //2秒間上げる Off(OUT_B); } //モーター停止 ロボコンへ。