2009a/A11/ロボコン
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2009a]]
*最終課題――ロボコン―― [#he8a1b9e]
#contents
**概要 [#bba363e6]
***チームメンバー [#ld3b0d62]
50音順。~
~
ダークホース~
タイラー~
バビロン~
ピーチクパーチク~
ライス~
***競技内容 [#e713f210]
詳細はロボコンのページを参照のこと。~
~
*最初に考えていたロボット [#z058a8bf]
[[2009a/A11/ロボコン/1]]~
ロボットを作る上で、最初に考えていたものをこちらに移動させました。~
どのような考えをもってロボットを作成していたか、工夫した点などをまとめてあります。~
下記の説明には、このページを読んでいないと分かりづらいものがあると思います。なぜなら、ロボコンで使用したロボットは、ここに書かれているロボットを急遽改造したものだからです。~
申し訳ありませんが、評価する際などはこちらのページと比較しながらご覧になってください。~
~
*プログラムが複雑で間に合わず改良した、ロボコンで使用したロボ [#r866c804]
**ロボ [#k80739a3]
上記ページのロボをベースに、二つ分のプログラムを作成している時間がなかったので通信機能をカット。そのためRCXの高さを落とした。~
ドダイについていた、パックを落とすアームを、トップに装着した。~
つまり「押し出す&受け取る」方法を一台で行うことになった。
主な変更点はその程度。~
~
トップ作成者:ピーチクパーチク、タイラー、ダークホース~
ドダイ作成者:タイラー、ピーチクパーチク、ダークホース~
***ドダイ [#d30cd13a]
''・外観''~
&ref(dcomp.jpg);~
トップ搭載部分は平らである。~
長いコードはRCXの後ろで束ねて、タイヤに干渉しないようにした。~
----
''・フレーム''~
&ref(dflame.jpg);~
至ってシンプルな仕組み。~
----
''・向かって右側のフレーム''~
&ref(drflame.jpg);~
モーターからの軸を伸ばしたもの。~
フレームが堅牢になるよう工夫を凝らした。~
----
''・光センサ''~
&ref(dlight.jpg);~
向かって右側に装着している。~
このセンサが取れやすくて本当に苦労。~
***トップ [#z0a840ac]
''・外観''~
&ref(tcomp.jpg);~
クレーン車のようだ。~
----
''・フレーム''~
&ref(tflame.jpg);~
ローヴァーロボットを幅詰めしたもの。~
裏側は平坦になっていて、滑り落ちやすい。
前輪タイヤにゴムがついていないのは、摩擦を小さくしキャスターのような役目をさせるためである。~
----
''・アーム''~
&ref(tarm.jpg);~
ゴムで駆動力を伝えている。~
----
''・タイヤと光センサ''~
&ref(tlight.jpg);~
光センサはこのように横についている。~
前輪タイヤのゴムを外すことで、滑るように回転移動ができるようになっている。~
----
''・キャタピラ''~
&ref(tkata.jpg);~
これで牛乳パックを受け取り、さらに逆回転することでパックを落とせる。~
高さがほぼ壁の高さと一緒なので、もしかしたらこれをまわすだけでパックを取れたかもしれない。~
----
''・タッチセンサ''~
&ref(ttouch.jpg);~
これでゴールを感知して、そこでパックを落とす。
**プログラム [#k99615df]
ドダイ/トップ プログラム作成者:タイラー~
彼は留学生なので、プログラムの説明を英語で書いています。翻訳できるところ・理解できるところは書き直しています。~
しかし彼は留学期間がおわり、故郷に帰ってしまったので、私たちにプログラムの解読が出来ないところは説明をつけることが出来ません。~
''コメントアウトしているプログラムはないものとして考えてください。''~
もとのデータも受け取れないので、消してしまうと復元できないからです。~
~
基本的に、ライン上の道順を決めてその上を走るようにプログラムしている。
***ドダイ [#x2f1b9a5]
走るコース(メインタスクの中身)~
&ref(dcourse.png);~
定義
#define LINE_CROSS_TIME 40
#define THOLD 40 //しきいち
#define DRIVE_SPEED 5 //モータートルクの値
#define ADJUST_TIME 5 //適切な時間、モータートルクに比例できるよう変数にした
int numbBoola = 0,
numbBoolb= 0,
numbBool; //光センサが白の上にあるか黒の上にあるかで値の変わる、スイッチのような変数。
sub crossFirstLine() //最初のラインを通り越すまで
{
while((numbBoola == 0) && (numbBoolb == 0))
{//Cross first line Completly //最初のラインを完全に通り越す
OnFwd(OUT_A+OUT_C);
if(SENSOR_1 < THOLD)
{//If sensor is less than threshold i.e. on black //黒線の上に乗ったら
numbBoola = 1; //numbboolaを1に
}
if(SENSOR_3 < THOLD)
{//If sensor is less than threshold //逆のセンサが乗ったら
numbBoolb = 1; //numbboolbを1に
}
}
PlaySound(1);
OnFwd(OUT_A+OUT_C); //Clear first line //最初のラインを過ぎる
Wait(LINE_CROSS_TIME);
Off(OUT_A+OUT_C);
numbBoola = 0;
numbBoolb = 0; //Reset for first line. //変数をリセット
}
sub straddleLine() //二つ目の線にまたがる
{
//Stop on second black line. //二つ目の線で止まるまで
while((numbBoola == 0) && (numbBoolb == 0))
{
OnFwd(OUT_A+OUT_C); //前進
//If sensor is black then stop it else move it foward. //両方のセンサが黒の上にあるとき
if(SENSOR_1 < THOLD)
{
Off(OUT_A);
numbBoola = 1; //numbboolaと
}
if(SENSOR_3 < THOLD)
{
Off(OUT_C);
numbBoolb = 1; //numbboolbを1にする
}
}
numbBoola = 0;
numbBoolb = 0;//Reset 変数リセット
OnFwd(OUT_C);
OnRev(OUT_A);
Wait(120);
Off(OUT_C+OUT_A); //右に曲がって停止
}
sub fitToLine() //ラインにあわせる =正確にラインを捉える
{
while((numbBoola == 0) || (numbBoolb == 0))
{
//If sensor is on black i.e. less than threshhold drive foward
//else if the sensor is on white ie greater than threshold stop
if(SENSOR_1 > THOLD) //センサー1が白の中にあるとき
{
Off(OUT_C);
numbBoola = 1; //numbboolaは1
}
else if(SENSOR_1 < THOLD) //そのうえで、センサー3が黒の中にあるとき
{
OnFwd(OUT_C); //左に曲がる
numbBoola = 0; //numbboolaは0
}
if(SENSOR_3 > THOLD) //センサー3が白の上にあるとき
{
Off(OUT_A);
numbBoolb = 1; //numbboolaは1
}
else if(SENSOR_3 < THOLD)
{
OnRev(OUT_A); //右に曲がる
numbBoolb = 0; //numbboolaは0
}
}
numbBoola = 0;
numbBoolb = 0;//Reset リセット
}
sub driveFwd() //まっすぐ進む普通のライントレース
//それぞれのモーターについて、白の上にあるか黒の上にあるかでどう進むかを決めている。
//たとえば両方白だと小刻みに直進、左だけ黒だと、左が白に乗るまで小刻みに回転。
{
if(SENSOR_1 < THOLD)
{
Off(OUT_C);
}
else if(SENSOR_1 > THOLD)
{
OnFwd(OUT_C);
Wait(ADJUST_TIME);
Float(OUT_C);
}
if(SENSOR_3 < THOLD)
{
Off(OUT_A);
}
else if(SENSOR_3 > THOLD)
{
OnFwd(OUT_A);
Wait(ADJUST_TIME);
Float(OUT_A);
}
}
sub reverse() //逆走するライントレース 直進と反対向きの動作を行っている。
{
if(SENSOR_1 < THOLD)
{
Off(OUT_C);
}
else if(SENSOR_1 > THOLD)
{
OnRev(OUT_C);Wait(ADJUST_TIME);Float(OUT_C);
}
if(SENSOR_3 < THOLD)
{
Off(OUT_A);
}
else if(SENSOR_3 > THOLD)
{
OnRev(OUT_A);Wait(ADJUST_TIME);Float(OUT_A);
}
}
void fourWayIntersection(int leftOrRightOrStraight) //十字交差点を超えるプログラム
{
//変数の値を変えることで、交差点のどちらの方向に進むかを決められるプログラム
//Intersection.
if(leftOrRightOrStraight == 0) //変数が0のとき
{//Left i.e. on a 左方向に曲がる
until(SENSOR_1 > THOLD && SENSOR_3 > THOLD)
{
OnFwd(OUT_C);
OnRev(OUT_A);
}
Off(OUT_A+OUT_C);
}
else if(leftOrRightOrStraight == 1) //変数が1のとき
{//right i.e. on a 右方向に曲がる
until(SENSOR_1 > THOLD && SENSOR_3 > THOLD)
{
OnFwd(OUT_A);
OnRev(OUT_C);
}
Off(OUT_A+OUT_C);
}
else if(leftOrRightOrStraight == 2) //変数が2のとき前進
{
until(SENSOR_1 > THOLD && SENSOR_3 > THOLD)
{
OnFwd(OUT_A+OUT_C);
}
Off(OUT_A+OUT_C);
}
}
//33333333333333333333333333333333333333333333333333333333 T字交差点
void threeWayIntersection(int TWYLeftOrRightTurnOrStrait)
{
if(TWYLeftOrRightTurnOrStrait == 0) //十字交差点と同じく変数で方向を決める 変数が0のとき
{
until(SENSOR_3 > THOLD) //左光センサが白の上に来るまで
{//Turn Right 右に曲がる
OnFwd(OUT_A);
}
Off(OUT_A+OUT_C);
if(SENSOR_1 < THOLD)
{ //そのとき右の光センサが黒の時
until(SENSOR_1 > THOLD || SENSOR_3 < THOLD)
{
OnFwd(OUT_A);
OnRev(OUT_C);
}
Off(OUT_A+OUT_C);
} //これで黒線をまたぐことになる。
}
else if(TWYLeftOrRightTurnOrStrait == 1) //変数が1のとき
{//Straight if right turn //直進する
until(SENSOR_3 > THOLD) //左センサが白になるまで
{//Turn
OnFwd(OUT_A);
OnRev(OUT_C); //右に回転する
}
Off(OUT_A+OUT_C);
}
else if(TWYLeftOrRightTurnOrStrait == 2) //変数が2のとき
{
until(SENSOR_1 > THOLD) //右光センサが白になるまで
{//Turn left 左に曲がる
OnFwd(OUT_C);
OnRev(OUT_A);
}
Off(OUT_A+OUT_C);
}
else if(TWYLeftOrRightTurnOrStrait == 3) //変数が3のとき
{
until(SENSOR_3 > THOLD)
{//Turn
OnFwd(OUT_C);
}
Off(OUT_A+OUT_C);
}
}
void stuck(int threeOrFour,int SLeftOrRightTurnStraight,int FrdOrRev)
//十字・T字交差点にさしかかったときの、方向を決めるプログラム。
//変数を指定してやればその方向に曲がってくれる。
//この内部に上ふたつのサブルーチンが組み込んである。
{
if(FrdOrRev == 0) //前に進むか後ろに進むかを変数で指定 0=前
{
if((SENSOR_1 < THOLD) && (SENSOR_3 < THOLD)) //両方黒の上なら
{
numbBool = 1; //numbboolをa,bとも1にして
if(threeOrFour==3) //T字のとき
{
threeWayIntersection(SLeftOrRightTurnStraight); //変数に従ってサブルーチン実行
}
else if(threeOrFour==4) //十字のとき
{
fourWayIntersection(SLeftOrRightTurnStraight); //変数に従ってサブルーチン実行
}
}
else//run normally それ以外、直進するとき(普通のライントレース、上記のものと同じ)
{
numbBool = 0; //numbboolを0に
if(SENSOR_1 < THOLD) //右センサが黒なら
{
Off(OUT_C);
}
else if(SENSOR_1 > THOLD) //白なら
{
OnFwd(OUT_C); //左回転
Wait(ADJUST_TIME);
Float(OUT_C);
//numbBoola = 0;
}
if(SENSOR_3 < THOLD) //左センサが黒なら
{
Off(OUT_A);
}
else if(SENSOR_3 > THOLD) //白なら
{
OnFwd(OUT_A);
Wait(ADJUST_TIME);
Float(OUT_A);
}
}
}
else//reverse 逆走するとき
{
if((SENSOR_1 < THOLD) && (SENSOR_3 < THOLD))
{
numbBool = 1;
until(SENSOR_1 > THOLD&& SENSOR_3 > THOLD)//
until(SENSOR_1 > THOLD)// && SENSOR_3 > THOLD
{//right turn in reverse. //逆走中に右回転
Float(OUT_A+OUT_C);
Wait(5);
OnFwd(OUT_C);
OnRev(OUT_A);
}
until(SENSOR_3 > THOLD)// && SENSOR_3 > THOLD
{//right turn in reverse. //逆走中に右回転
Float(OUT_A+OUT_C);
Wait(5);
OnFwd(OUT_A);
//OnRev(OUT_A);
}
Off(OUT_A+OUT_C);
}
else//run normally それ以外、逆走中の通常運行
{
numbBool = 0;
if(SENSOR_1 < THOLD)
{
ClearTimer(1);
until(SENSOR_3 < THOLD || (Timer(1)>10))
{
OnFwd(OUT_A);OnRev(OUT_C);
}
until(SENSOR_3 < THOLD);
{
OnFwd(OUT_C);OnRev(OUT_A);
}
Float(OUT_A+OUT_C);
OnFwd(OUT_C);OnRev(OUT_A);
Wait(ADJUST_TIME);
Float(OUT_A+OUT_C);
}
else if(SENSOR_1 > THOLD)
{
OnRev(OUT_C);
Wait(ADJUST_TIME);
Float(OUT_C);
//numbBoola = 0;
}
if(SENSOR_3 < THOLD)
{
ClearTimer(1);
until(SENSOR_1 < THOLD || (Timer(1)>20))
{
OnFwd(OUT_C+OUT_A);
}
Float(OUT_A+OUT_C);
OnFwd(OUT_A);OnRev(OUT_C);
Wait(ADJUST_TIME);
Float(OUT_A+OUT_C);
}
else if(SENSOR_3 > THOLD)
{
OnRev(OUT_A);
Wait(ADJUST_TIME);
Float(OUT_A);
}
}
}
}
task main() //ほぼsubとvoidの組み合わせである。
{
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_3,SENSOR_LIGHT);
SetPower(OUT_A,DRIVE_SPEED);
SetPower(OUT_C,DRIVE_SPEED);
crossFirstLine();
straddleLine();
fitToLine();
until(numbBool == 1)
{
stuck(4,0,0);//4,0 = right turn 4,1=left //十字交差点を右に曲がる
}
numbBool = 0;
PlaySound(2);
until(numbBool == 1)
{
stuck(3, 0,0); //3,1=straight //T字交差点を直進する
}
numbBool = 0;
PlaySound(3);
ClearTimer(0);
until(Timer(0)>1000)
{
driveFwd();
}
//Another intersection
//Activate other robot
}
***トップ [#a47889b1]
sub・voidはドダイのプログラムと同じものを使用している。~
''このsub・voidは汎用性が高いのでどちらのロボでも、どんなコースでも道順さえしっかり指定してあげれば正確に使える。''~
というわけで、同じ部分の説明は省く。
定義
#define LINE_CROSS_TIME 40
#define THOLD 40
#define DRIVE_SPEED 4
#define ADJUST_TIME 4 //ギア比の問題でモータートルクと時間を変えてある
int numbBoola = 0,
numbBoolb= 0,
numbBool;
sub crossFirstLine()
{
while((numbBoola == 0) && (numbBoolb == 0))
{//Cross first line Completly
OnFwd(OUT_A+OUT_C);
if(SENSOR_1 < THOLD)
{//If sensor is less than threshold i.e. on black
numbBoola = 1;
}
if(SENSOR_3 < THOLD)
{//If sensor is less than threshold
numbBoolb = 1;
}
}
PlaySound(1);
OnFwd(OUT_A+OUT_C); //Clear first line
Wait(LINE_CROSS_TIME);
Off(OUT_A+OUT_C);
numbBoola = 0;
numbBoolb = 0; //Reset for first line.
}
sub straddleLine()
{
//Stop on second black line.
while((numbBoola == 0) && (numbBoolb == 0))
{
OnFwd(OUT_A+OUT_C);
//If sensor is black then stop it else move it foward.
if(SENSOR_1 < THOLD)
{
Off(OUT_A);
numbBoola = 1;
}
if(SENSOR_3 < THOLD)
{
Off(OUT_C);
numbBoolb = 1;
}
}
numbBoola = 0;
numbBoolb = 0;//Reset
OnFwd(OUT_A);
OnRev(OUT_C);
Wait(90);
Off(OUT_C+OUT_A);
}
sub fitToLine()
{
while((numbBoola == 0) || (numbBoolb == 0))
{
//If sensor is on black i.e. less than threshhold drive foward
//else if the sensor is on white ie greater than threshold stop
if(SENSOR_1 > THOLD)
{
Off(OUT_C);
numbBoola = 1;
}
else if(SENSOR_1 < THOLD)
{
OnFwd(OUT_C);
numbBoola = 0;
}
if(SENSOR_3 > THOLD)
{
//OnFwd(OUT_A);
//Wait(ADJUST_TIME-2);
Off(OUT_A);
numbBoolb = 1;
}
else if(SENSOR_3 < THOLD)
{
OnRev(OUT_A);
//Wait(ADJUST_TIME);
//Off(OUT_C);
numbBoolb = 0;
}
}
numbBoola = 0;
numbBoolb = 0;//Reset
}
sub driveFwd()
{
//while((numbBoola == 0) || (numbBoolb == 0))
//{
if(SENSOR_1 < THOLD)
{
Off(OUT_C);
}
else if(SENSOR_1 > THOLD)
{
OnFwd(OUT_C);
Wait(ADJUST_TIME);
Float(OUT_C);
//numbBoola = 0;
}
if(SENSOR_3 < THOLD)
{
Off(OUT_A);
}
else if(SENSOR_3 > THOLD)
{
OnFwd(OUT_A);
Wait(ADJUST_TIME);
Float(OUT_A);
}
//}
//numbBoola = 0;
//numbBoolb = 0;//Reset
}
sub reverse()
{
if(SENSOR_1 < THOLD)
{
Off(OUT_C);
}
else if(SENSOR_1 > THOLD)
{
OnRev(OUT_C);Wait(ADJUST_TIME);Float(OUT_C);
}
if(SENSOR_3 < THOLD)
{
Off(OUT_A);
}
else if(SENSOR_3 > THOLD)
{
OnRev(OUT_A);Wait(ADJUST_TIME);Float(OUT_A);
}
}
void fourWayIntersection(int leftOrRightOrStraight)
{
//Intersection.
if(leftOrRightOrStraight == 0)
{//Left i.e. on a
until(SENSOR_1 > THOLD && SENSOR_3 > THOLD)
{
OnFwd(OUT_C);
OnRev(OUT_A);
}
Off(OUT_A+OUT_C);
}
else if(leftOrRightOrStraight == 1)
{//right i.e. on a
until(SENSOR_1 > THOLD && SENSOR_3 > THOLD)
{
OnFwd(OUT_A);
OnRev(OUT_C);
}
Off(OUT_A+OUT_C);
}
else if(leftOrRightOrStraight == 2)
{
until(SENSOR_1 > THOLD && SENSOR_3 > THOLD)
{
OnFwd(OUT_A+OUT_C);
}
Off(OUT_A+OUT_C);
}
}
//33333333333333333333333333333333333333333333333333333333
void threeWayIntersection(int TWYLeftOrRightTurnOrStrait)
{
if(TWYLeftOrRightTurnOrStrait == 0)
{
until(SENSOR_3 > THOLD)
{//Turn Right
OnFwd(OUT_A);
//OnRev(OUT_C);
}
Off(OUT_A+OUT_C);
if(SENSOR_1 < THOLD)
{
until(SENSOR_1 > THOLD || SENSOR_3 < THOLD)
{
OnFwd(OUT_A);
OnRev(OUT_C);
}
Off(OUT_A+OUT_C);
}
}
else if(TWYLeftOrRightTurnOrStrait == 1)
{//Straight if right turn
until(SENSOR_3 > THOLD)
{//Turn
OnFwd(OUT_A);
OnRev(OUT_C);
}
Off(OUT_A+OUT_C);
}
else if(TWYLeftOrRightTurnOrStrait == 2)
{
until(SENSOR_1 > THOLD)
{//Turn left
OnFwd(OUT_C);
OnRev(OUT_A);
}
Off(OUT_A+OUT_C);
}
else if(TWYLeftOrRightTurnOrStrait == 3)
{//striaght if left turn
until(SENSOR_3 > THOLD)
{//Turn
OnFwd(OUT_C);
}
Off(OUT_A+OUT_C);
}
}
void stuck(int threeOrFour,int SLeftOrRightTurnStraight,int FrdOrRev)
{
until(numbBool == 1)
{
if(FrdOrRev == 0)
{
if((SENSOR_1 < THOLD) && (SENSOR_3 < THOLD))
{
numbBool = 1;
if(threeOrFour==3)
{
threeWayIntersection(SLeftOrRightTurnStraight);
}
else if(threeOrFour==4)
{
fourWayIntersection(SLeftOrRightTurnStraight);
}
}
else//run normally
{
numbBool = 0;
if(SENSOR_1 < THOLD)
{
Off(OUT_C);
}
else if(SENSOR_1 > THOLD)
{
OnFwd(OUT_C);
Wait(ADJUST_TIME);
Float(OUT_C);
//numbBoola = 0;
}
if(SENSOR_3 < THOLD)
{
Off(OUT_A);
}
else if(SENSOR_3 > THOLD)
{
OnFwd(OUT_A);
Wait(ADJUST_TIME);
Float(OUT_A);
}
}
}
else//reverse
{
if((SENSOR_1 < THOLD) && (SENSOR_3 < THOLD))
{
numbBool = 1;
until(SENSOR_1 > THOLD&& SENSOR_3 > THOLD)//
until(SENSOR_1 > THOLD)// && SENSOR_3 > THOLD
{//right turn in reverse.
Float(OUT_A+OUT_C);
Wait(5);
OnFwd(OUT_C);
OnRev(OUT_A);
}
until(SENSOR_3 > THOLD)// && SENSOR_3 > THOLD
{//right turn in reverse.
Float(OUT_A+OUT_C);
Wait(5);
OnFwd(OUT_A);
//OnRev(OUT_A);
}
Off(OUT_A+OUT_C);
}
else//run normally
{
numbBool = 0;
if(SENSOR_1 < THOLD)
{
ClearTimer(1);
until(SENSOR_3 < THOLD || (Timer(1)>10))
{
OnFwd(OUT_A);OnRev(OUT_C);
}
until(SENSOR_3 < THOLD);
{
OnFwd(OUT_C);OnRev(OUT_A);
}
Float(OUT_A+OUT_C);
OnFwd(OUT_C);OnRev(OUT_A);
Wait(ADJUST_TIME);
Float(OUT_A+OUT_C);
}
else if(SENSOR_1 > THOLD)
{
OnRev(OUT_C);
Wait(ADJUST_TIME);
Float(OUT_C);
//numbBoola = 0;
}
if(SENSOR_3 < THOLD)
{
ClearTimer(1);
until(SENSOR_1 < THOLD || (Timer(1)>20))
{
OnFwd(OUT_C+OUT_A);
}
Float(OUT_A+OUT_C);
OnFwd(OUT_A);OnRev(OUT_C);
Wait(ADJUST_TIME);
Float(OUT_A+OUT_C);
}
else if(SENSOR_3 > THOLD)
{
OnRev(OUT_A);
Wait(ADJUST_TIME);
Float(OUT_A);
}
}
}
}
numbBool = 0;
}
ここまでドダイと同じルーチンです
task main()
{
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_3,SENSOR_LIGHT);
SetPower(OUT_A,DRIVE_SPEED);
SetPower(OUT_C,DRIVE_SPEED);
ClearTimer(0);
until(Timer(0)>220)
{
numbBoola = 0;
}
straddleLine();
fitToLine();
//Intersection go staright 十字路をまっすぐ
stuck(4,2,0);
//three inter go straight T字路をまっすぐ
stuck(3,3,0);
//four intersection turn left 十字路を左に
stuck(4,0,0);
//Go until hitting wall.
//grab
//reverse turn left
//foward three straight
//four turn left
//hit wall release box.
//four inte go straight hit wall go straight
//hit wall grab box
// three reverse turn around
//four inter go straight
//hit wall release box.
//recerse turn around.
//four intes turn left
//four int go straight
//three int turn right
//hit wall grab box.LAST GREEN どうやら間に合わなくて、ここまでしか完成しなかったようです。
}
**ロボコンの結果 [#id9788ba]
運べたパック:0~
得点:0~
向こう側にも行かなかった。
**感想 [#bcdbd1a7]
やはり直前でロボを変えてしまったところが失敗の原因。~
だがそうしないと動かせなかったのも事実。~
あと一日、時間が欲しかった。
**コメント [#x0d730c6]
コメントをどうぞ。
- 「というロボットを作っていた。」までの部分の記述は邪魔です。どちらを採点したらいいのかわからなくて混乱しましたし、読むのに時間がかかりすぎて正直迷惑です…。別ページにまとめるか、簡略化した記述にするかしてください。 -- [[こさか]] &new{2009-08-10 (月) 01:03:27};
- 「私たちにプログラムの解読が出来ないところは説明をつけることが出来ません。」というところは、私にも解読ができなくて評価が出来なくても仕方ないということになりますので注意してください。 -- [[こさか]] &new{2009-08-10 (月) 01:07:15};
- ページの最初について、謝ります。遊びが過ぎました、ごめんなさい。意見を頂いて、別のページにまとめることにしました。プログラムの方も、かなり説明をつけることができました。 -- [[ピーチクパーチク]] &new{2009-08-11 (火) 04:05:10};
- プログラム中のコメント文があまり長くなるようでしたら複数行に分けて書いてください。できれば一行は半角70文字程度で。複数行のコメント文は /* ... */ を使っても、// を行ごとに書いてもかまいません。 -- [[松本]] &new{2009-08-11 (火) 08:53:11};
- numbBoola のような変数は何をカウントしているのか、コメント文でもかまいませんのでわかりやすく説明しましょう。 -- [[松本]] &new{2009-08-12 (水) 22:05:26};
#comment
終了行:
[[2009a]]
*最終課題――ロボコン―― [#he8a1b9e]
#contents
**概要 [#bba363e6]
***チームメンバー [#ld3b0d62]
50音順。~
~
ダークホース~
タイラー~
バビロン~
ピーチクパーチク~
ライス~
***競技内容 [#e713f210]
詳細はロボコンのページを参照のこと。~
~
*最初に考えていたロボット [#z058a8bf]
[[2009a/A11/ロボコン/1]]~
ロボットを作る上で、最初に考えていたものをこちらに移動させました。~
どのような考えをもってロボットを作成していたか、工夫した点などをまとめてあります。~
下記の説明には、このページを読んでいないと分かりづらいものがあると思います。なぜなら、ロボコンで使用したロボットは、ここに書かれているロボットを急遽改造したものだからです。~
申し訳ありませんが、評価する際などはこちらのページと比較しながらご覧になってください。~
~
*プログラムが複雑で間に合わず改良した、ロボコンで使用したロボ [#r866c804]
**ロボ [#k80739a3]
上記ページのロボをベースに、二つ分のプログラムを作成している時間がなかったので通信機能をカット。そのためRCXの高さを落とした。~
ドダイについていた、パックを落とすアームを、トップに装着した。~
つまり「押し出す&受け取る」方法を一台で行うことになった。
主な変更点はその程度。~
~
トップ作成者:ピーチクパーチク、タイラー、ダークホース~
ドダイ作成者:タイラー、ピーチクパーチク、ダークホース~
***ドダイ [#d30cd13a]
''・外観''~
&ref(dcomp.jpg);~
トップ搭載部分は平らである。~
長いコードはRCXの後ろで束ねて、タイヤに干渉しないようにした。~
----
''・フレーム''~
&ref(dflame.jpg);~
至ってシンプルな仕組み。~
----
''・向かって右側のフレーム''~
&ref(drflame.jpg);~
モーターからの軸を伸ばしたもの。~
フレームが堅牢になるよう工夫を凝らした。~
----
''・光センサ''~
&ref(dlight.jpg);~
向かって右側に装着している。~
このセンサが取れやすくて本当に苦労。~
***トップ [#z0a840ac]
''・外観''~
&ref(tcomp.jpg);~
クレーン車のようだ。~
----
''・フレーム''~
&ref(tflame.jpg);~
ローヴァーロボットを幅詰めしたもの。~
裏側は平坦になっていて、滑り落ちやすい。
前輪タイヤにゴムがついていないのは、摩擦を小さくしキャスターのような役目をさせるためである。~
----
''・アーム''~
&ref(tarm.jpg);~
ゴムで駆動力を伝えている。~
----
''・タイヤと光センサ''~
&ref(tlight.jpg);~
光センサはこのように横についている。~
前輪タイヤのゴムを外すことで、滑るように回転移動ができるようになっている。~
----
''・キャタピラ''~
&ref(tkata.jpg);~
これで牛乳パックを受け取り、さらに逆回転することでパックを落とせる。~
高さがほぼ壁の高さと一緒なので、もしかしたらこれをまわすだけでパックを取れたかもしれない。~
----
''・タッチセンサ''~
&ref(ttouch.jpg);~
これでゴールを感知して、そこでパックを落とす。
**プログラム [#k99615df]
ドダイ/トップ プログラム作成者:タイラー~
彼は留学生なので、プログラムの説明を英語で書いています。翻訳できるところ・理解できるところは書き直しています。~
しかし彼は留学期間がおわり、故郷に帰ってしまったので、私たちにプログラムの解読が出来ないところは説明をつけることが出来ません。~
''コメントアウトしているプログラムはないものとして考えてください。''~
もとのデータも受け取れないので、消してしまうと復元できないからです。~
~
基本的に、ライン上の道順を決めてその上を走るようにプログラムしている。
***ドダイ [#x2f1b9a5]
走るコース(メインタスクの中身)~
&ref(dcourse.png);~
定義
#define LINE_CROSS_TIME 40
#define THOLD 40 //しきいち
#define DRIVE_SPEED 5 //モータートルクの値
#define ADJUST_TIME 5 //適切な時間、モータートルクに比例できるよう変数にした
int numbBoola = 0,
numbBoolb= 0,
numbBool; //光センサが白の上にあるか黒の上にあるかで値の変わる、スイッチのような変数。
sub crossFirstLine() //最初のラインを通り越すまで
{
while((numbBoola == 0) && (numbBoolb == 0))
{//Cross first line Completly //最初のラインを完全に通り越す
OnFwd(OUT_A+OUT_C);
if(SENSOR_1 < THOLD)
{//If sensor is less than threshold i.e. on black //黒線の上に乗ったら
numbBoola = 1; //numbboolaを1に
}
if(SENSOR_3 < THOLD)
{//If sensor is less than threshold //逆のセンサが乗ったら
numbBoolb = 1; //numbboolbを1に
}
}
PlaySound(1);
OnFwd(OUT_A+OUT_C); //Clear first line //最初のラインを過ぎる
Wait(LINE_CROSS_TIME);
Off(OUT_A+OUT_C);
numbBoola = 0;
numbBoolb = 0; //Reset for first line. //変数をリセット
}
sub straddleLine() //二つ目の線にまたがる
{
//Stop on second black line. //二つ目の線で止まるまで
while((numbBoola == 0) && (numbBoolb == 0))
{
OnFwd(OUT_A+OUT_C); //前進
//If sensor is black then stop it else move it foward. //両方のセンサが黒の上にあるとき
if(SENSOR_1 < THOLD)
{
Off(OUT_A);
numbBoola = 1; //numbboolaと
}
if(SENSOR_3 < THOLD)
{
Off(OUT_C);
numbBoolb = 1; //numbboolbを1にする
}
}
numbBoola = 0;
numbBoolb = 0;//Reset 変数リセット
OnFwd(OUT_C);
OnRev(OUT_A);
Wait(120);
Off(OUT_C+OUT_A); //右に曲がって停止
}
sub fitToLine() //ラインにあわせる =正確にラインを捉える
{
while((numbBoola == 0) || (numbBoolb == 0))
{
//If sensor is on black i.e. less than threshhold drive foward
//else if the sensor is on white ie greater than threshold stop
if(SENSOR_1 > THOLD) //センサー1が白の中にあるとき
{
Off(OUT_C);
numbBoola = 1; //numbboolaは1
}
else if(SENSOR_1 < THOLD) //そのうえで、センサー3が黒の中にあるとき
{
OnFwd(OUT_C); //左に曲がる
numbBoola = 0; //numbboolaは0
}
if(SENSOR_3 > THOLD) //センサー3が白の上にあるとき
{
Off(OUT_A);
numbBoolb = 1; //numbboolaは1
}
else if(SENSOR_3 < THOLD)
{
OnRev(OUT_A); //右に曲がる
numbBoolb = 0; //numbboolaは0
}
}
numbBoola = 0;
numbBoolb = 0;//Reset リセット
}
sub driveFwd() //まっすぐ進む普通のライントレース
//それぞれのモーターについて、白の上にあるか黒の上にあるかでどう進むかを決めている。
//たとえば両方白だと小刻みに直進、左だけ黒だと、左が白に乗るまで小刻みに回転。
{
if(SENSOR_1 < THOLD)
{
Off(OUT_C);
}
else if(SENSOR_1 > THOLD)
{
OnFwd(OUT_C);
Wait(ADJUST_TIME);
Float(OUT_C);
}
if(SENSOR_3 < THOLD)
{
Off(OUT_A);
}
else if(SENSOR_3 > THOLD)
{
OnFwd(OUT_A);
Wait(ADJUST_TIME);
Float(OUT_A);
}
}
sub reverse() //逆走するライントレース 直進と反対向きの動作を行っている。
{
if(SENSOR_1 < THOLD)
{
Off(OUT_C);
}
else if(SENSOR_1 > THOLD)
{
OnRev(OUT_C);Wait(ADJUST_TIME);Float(OUT_C);
}
if(SENSOR_3 < THOLD)
{
Off(OUT_A);
}
else if(SENSOR_3 > THOLD)
{
OnRev(OUT_A);Wait(ADJUST_TIME);Float(OUT_A);
}
}
void fourWayIntersection(int leftOrRightOrStraight) //十字交差点を超えるプログラム
{
//変数の値を変えることで、交差点のどちらの方向に進むかを決められるプログラム
//Intersection.
if(leftOrRightOrStraight == 0) //変数が0のとき
{//Left i.e. on a 左方向に曲がる
until(SENSOR_1 > THOLD && SENSOR_3 > THOLD)
{
OnFwd(OUT_C);
OnRev(OUT_A);
}
Off(OUT_A+OUT_C);
}
else if(leftOrRightOrStraight == 1) //変数が1のとき
{//right i.e. on a 右方向に曲がる
until(SENSOR_1 > THOLD && SENSOR_3 > THOLD)
{
OnFwd(OUT_A);
OnRev(OUT_C);
}
Off(OUT_A+OUT_C);
}
else if(leftOrRightOrStraight == 2) //変数が2のとき前進
{
until(SENSOR_1 > THOLD && SENSOR_3 > THOLD)
{
OnFwd(OUT_A+OUT_C);
}
Off(OUT_A+OUT_C);
}
}
//33333333333333333333333333333333333333333333333333333333 T字交差点
void threeWayIntersection(int TWYLeftOrRightTurnOrStrait)
{
if(TWYLeftOrRightTurnOrStrait == 0) //十字交差点と同じく変数で方向を決める 変数が0のとき
{
until(SENSOR_3 > THOLD) //左光センサが白の上に来るまで
{//Turn Right 右に曲がる
OnFwd(OUT_A);
}
Off(OUT_A+OUT_C);
if(SENSOR_1 < THOLD)
{ //そのとき右の光センサが黒の時
until(SENSOR_1 > THOLD || SENSOR_3 < THOLD)
{
OnFwd(OUT_A);
OnRev(OUT_C);
}
Off(OUT_A+OUT_C);
} //これで黒線をまたぐことになる。
}
else if(TWYLeftOrRightTurnOrStrait == 1) //変数が1のとき
{//Straight if right turn //直進する
until(SENSOR_3 > THOLD) //左センサが白になるまで
{//Turn
OnFwd(OUT_A);
OnRev(OUT_C); //右に回転する
}
Off(OUT_A+OUT_C);
}
else if(TWYLeftOrRightTurnOrStrait == 2) //変数が2のとき
{
until(SENSOR_1 > THOLD) //右光センサが白になるまで
{//Turn left 左に曲がる
OnFwd(OUT_C);
OnRev(OUT_A);
}
Off(OUT_A+OUT_C);
}
else if(TWYLeftOrRightTurnOrStrait == 3) //変数が3のとき
{
until(SENSOR_3 > THOLD)
{//Turn
OnFwd(OUT_C);
}
Off(OUT_A+OUT_C);
}
}
void stuck(int threeOrFour,int SLeftOrRightTurnStraight,int FrdOrRev)
//十字・T字交差点にさしかかったときの、方向を決めるプログラム。
//変数を指定してやればその方向に曲がってくれる。
//この内部に上ふたつのサブルーチンが組み込んである。
{
if(FrdOrRev == 0) //前に進むか後ろに進むかを変数で指定 0=前
{
if((SENSOR_1 < THOLD) && (SENSOR_3 < THOLD)) //両方黒の上なら
{
numbBool = 1; //numbboolをa,bとも1にして
if(threeOrFour==3) //T字のとき
{
threeWayIntersection(SLeftOrRightTurnStraight); //変数に従ってサブルーチン実行
}
else if(threeOrFour==4) //十字のとき
{
fourWayIntersection(SLeftOrRightTurnStraight); //変数に従ってサブルーチン実行
}
}
else//run normally それ以外、直進するとき(普通のライントレース、上記のものと同じ)
{
numbBool = 0; //numbboolを0に
if(SENSOR_1 < THOLD) //右センサが黒なら
{
Off(OUT_C);
}
else if(SENSOR_1 > THOLD) //白なら
{
OnFwd(OUT_C); //左回転
Wait(ADJUST_TIME);
Float(OUT_C);
//numbBoola = 0;
}
if(SENSOR_3 < THOLD) //左センサが黒なら
{
Off(OUT_A);
}
else if(SENSOR_3 > THOLD) //白なら
{
OnFwd(OUT_A);
Wait(ADJUST_TIME);
Float(OUT_A);
}
}
}
else//reverse 逆走するとき
{
if((SENSOR_1 < THOLD) && (SENSOR_3 < THOLD))
{
numbBool = 1;
until(SENSOR_1 > THOLD&& SENSOR_3 > THOLD)//
until(SENSOR_1 > THOLD)// && SENSOR_3 > THOLD
{//right turn in reverse. //逆走中に右回転
Float(OUT_A+OUT_C);
Wait(5);
OnFwd(OUT_C);
OnRev(OUT_A);
}
until(SENSOR_3 > THOLD)// && SENSOR_3 > THOLD
{//right turn in reverse. //逆走中に右回転
Float(OUT_A+OUT_C);
Wait(5);
OnFwd(OUT_A);
//OnRev(OUT_A);
}
Off(OUT_A+OUT_C);
}
else//run normally それ以外、逆走中の通常運行
{
numbBool = 0;
if(SENSOR_1 < THOLD)
{
ClearTimer(1);
until(SENSOR_3 < THOLD || (Timer(1)>10))
{
OnFwd(OUT_A);OnRev(OUT_C);
}
until(SENSOR_3 < THOLD);
{
OnFwd(OUT_C);OnRev(OUT_A);
}
Float(OUT_A+OUT_C);
OnFwd(OUT_C);OnRev(OUT_A);
Wait(ADJUST_TIME);
Float(OUT_A+OUT_C);
}
else if(SENSOR_1 > THOLD)
{
OnRev(OUT_C);
Wait(ADJUST_TIME);
Float(OUT_C);
//numbBoola = 0;
}
if(SENSOR_3 < THOLD)
{
ClearTimer(1);
until(SENSOR_1 < THOLD || (Timer(1)>20))
{
OnFwd(OUT_C+OUT_A);
}
Float(OUT_A+OUT_C);
OnFwd(OUT_A);OnRev(OUT_C);
Wait(ADJUST_TIME);
Float(OUT_A+OUT_C);
}
else if(SENSOR_3 > THOLD)
{
OnRev(OUT_A);
Wait(ADJUST_TIME);
Float(OUT_A);
}
}
}
}
task main() //ほぼsubとvoidの組み合わせである。
{
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_3,SENSOR_LIGHT);
SetPower(OUT_A,DRIVE_SPEED);
SetPower(OUT_C,DRIVE_SPEED);
crossFirstLine();
straddleLine();
fitToLine();
until(numbBool == 1)
{
stuck(4,0,0);//4,0 = right turn 4,1=left //十字交差点を右に曲がる
}
numbBool = 0;
PlaySound(2);
until(numbBool == 1)
{
stuck(3, 0,0); //3,1=straight //T字交差点を直進する
}
numbBool = 0;
PlaySound(3);
ClearTimer(0);
until(Timer(0)>1000)
{
driveFwd();
}
//Another intersection
//Activate other robot
}
***トップ [#a47889b1]
sub・voidはドダイのプログラムと同じものを使用している。~
''このsub・voidは汎用性が高いのでどちらのロボでも、どんなコースでも道順さえしっかり指定してあげれば正確に使える。''~
というわけで、同じ部分の説明は省く。
定義
#define LINE_CROSS_TIME 40
#define THOLD 40
#define DRIVE_SPEED 4
#define ADJUST_TIME 4 //ギア比の問題でモータートルクと時間を変えてある
int numbBoola = 0,
numbBoolb= 0,
numbBool;
sub crossFirstLine()
{
while((numbBoola == 0) && (numbBoolb == 0))
{//Cross first line Completly
OnFwd(OUT_A+OUT_C);
if(SENSOR_1 < THOLD)
{//If sensor is less than threshold i.e. on black
numbBoola = 1;
}
if(SENSOR_3 < THOLD)
{//If sensor is less than threshold
numbBoolb = 1;
}
}
PlaySound(1);
OnFwd(OUT_A+OUT_C); //Clear first line
Wait(LINE_CROSS_TIME);
Off(OUT_A+OUT_C);
numbBoola = 0;
numbBoolb = 0; //Reset for first line.
}
sub straddleLine()
{
//Stop on second black line.
while((numbBoola == 0) && (numbBoolb == 0))
{
OnFwd(OUT_A+OUT_C);
//If sensor is black then stop it else move it foward.
if(SENSOR_1 < THOLD)
{
Off(OUT_A);
numbBoola = 1;
}
if(SENSOR_3 < THOLD)
{
Off(OUT_C);
numbBoolb = 1;
}
}
numbBoola = 0;
numbBoolb = 0;//Reset
OnFwd(OUT_A);
OnRev(OUT_C);
Wait(90);
Off(OUT_C+OUT_A);
}
sub fitToLine()
{
while((numbBoola == 0) || (numbBoolb == 0))
{
//If sensor is on black i.e. less than threshhold drive foward
//else if the sensor is on white ie greater than threshold stop
if(SENSOR_1 > THOLD)
{
Off(OUT_C);
numbBoola = 1;
}
else if(SENSOR_1 < THOLD)
{
OnFwd(OUT_C);
numbBoola = 0;
}
if(SENSOR_3 > THOLD)
{
//OnFwd(OUT_A);
//Wait(ADJUST_TIME-2);
Off(OUT_A);
numbBoolb = 1;
}
else if(SENSOR_3 < THOLD)
{
OnRev(OUT_A);
//Wait(ADJUST_TIME);
//Off(OUT_C);
numbBoolb = 0;
}
}
numbBoola = 0;
numbBoolb = 0;//Reset
}
sub driveFwd()
{
//while((numbBoola == 0) || (numbBoolb == 0))
//{
if(SENSOR_1 < THOLD)
{
Off(OUT_C);
}
else if(SENSOR_1 > THOLD)
{
OnFwd(OUT_C);
Wait(ADJUST_TIME);
Float(OUT_C);
//numbBoola = 0;
}
if(SENSOR_3 < THOLD)
{
Off(OUT_A);
}
else if(SENSOR_3 > THOLD)
{
OnFwd(OUT_A);
Wait(ADJUST_TIME);
Float(OUT_A);
}
//}
//numbBoola = 0;
//numbBoolb = 0;//Reset
}
sub reverse()
{
if(SENSOR_1 < THOLD)
{
Off(OUT_C);
}
else if(SENSOR_1 > THOLD)
{
OnRev(OUT_C);Wait(ADJUST_TIME);Float(OUT_C);
}
if(SENSOR_3 < THOLD)
{
Off(OUT_A);
}
else if(SENSOR_3 > THOLD)
{
OnRev(OUT_A);Wait(ADJUST_TIME);Float(OUT_A);
}
}
void fourWayIntersection(int leftOrRightOrStraight)
{
//Intersection.
if(leftOrRightOrStraight == 0)
{//Left i.e. on a
until(SENSOR_1 > THOLD && SENSOR_3 > THOLD)
{
OnFwd(OUT_C);
OnRev(OUT_A);
}
Off(OUT_A+OUT_C);
}
else if(leftOrRightOrStraight == 1)
{//right i.e. on a
until(SENSOR_1 > THOLD && SENSOR_3 > THOLD)
{
OnFwd(OUT_A);
OnRev(OUT_C);
}
Off(OUT_A+OUT_C);
}
else if(leftOrRightOrStraight == 2)
{
until(SENSOR_1 > THOLD && SENSOR_3 > THOLD)
{
OnFwd(OUT_A+OUT_C);
}
Off(OUT_A+OUT_C);
}
}
//33333333333333333333333333333333333333333333333333333333
void threeWayIntersection(int TWYLeftOrRightTurnOrStrait)
{
if(TWYLeftOrRightTurnOrStrait == 0)
{
until(SENSOR_3 > THOLD)
{//Turn Right
OnFwd(OUT_A);
//OnRev(OUT_C);
}
Off(OUT_A+OUT_C);
if(SENSOR_1 < THOLD)
{
until(SENSOR_1 > THOLD || SENSOR_3 < THOLD)
{
OnFwd(OUT_A);
OnRev(OUT_C);
}
Off(OUT_A+OUT_C);
}
}
else if(TWYLeftOrRightTurnOrStrait == 1)
{//Straight if right turn
until(SENSOR_3 > THOLD)
{//Turn
OnFwd(OUT_A);
OnRev(OUT_C);
}
Off(OUT_A+OUT_C);
}
else if(TWYLeftOrRightTurnOrStrait == 2)
{
until(SENSOR_1 > THOLD)
{//Turn left
OnFwd(OUT_C);
OnRev(OUT_A);
}
Off(OUT_A+OUT_C);
}
else if(TWYLeftOrRightTurnOrStrait == 3)
{//striaght if left turn
until(SENSOR_3 > THOLD)
{//Turn
OnFwd(OUT_C);
}
Off(OUT_A+OUT_C);
}
}
void stuck(int threeOrFour,int SLeftOrRightTurnStraight,int FrdOrRev)
{
until(numbBool == 1)
{
if(FrdOrRev == 0)
{
if((SENSOR_1 < THOLD) && (SENSOR_3 < THOLD))
{
numbBool = 1;
if(threeOrFour==3)
{
threeWayIntersection(SLeftOrRightTurnStraight);
}
else if(threeOrFour==4)
{
fourWayIntersection(SLeftOrRightTurnStraight);
}
}
else//run normally
{
numbBool = 0;
if(SENSOR_1 < THOLD)
{
Off(OUT_C);
}
else if(SENSOR_1 > THOLD)
{
OnFwd(OUT_C);
Wait(ADJUST_TIME);
Float(OUT_C);
//numbBoola = 0;
}
if(SENSOR_3 < THOLD)
{
Off(OUT_A);
}
else if(SENSOR_3 > THOLD)
{
OnFwd(OUT_A);
Wait(ADJUST_TIME);
Float(OUT_A);
}
}
}
else//reverse
{
if((SENSOR_1 < THOLD) && (SENSOR_3 < THOLD))
{
numbBool = 1;
until(SENSOR_1 > THOLD&& SENSOR_3 > THOLD)//
until(SENSOR_1 > THOLD)// && SENSOR_3 > THOLD
{//right turn in reverse.
Float(OUT_A+OUT_C);
Wait(5);
OnFwd(OUT_C);
OnRev(OUT_A);
}
until(SENSOR_3 > THOLD)// && SENSOR_3 > THOLD
{//right turn in reverse.
Float(OUT_A+OUT_C);
Wait(5);
OnFwd(OUT_A);
//OnRev(OUT_A);
}
Off(OUT_A+OUT_C);
}
else//run normally
{
numbBool = 0;
if(SENSOR_1 < THOLD)
{
ClearTimer(1);
until(SENSOR_3 < THOLD || (Timer(1)>10))
{
OnFwd(OUT_A);OnRev(OUT_C);
}
until(SENSOR_3 < THOLD);
{
OnFwd(OUT_C);OnRev(OUT_A);
}
Float(OUT_A+OUT_C);
OnFwd(OUT_C);OnRev(OUT_A);
Wait(ADJUST_TIME);
Float(OUT_A+OUT_C);
}
else if(SENSOR_1 > THOLD)
{
OnRev(OUT_C);
Wait(ADJUST_TIME);
Float(OUT_C);
//numbBoola = 0;
}
if(SENSOR_3 < THOLD)
{
ClearTimer(1);
until(SENSOR_1 < THOLD || (Timer(1)>20))
{
OnFwd(OUT_C+OUT_A);
}
Float(OUT_A+OUT_C);
OnFwd(OUT_A);OnRev(OUT_C);
Wait(ADJUST_TIME);
Float(OUT_A+OUT_C);
}
else if(SENSOR_3 > THOLD)
{
OnRev(OUT_A);
Wait(ADJUST_TIME);
Float(OUT_A);
}
}
}
}
numbBool = 0;
}
ここまでドダイと同じルーチンです
task main()
{
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_3,SENSOR_LIGHT);
SetPower(OUT_A,DRIVE_SPEED);
SetPower(OUT_C,DRIVE_SPEED);
ClearTimer(0);
until(Timer(0)>220)
{
numbBoola = 0;
}
straddleLine();
fitToLine();
//Intersection go staright 十字路をまっすぐ
stuck(4,2,0);
//three inter go straight T字路をまっすぐ
stuck(3,3,0);
//four intersection turn left 十字路を左に
stuck(4,0,0);
//Go until hitting wall.
//grab
//reverse turn left
//foward three straight
//four turn left
//hit wall release box.
//four inte go straight hit wall go straight
//hit wall grab box
// three reverse turn around
//four inter go straight
//hit wall release box.
//recerse turn around.
//four intes turn left
//four int go straight
//three int turn right
//hit wall grab box.LAST GREEN どうやら間に合わなくて、ここまでしか完成しなかったようです。
}
**ロボコンの結果 [#id9788ba]
運べたパック:0~
得点:0~
向こう側にも行かなかった。
**感想 [#bcdbd1a7]
やはり直前でロボを変えてしまったところが失敗の原因。~
だがそうしないと動かせなかったのも事実。~
あと一日、時間が欲しかった。
**コメント [#x0d730c6]
コメントをどうぞ。
- 「というロボットを作っていた。」までの部分の記述は邪魔です。どちらを採点したらいいのかわからなくて混乱しましたし、読むのに時間がかかりすぎて正直迷惑です…。別ページにまとめるか、簡略化した記述にするかしてください。 -- [[こさか]] &new{2009-08-10 (月) 01:03:27};
- 「私たちにプログラムの解読が出来ないところは説明をつけることが出来ません。」というところは、私にも解読ができなくて評価が出来なくても仕方ないということになりますので注意してください。 -- [[こさか]] &new{2009-08-10 (月) 01:07:15};
- ページの最初について、謝ります。遊びが過ぎました、ごめんなさい。意見を頂いて、別のページにまとめることにしました。プログラムの方も、かなり説明をつけることができました。 -- [[ピーチクパーチク]] &new{2009-08-11 (火) 04:05:10};
- プログラム中のコメント文があまり長くなるようでしたら複数行に分けて書いてください。できれば一行は半角70文字程度で。複数行のコメント文は /* ... */ を使っても、// を行ごとに書いてもかまいません。 -- [[松本]] &new{2009-08-11 (火) 08:53:11};
- numbBoola のような変数は何をカウントしているのか、コメント文でもかまいませんのでわかりやすく説明しましょう。 -- [[松本]] &new{2009-08-12 (水) 22:05:26};
#comment
ページ名: