2017a/Member/alien/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
目次
#contents
*課題について [#z69071de]
E地点右折コースを選択した。
詳しくは[[2017a/Mission2]]を参照
*ロボットについて [#l5e96153]
プログラミングを工夫することによってロボットは基本の形にした。
#ref(2017a/Member/alien/Mission2/syoumen.jpg,50%)
地面とセンサーを近づけることによってより値を正確にできた。
#ref(2017a/Member/alien/Mission2/yoko.jpg,50%)
*ロボットの通るコースについて [#w02e146c]
#ref(2017a/Member/alien/Mission2/yajirusi.jpg,50%)
ラインどりを2種類つかう方法を採用した。
**前半 [#f6542ea5]
#ref(2017a/Member/alien/Mission2/zenzenzenzen.jpg,70%)
**後半 [#f469a598]
#ref(2017a/Member/alien/Mission2/koukoukou.jpg,70%)
*プログラミングについて [#o9339bda]
**交差点の判別 [#q26792ca]
CurrentTick()がtimemaxを超えるとライントレースをやめるようになっている。また黒以外では、CurrentTick()がリセットされる。よって交差点は黒が続くので、CurrentTick()がリセットされることがなく、timemaxを超えて止まるという仕組みである。
**定義 [#wfef72a7]
#define White 63
#define Gray 50
#define WhiteGray 58
#define BlackGray 43
#define go_st OnFwd(OUT_BC,50);
#define spin_left OnFwd(OUT_B,25);OnRev(OUT_C,25);
#define spin_right OnFwd(OUT_C,25);OnRev(OUT_B,25);
#define turn_left OnFwd(OUT_B,50);
#define turn_right OnFwd(OUT_C,50);
#define pose(int t) Off(OUT_BC);Wait(t)
**サブルーチン [#kbbcf09d]
sub line_uchi(long timemax)//timemax秒間内側のライン取り
{
long t0=CurrentTick();
while(CurrentTick()-t0<timemax){
if (SENSOR_1>White) {
spin_left;
t0=CurrentTick();
} else if (SENSOR_1>WhiteGray) {
turn_left;
t0=CurrentTick();
} else if (SENSOR_1>Gray) {
go_st;
t0=CurrentTick();
} else if (SENSOR_1>BlackGray) {
turn_right;
t0=CurrentTick();
} else {
spin_right;
}
}
}
sub line_soto(long timemax)//timemax秒間外側のライン取り
{
long t0=CurrentTick();
while(CurrentTick()-t0<timemax){
if (SENSOR_1>White) {
spin_right;
t0=CurrentTick();
} else if (SENSOR_1>WhiteGray) {
turn_right;
t0=CurrentTick();
} else if (SENSOR_1>Gray) {
go_st;
t0=CurrentTick();
} else if (SENSOR_1>BlackGray) {
turn_left;
t0=CurrentTick();
} else {
spin_left;
}
}
Off(OUT_BC);
}
**前半(A~S) [#z36be02d]
ロボットの通るコースについての前半を参照
task main()
{
SetSensorLight(S1);
go_st;
Wait(1100);
line_uchi(230);
OnFwd(OUT_BC,50);
PlaySound(SOUND_UP);//E右折
Wait(20);
line_soto(180);
pose(100);
PlaySound(SOUND_DOWN);//P一時停止
line_soto(190);
turn_right;
PlaySound(SOUND_UP);//Q直進
Wait(100);
line_soto(110);
OnFwd(OUT_BC,50);
PlaySound(SOUND_UP);//R左折
Wait(100);
Off(OUT_BC);
line_uchi(230);
pose(100);
PlaySound(SOUND_DOWN);//T一時停止
turn_left;
Wait(300);
Off(OUT_BC);
line_uchi(230);
pose(100);
PlaySound(SOUND_DOWN);//T一時停止
turn_left;
Wait(300);
Off(OUT_BC);
line_uchi(230);
PlaySound(SOUND_UP);//H
Off(OUT_BC);
repeat(13){
line_uchi(200);
}
OnFwd(OUT_BC,20);
PlaySound(SOUND_UP);//G
Wait(500);
line_soto(180);
pose(100);
PlaySound(SOUND_DOWN);//S左折
**後半(S~A) [#ub10d894]
ロボットの通るコースについての後半を参照
line_soto(180);
turn_right;
PlaySound(SOUND_UP);//P直進
Wait(100);
line_soto(120);;
OnFwd(OUT_BC,20);
PlaySound(SOUND_UP);//Q
Wait(500);
line_uchi(200);
PlaySound(SOUND_UP);//F
Off(OUT_BC);
line_uchi(180);
pose(100);
PlaySound(SOUND_DOWN);//A
}
*工夫した点 [#xc3470e3]
HからGまでのルートの2つ目の急カーブを止まらず曲がりきろうとするとtimemaxの値が大きくなり、GでSOUND_UPを鳴らすことが出来なくなってしまったので、repeatを用いてtimemaxの値が短いものをいくつも繰り返すことで曲がりきりGでも止まることができた。しかし、まれに曲がりきれない場合もあり改善が必要だと感じた。
終了行:
目次
#contents
*課題について [#z69071de]
E地点右折コースを選択した。
詳しくは[[2017a/Mission2]]を参照
*ロボットについて [#l5e96153]
プログラミングを工夫することによってロボットは基本の形にした。
#ref(2017a/Member/alien/Mission2/syoumen.jpg,50%)
地面とセンサーを近づけることによってより値を正確にできた。
#ref(2017a/Member/alien/Mission2/yoko.jpg,50%)
*ロボットの通るコースについて [#w02e146c]
#ref(2017a/Member/alien/Mission2/yajirusi.jpg,50%)
ラインどりを2種類つかう方法を採用した。
**前半 [#f6542ea5]
#ref(2017a/Member/alien/Mission2/zenzenzenzen.jpg,70%)
**後半 [#f469a598]
#ref(2017a/Member/alien/Mission2/koukoukou.jpg,70%)
*プログラミングについて [#o9339bda]
**交差点の判別 [#q26792ca]
CurrentTick()がtimemaxを超えるとライントレースをやめるようになっている。また黒以外では、CurrentTick()がリセットされる。よって交差点は黒が続くので、CurrentTick()がリセットされることがなく、timemaxを超えて止まるという仕組みである。
**定義 [#wfef72a7]
#define White 63
#define Gray 50
#define WhiteGray 58
#define BlackGray 43
#define go_st OnFwd(OUT_BC,50);
#define spin_left OnFwd(OUT_B,25);OnRev(OUT_C,25);
#define spin_right OnFwd(OUT_C,25);OnRev(OUT_B,25);
#define turn_left OnFwd(OUT_B,50);
#define turn_right OnFwd(OUT_C,50);
#define pose(int t) Off(OUT_BC);Wait(t)
**サブルーチン [#kbbcf09d]
sub line_uchi(long timemax)//timemax秒間内側のライン取り
{
long t0=CurrentTick();
while(CurrentTick()-t0<timemax){
if (SENSOR_1>White) {
spin_left;
t0=CurrentTick();
} else if (SENSOR_1>WhiteGray) {
turn_left;
t0=CurrentTick();
} else if (SENSOR_1>Gray) {
go_st;
t0=CurrentTick();
} else if (SENSOR_1>BlackGray) {
turn_right;
t0=CurrentTick();
} else {
spin_right;
}
}
}
sub line_soto(long timemax)//timemax秒間外側のライン取り
{
long t0=CurrentTick();
while(CurrentTick()-t0<timemax){
if (SENSOR_1>White) {
spin_right;
t0=CurrentTick();
} else if (SENSOR_1>WhiteGray) {
turn_right;
t0=CurrentTick();
} else if (SENSOR_1>Gray) {
go_st;
t0=CurrentTick();
} else if (SENSOR_1>BlackGray) {
turn_left;
t0=CurrentTick();
} else {
spin_left;
}
}
Off(OUT_BC);
}
**前半(A~S) [#z36be02d]
ロボットの通るコースについての前半を参照
task main()
{
SetSensorLight(S1);
go_st;
Wait(1100);
line_uchi(230);
OnFwd(OUT_BC,50);
PlaySound(SOUND_UP);//E右折
Wait(20);
line_soto(180);
pose(100);
PlaySound(SOUND_DOWN);//P一時停止
line_soto(190);
turn_right;
PlaySound(SOUND_UP);//Q直進
Wait(100);
line_soto(110);
OnFwd(OUT_BC,50);
PlaySound(SOUND_UP);//R左折
Wait(100);
Off(OUT_BC);
line_uchi(230);
pose(100);
PlaySound(SOUND_DOWN);//T一時停止
turn_left;
Wait(300);
Off(OUT_BC);
line_uchi(230);
pose(100);
PlaySound(SOUND_DOWN);//T一時停止
turn_left;
Wait(300);
Off(OUT_BC);
line_uchi(230);
PlaySound(SOUND_UP);//H
Off(OUT_BC);
repeat(13){
line_uchi(200);
}
OnFwd(OUT_BC,20);
PlaySound(SOUND_UP);//G
Wait(500);
line_soto(180);
pose(100);
PlaySound(SOUND_DOWN);//S左折
**後半(S~A) [#ub10d894]
ロボットの通るコースについての後半を参照
line_soto(180);
turn_right;
PlaySound(SOUND_UP);//P直進
Wait(100);
line_soto(120);;
OnFwd(OUT_BC,20);
PlaySound(SOUND_UP);//Q
Wait(500);
line_uchi(200);
PlaySound(SOUND_UP);//F
Off(OUT_BC);
line_uchi(180);
pose(100);
PlaySound(SOUND_DOWN);//A
}
*工夫した点 [#xc3470e3]
HからGまでのルートの2つ目の急カーブを止まらず曲がりきろうとするとtimemaxの値が大きくなり、GでSOUND_UPを鳴らすことが出来なくなってしまったので、repeatを用いてtimemaxの値が短いものをいくつも繰り返すことで曲がりきりGでも止まることができた。しかし、まれに曲がりきれない場合もあり改善が必要だと感じた。
ページ名: