2017a/Member/tsukuzin/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2017a/Member]]
#contents
*Mission2 [#x2228c16]
&ref(2017a/Mission2/2017a-mission2.png,100%,);
今回は光センサーを使って上のようなコースの線上を伝って、...
自分の作ったロボットは、「A→E→P→Q→R→T(一周して)→H→G→S→Q...
詳しくは[[Mission2:http://yakushi.shinshu-u.ac.jp/robotic...
*機構説明 [#jea9c75d]
&ref(2017a/Member/tsukuzin/Mission2/IMG_0308.jpg,15%);
&ref(2017a/Member/tsukuzin/Mission2/IMG_0310.jpg,24%);
&ref(2017a/Member/tsukuzin/Mission2/setumei.gif,30%);
4つではなく3つのタイヤを使用することで旋回しやすくした。
また後輪はできるだけ摩擦を小さくするためにゴムタイヤのゴ...
3つ目の画像は後輪のタイヤを示している。敢えてシャフトを...
またMission1の反省点であるバランスに関しても今回はリモコ...
*プログラムについて [#x923757a]
**使用した定義 [#l75cae2e]
#define hazime() mae_susumu; Wait(60);
#define mae_susumu OnFwd(OUT_AC); //前進する
#define senkai_migi() OnFwd(OUT_A); OnRev(OUT_C); //大...
#define kaiten_migi() OnFwd(OUT_A); //小さく右に曲がる
#define senkai_hidari() OnFwd(OUT_C); OnRev(OUT_A);//大...
#define kaiten_hidari() OnFwd(OUT_C);//小さく左に曲がる
#define teisi(t) Off(OUT_AC); Wait(t); //t秒だけ停止
#define handantime 25 //交差点、曲がり角かの判断の時間
#define end() mae_susumu; Wait(60);
Mission1で使用した定義をそのまま使用したかったが、ライン...
#define sakai 45
のように定義していたが、場所、時間によって光センサーの値...
sakai+5 > SENSOR_2
のような不等式で動作するとき、値を変更するのが少し面倒で...
確かに定義したほうが見やすいが、今回は修正のしやすさを優...
**サブルーチンについて [#cad2dffb]
***ライントレース部分 [#mcb1497a]
sub lineI() //最初の線の内側(右側)を走る
{
ClearTimer(0);
while(FastTimer(0)<handantime)
{
if(SENSOR_2 >= 47)
{
senkai_hidari();
ClearTimer(0);
}
else if (SENSOR_2 >= 45)
{
mae_susumu;
ClearTimer(0);
}
else if (SENSOR_2 >= 38)
{
senkai_migi();
}
}
}
sub lineO() //最初の線の外側(左側)を走る
{
ClearTimer(0);
while(FastTimer(0)<handantime)
{
if(SENSOR_2 >= 47)
{
senkai_migi();
ClearTimer(0);
}
else if (SENSOR_2 >= 45)
{
mae_susumu;
Wait(2);
ClearTimer(0);
}
else if (SENSOR_2 >= 38)
{
senkai_hidari();
}
}
}
「lineO」を例にとってフローチャートにすると次のようになる。
&ref(2017a/Member/tsukuzin/Mission2/フローチャート2.png,1...
始めにタイマーをリセットする。次に「while(FastTimer(0)<ha...
***交差点、曲がり角の判断 [#o6814c61]
sub kousatenQ() //交差点Qを通るときに使用する
{
PlaySound(SOUND_UP);
ClearTimer(1);
}
sub kousatenR() //交差点Rを通るときに使用する
{
PlaySound(SOUND_UP);
senkai_hidari();
Wait(70);
ClearTimer(1);
}
sub kousatenTORS()
{
teisi(100);
PlaySound(SOUND_DOWN);
mae_susumu;
Wait(50);
ClearTimer(1);
}
sub kakuEHGF() //曲がり角EHGFを通るときに使用する
{
PlaySound(SOUND_UP);
ClearTimer(1);
}
sub kousatenPM() //交差点Pを通るとき(戻る)に使用する
{
teisi(100);
PlaySound(SOUND_UP);
mae_susumu;
Wait(36);
ClearTimer(1);
}
交差点に差し掛かったら停止したり、音を鳴らしたりする。
最初はサブルーチンが8つまでしか使えないことを忘れていて、...
本来サブルーチンに交差点を通った回数を足していく予定だっ...
**タスクメイン [#a7090820]
task main ()
{
SetSensor(SENSOR_2, SENSOR_LIGHT);
SetPower(OUT_AC,1);
ClearTimer(1); //走行時間の測定
int X=0; //交差点、T字路の回数を測定
hazime();
while(X<12)
{
lineI();
if(Timer(1)>50 && X==0)
{
X++;
kakuEHGF(); //E地点を右折
}
lineI();
if(Timer(1)>30 && X==1)
{
X++;
kousatenPI();//P地点を左折
}
lineO();
if(Timer(1)>30 && X==2 )
{
X++;
kousatenQ();//Q地点を直進
mae_susumu;
Wait(50);
}
lineO();
if(Timer(1)>30 && X==3 )
{
X++;
kousatenR(); //R地点を左折
}
lineO();
if(Timer(1)>30 && X==4 )
{
X++;
kousatenTORS(); //T地点を直進
}
lineO();
if(Timer(1)>30 && X==5 )
{
X++;
kousatenTORS();//T地点を直進
}
lineI();
if(Timer(1)>30 && X==6 )
{
X++;
kakuEHGF(); //直角Hを曲がる
}
lineI();
if(Timer(1)>30 && X==7 )
{
X++;
kakuEHGF(); //直角Gを曲がる
}
lineI();
if(Timer(1)>30 && X==8 )
{
X++;
kousatenTORS(); //地点Sを左折
}
lineO();
if(Timer(1)>30 && X==9 )
{
X++;
kousatenPM(); //地点Pを直進
}
lineO();
if(Timer(1)>30 && X==10 )
{
X++;
kousatenQ();// 地点Qを左折
senkai_hidari();
Wait(50);
}
lineO();
if(Timer(1)>30 && X==11 )
{
X++;
kakuEHGF();
}
lineO();
}
end();
}
大まかにはライントレース→交差点判断→ライントレース・・・...
最初に走行時間をTimer(1)で記録、交差点と曲がり角の回数を...
条件、「Timer(1)>○○ && X==○○」を満たさなければライントレ...
***タスクメインについて気が付いたこと [#la1b392c]
このプログラムで動かすと稀に「lineO」の動作(線の左側を走...
lineI();
if(Timer(1)>30 && X==1)
{
X++;
kousatenPI();//P地点を左折
}
lineO();
この誤作動がよく発生した「P地点左折」付近のプログラムのフ...
if文の条件を満たさず、偽のルート通った際、そのまま「lineI...
&ref(2017a/Member/tsukuzin/Mission2/フローチャート3.png,1...
&ref(2017a/Member/tsukuzin/Mission2/フローチャート4.png,1...
よって正しく動作させるためには、下のようにする必要があっ...
lineI();
if(Timer(1)>30 && X==1)
{
X++;
kousatenPI();//P地点を左折
}
else
{
lineI();
}
lineO();
ロボットを実際に動かしている際は「Timer(1)>30」の30の値を...
*反省 [#taf1dd25]
Mission1も電圧の変化によって書かれる線が全く異なってしま...
プログラミングもif文とwhile文を重ねて使用するので、実際に...
通った交差点の判断として変数「X」を使用したが、出来ればこ...
また、動作に関しても完璧とは言えず、最初は、光センサーは...
終了行:
[[2017a/Member]]
#contents
*Mission2 [#x2228c16]
&ref(2017a/Mission2/2017a-mission2.png,100%,);
今回は光センサーを使って上のようなコースの線上を伝って、...
自分の作ったロボットは、「A→E→P→Q→R→T(一周して)→H→G→S→Q...
詳しくは[[Mission2:http://yakushi.shinshu-u.ac.jp/robotic...
*機構説明 [#jea9c75d]
&ref(2017a/Member/tsukuzin/Mission2/IMG_0308.jpg,15%);
&ref(2017a/Member/tsukuzin/Mission2/IMG_0310.jpg,24%);
&ref(2017a/Member/tsukuzin/Mission2/setumei.gif,30%);
4つではなく3つのタイヤを使用することで旋回しやすくした。
また後輪はできるだけ摩擦を小さくするためにゴムタイヤのゴ...
3つ目の画像は後輪のタイヤを示している。敢えてシャフトを...
またMission1の反省点であるバランスに関しても今回はリモコ...
*プログラムについて [#x923757a]
**使用した定義 [#l75cae2e]
#define hazime() mae_susumu; Wait(60);
#define mae_susumu OnFwd(OUT_AC); //前進する
#define senkai_migi() OnFwd(OUT_A); OnRev(OUT_C); //大...
#define kaiten_migi() OnFwd(OUT_A); //小さく右に曲がる
#define senkai_hidari() OnFwd(OUT_C); OnRev(OUT_A);//大...
#define kaiten_hidari() OnFwd(OUT_C);//小さく左に曲がる
#define teisi(t) Off(OUT_AC); Wait(t); //t秒だけ停止
#define handantime 25 //交差点、曲がり角かの判断の時間
#define end() mae_susumu; Wait(60);
Mission1で使用した定義をそのまま使用したかったが、ライン...
#define sakai 45
のように定義していたが、場所、時間によって光センサーの値...
sakai+5 > SENSOR_2
のような不等式で動作するとき、値を変更するのが少し面倒で...
確かに定義したほうが見やすいが、今回は修正のしやすさを優...
**サブルーチンについて [#cad2dffb]
***ライントレース部分 [#mcb1497a]
sub lineI() //最初の線の内側(右側)を走る
{
ClearTimer(0);
while(FastTimer(0)<handantime)
{
if(SENSOR_2 >= 47)
{
senkai_hidari();
ClearTimer(0);
}
else if (SENSOR_2 >= 45)
{
mae_susumu;
ClearTimer(0);
}
else if (SENSOR_2 >= 38)
{
senkai_migi();
}
}
}
sub lineO() //最初の線の外側(左側)を走る
{
ClearTimer(0);
while(FastTimer(0)<handantime)
{
if(SENSOR_2 >= 47)
{
senkai_migi();
ClearTimer(0);
}
else if (SENSOR_2 >= 45)
{
mae_susumu;
Wait(2);
ClearTimer(0);
}
else if (SENSOR_2 >= 38)
{
senkai_hidari();
}
}
}
「lineO」を例にとってフローチャートにすると次のようになる。
&ref(2017a/Member/tsukuzin/Mission2/フローチャート2.png,1...
始めにタイマーをリセットする。次に「while(FastTimer(0)<ha...
***交差点、曲がり角の判断 [#o6814c61]
sub kousatenQ() //交差点Qを通るときに使用する
{
PlaySound(SOUND_UP);
ClearTimer(1);
}
sub kousatenR() //交差点Rを通るときに使用する
{
PlaySound(SOUND_UP);
senkai_hidari();
Wait(70);
ClearTimer(1);
}
sub kousatenTORS()
{
teisi(100);
PlaySound(SOUND_DOWN);
mae_susumu;
Wait(50);
ClearTimer(1);
}
sub kakuEHGF() //曲がり角EHGFを通るときに使用する
{
PlaySound(SOUND_UP);
ClearTimer(1);
}
sub kousatenPM() //交差点Pを通るとき(戻る)に使用する
{
teisi(100);
PlaySound(SOUND_UP);
mae_susumu;
Wait(36);
ClearTimer(1);
}
交差点に差し掛かったら停止したり、音を鳴らしたりする。
最初はサブルーチンが8つまでしか使えないことを忘れていて、...
本来サブルーチンに交差点を通った回数を足していく予定だっ...
**タスクメイン [#a7090820]
task main ()
{
SetSensor(SENSOR_2, SENSOR_LIGHT);
SetPower(OUT_AC,1);
ClearTimer(1); //走行時間の測定
int X=0; //交差点、T字路の回数を測定
hazime();
while(X<12)
{
lineI();
if(Timer(1)>50 && X==0)
{
X++;
kakuEHGF(); //E地点を右折
}
lineI();
if(Timer(1)>30 && X==1)
{
X++;
kousatenPI();//P地点を左折
}
lineO();
if(Timer(1)>30 && X==2 )
{
X++;
kousatenQ();//Q地点を直進
mae_susumu;
Wait(50);
}
lineO();
if(Timer(1)>30 && X==3 )
{
X++;
kousatenR(); //R地点を左折
}
lineO();
if(Timer(1)>30 && X==4 )
{
X++;
kousatenTORS(); //T地点を直進
}
lineO();
if(Timer(1)>30 && X==5 )
{
X++;
kousatenTORS();//T地点を直進
}
lineI();
if(Timer(1)>30 && X==6 )
{
X++;
kakuEHGF(); //直角Hを曲がる
}
lineI();
if(Timer(1)>30 && X==7 )
{
X++;
kakuEHGF(); //直角Gを曲がる
}
lineI();
if(Timer(1)>30 && X==8 )
{
X++;
kousatenTORS(); //地点Sを左折
}
lineO();
if(Timer(1)>30 && X==9 )
{
X++;
kousatenPM(); //地点Pを直進
}
lineO();
if(Timer(1)>30 && X==10 )
{
X++;
kousatenQ();// 地点Qを左折
senkai_hidari();
Wait(50);
}
lineO();
if(Timer(1)>30 && X==11 )
{
X++;
kakuEHGF();
}
lineO();
}
end();
}
大まかにはライントレース→交差点判断→ライントレース・・・...
最初に走行時間をTimer(1)で記録、交差点と曲がり角の回数を...
条件、「Timer(1)>○○ && X==○○」を満たさなければライントレ...
***タスクメインについて気が付いたこと [#la1b392c]
このプログラムで動かすと稀に「lineO」の動作(線の左側を走...
lineI();
if(Timer(1)>30 && X==1)
{
X++;
kousatenPI();//P地点を左折
}
lineO();
この誤作動がよく発生した「P地点左折」付近のプログラムのフ...
if文の条件を満たさず、偽のルート通った際、そのまま「lineI...
&ref(2017a/Member/tsukuzin/Mission2/フローチャート3.png,1...
&ref(2017a/Member/tsukuzin/Mission2/フローチャート4.png,1...
よって正しく動作させるためには、下のようにする必要があっ...
lineI();
if(Timer(1)>30 && X==1)
{
X++;
kousatenPI();//P地点を左折
}
else
{
lineI();
}
lineO();
ロボットを実際に動かしている際は「Timer(1)>30」の30の値を...
*反省 [#taf1dd25]
Mission1も電圧の変化によって書かれる線が全く異なってしま...
プログラミングもif文とwhile文を重ねて使用するので、実際に...
通った交差点の判断として変数「X」を使用したが、出来ればこ...
また、動作に関しても完璧とは言えず、最初は、光センサーは...
ページ名: