- 追加された行はこの色です。
- 削除された行はこの色です。
[[2013b/Member]]
あ
#ls2(abc)
目次
#contents
*ロボットの説明 [#n4ecc57c]
**機能 [#w8e12f76]
-軽量化重視で、サーボモーターX2だけ
-空き缶を動かすときの手の大きさを簡単調整
&ref(photo.jpg);
*攻略 [#n4ecc57c]
-開始→T字路→交差点→交差点→交差点→急カーブ→交差点→ヘアピン→T字路→終了
*プログラムの説明 [#kf9b3bd3]
#define VERY_WHITE THRESHOLD+7
#define WHITE THRESHOLD+3
#define THRESHOLD 53
#define BLACK THRESHOLD-2
#define VERY_BLACK THRESHOLD-8
#define SPEED_H 35
#define SPEED_L 25
#define OnRL(speedR,speedL) OnFwd(OUT_A,speedR);OnFwd(OUT_C,speedL);
#define go_foward OnRL(SPEED_H,SPEED_H);
#define spin_left1 OnRL(SPEED_L+10,-SPEED_L);
#define turn_left0 OnRL(SPEED_L,0);
#define turn_right0 OnRL(0,SPEED_L);
#define spin_right1 OnRL(-SPEED_L,SPEED_L+10);
#define STEP 1
#define nMAX 240
#define short_break Off(OUT_AC);Wait(100);
#define CROSS_TIME 800
#define cross_line OnRL(SPEED_L,SPEED_L);Wait(CROSS_TIME);short_break;
#define stuck_time 3000
#define DO 523
#define RE 587
#define MI 659
#define FA 698
#define curve_time 29000
#define start_time 20000
#define swiching_time 5000
#define after_cross 7000
task main()
{//1
SetSensorLight(S3);
int RUN=0;//main while() program
int nOnline=0;//Black counter
int fOnline=0;
int CrossCount=0;//Counts of crossed lines
int FinalSwitch=0;
long t0,t1,t2,t3 = CurrentTick();
-発信後は白と黒の境界線を"starting_time"だけなぞって進む。
t1=CurrentTick();//Set t1
while(CurrentTick()-t1<start_time){//2
//While start_time
if(SENSOR_3<VERY_BLACK){//1'
spin_left1;PlayTone(DO,1);
}//1'
else {//2'
if(SENSOR_3<BLACK){//3'
turn_left0;PlayTone(DO,1);
}//3'
else if(SENSOR_3<WHITE){//4'
go_foward;PlayTone(RE,1);
}//4'
else if(SENSOR_3<VERY_WHITE){//5'
turn_right0;PlayTone(MI,1);
}//5'
else {//6'
spin_right1;PlayTone(FA,1);
}//6'
}//2'
}//2
//End of "While start_time"
-starting_time後は交差点を意識して進行する。
while(RUN==0){//3
//Main Program
while(nOnline<nMAX){//4
//Basic cross finding
if(SENSOR_3<VERY_BLACK){//5
spin_left1;PlayTone(DO,1);
nOnline++;
}//5
else {//6
if(SENSOR_3<BLACK){//7
turn_left0;PlayTone(DO,1);
}//7
else if(SENSOR_3<WHITE){//8
go_foward;PlayTone(RE,1);
}//8
else if(SENSOR_3<VERY_WHITE){//9
turn_right0;PlayTone(MI,1);
}//9
else {//10
spin_right1;PlayTone(FA,1);
}//10
nOnline=0;
}//6
}//4
//End of Basic cross finding
short_break;PlaySound(SOUND_CLICK);
spin_right1;Wait(nMAX*STEP/2);
cross_line;
PlaySound(SOUND_UP);
CrossCount +=1;
nOnline=0;
-交差点を2つ通過した後、黒線の反対側の境界線をなぞるようにする。これは3つ目から4つ目の交差点の間の急なカーブを交差点と反応させないためである。
while(CrossCount==2){//1'' Hit second cross line
turn_right0;PlayTone(RE,1);Wait(1000);
while(nOnline<nMAX){//4
//Backwards cross finding
if(SENSOR_3<VERY_BLACK){//5
spin_right1;PlayTone(DO,1);
nOnline++;
}//5
else {//6
if(SENSOR_3<BLACK){//7
turn_right0;PlayTone(DO,1);
}//7
else if(SENSOR_3<WHITE){//8
go_foward;PlayTone(RE,1);
}//8
else if(SENSOR_3<VERY_WHITE){//9
turn_left0;PlayTone(MI,1);
}//9
else {//10
spin_left1;PlayTone(FA,1);
}//10
nOnline=0;
}//6
}//4
//End of Backwards cross finding
short_break;PlaySound(SOUND_CLICK);
spin_left1;Wait(nMAX*STEP/2);
cross_line;
PlaySound(SOUND_UP);
CrossCount +=1;
nOnline=0;
}//1'' end of Hit second cross line
-交差点を3つ目通過
while(CrossCount==3){//1'' Hit third cross line
while(nOnline<nMAX){//4
//Backwards cross finding
if(SENSOR_3<VERY_BLACK){//5
spin_right1;PlayTone(DO,1);
nOnline++;
}//5
else {//6
if(SENSOR_3<BLACK){//7
turn_right0;PlayTone(DO,1);
}//7
else if(SENSOR_3<WHITE){//8
go_foward;PlayTone(RE,1);
}//8
else if(SENSOR_3<VERY_WHITE){//9
turn_left0;PlayTone(MI,1);
}//9
else {//10
spin_left1;PlayTone(FA,1);
}//10
nOnline=0;
}//6
}//4
//End of Backwards cross finding
short_break;PlaySound(SOUND_CLICK);
spin_left1;Wait(nMAX*STEP/2);
cross_line;
PlaySound(SOUND_UP);
FinalSwitch +=1;
CrossCount +=5;
RUN +=1;
nOnline=0;
}//1'' end of Hit third cross line
}//3 End of Main Program
-4つ目の交差点を通過。switch_time後にたどる黒の境界線を逆にする。
while(FinalSwitch==1){//1'''' Hits final line
PlaySound(SOUND_UP);
t2=CurrentTick();
while(CurrentTick()-t2<swiching_time){//2''''
if(SENSOR_3<VERY_BLACK){//3''''
spin_right1;PlayTone(DO,1);
}//3''''
else {//4''''
if(SENSOR_3<BLACK){//5''''
turn_right0;PlayTone(DO,1);
}//5''''
else if(SENSOR_3<WHITE){//6''''
go_foward;PlayTone(RE,1);
}//6''''
else if(SENSOR_3<VERY_WHITE){//7''''
turn_left0;PlayTone(MI,1);
}//7''''
else {//8''''
spin_left1;PlayTone(FA,1);
}//8''''
}//4''''
}//2''''
spin_left1;PlayTone(DO,1);Wait(400);
nOnline=0;
t3=CurrentTick();
while(CurrentTick()-t3<after_cross){//2
//While after_cross
if(SENSOR_3<VERY_BLACK){//1'
spin_left1;PlayTone(DO,1);
}//1'
else {//2'
if(SENSOR_3<BLACK){//3'
turn_left0;PlayTone(DO,1);
}//3'
else if(SENSOR_3<WHITE){//4'
go_foward;PlayTone(RE,1);
}//4'
else if(SENSOR_3<VERY_WHITE){//5'
turn_right0;PlayTone(MI,1);
}//5'
else {//6'
spin_right1;PlayTone(FA,1);
}//6'
}//2'
}//2
//End of "While after_cross"
-T字を意識した進行。
while(fOnline<nMAX){//4
//Final cross finding
if(SENSOR_3<VERY_BLACK){//5
spin_left1;PlayTone(DO,1);
fOnline++;
}//5
else {//6
if(SENSOR_3<BLACK){//7
turn_left0;PlayTone(DO,1);
}//7
else if(SENSOR_3<WHITE){//8
go_foward;PlayTone(RE,1);
}//8
else if(SENSOR_3<VERY_WHITE){//9
turn_right0;PlayTone(MI,1);
}//9
else {//10
spin_right1;PlayTone(FA,1);
}//10
fOnline=0;
}//6
}//4
//End of Final cross finding
PlaySound(SOUND_UP);
FinalSwitch +=1;
}//1'''' End of Hits final line
-T字路にぶつかった後、スタート地点に戻る。
go_foward;PlayTone(RE,1);Wait(400);
spin_left1;Wait(400);
go_foward;Wait(400);
spin_left1;Wait(3000);
PlaySound(SOUND_DOWN);
Off(OUT_AC);
}//1
*課題を振り返って [#n4ecc57c]
プログラムを書き込むにつれて、いくつかの原因がよくわからなかったバグに直面した。プログラムを何度も何度も見返して、時間のロスがどんどん大きくなってしまいました(中にはバッテリー残量が30%だけで止まってしまうものもありました)。そのため、一周させようとするだけで時間が来てしまい、空き缶をどかすことに手を回せず、悔しい思いでいっぱいです。