2013b/Member/tydn1212/Mission1
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
目次
#contents
*ロボットの説明 [#n4ecc57c]
**機能 [#w8e12f76]
ライントレース
**製作者 [#gcb5c86e]
半分アメリカ人
#ref(2013b/Member/tydn1212/Mission1/nxt.jpg,100%,ロボット)
-センサーに干渉しないよう、アームが前方に伸びている。
*課題 [#afcadcf0]
コースをライントレースして走り、コース上にある障害物の空き缶二つを撤去して一周する。右回り、左回りどちらもできるようにする。
*プログラム [#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_left OnRL(SPEED_L+10,-SPEED_L);
#define turn_left OnRL(SPEED_L,0);
#define turn_right OnRL(0,SPEED_L);
#define spin_right 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
-発信後は白と黒の境界線を"starting_time"だけなぞって進む。
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();
t1=CurrentTick();//Set t1
while(CurrentTick()-t1<start_time){//2
//While start_time
if(SENSOR_3<VERY_BLACK){//1'
spin_right;
}//1'
else {//2'
if(SENSOR_3<BLACK){//3'
turn_right;
}//3'
else if(SENSOR_3<WHITE){//4'
go_foward;
}//4'
else if(SENSOR_3<VERY_WHITE){//5'
turn_left;
}//5'
else {//6'
spin_left;
}//6'
}//2'
}//2
//End of "While start_time"
-starting_time後は交差点を意識して進行する。
turn_left;Wait(800);
while(RUN==0){//3
//First Cross Detect
while(nOnline<nMAX){//4
//Basic cross finding
if(SENSOR_3<VERY_BLACK){//5
spin_left;
nOnline++;
}//5
else {//6
if(SENSOR_3<BLACK){//7
turn_left;
}//7
else if(SENSOR_3<WHITE){//8
go_foward;
}//8
else if(SENSOR_3<VERY_WHITE){//9
turn_right;
}//9
else {//10
spin_right;
}//10
nOnline=0;
}//6
}//4
//End of First Cross Detect
short_break;PlaySound(SOUND_CLICK);
spin_right;Wait(nMAX*STEP/2);
cross_line;
PlaySound(SOUND_UP);
CrossCount +=1;
nOnline=0;
-急なカーブを交差点と誤認させないために、黒線の反対側の境界線をなぞるようにする。
while(CrossCount==2){//1'' Hit second cross line
turn_left;Wait(1000);
while(nOnline<nMAX){//4
//Backwards cross finding
if(SENSOR_3<VERY_BLACK){//5
spin_right;
nOnline++;
}//5
else {//6
if(SENSOR_3<BLACK){//7
turn_right;
}//7
else if(SENSOR_3<WHITE){//8
go_foward;
}//8
else if(SENSOR_3<VERY_WHITE){//9
turn_left;
}//9
else {//10
spin_left;
}//10
nOnline=0;
}//6
}//4
//End of Backwards cross finding
short_break;PlaySound(SOUND_CLICK);
spin_right;Wait(nMAX*STEP/2);
cross_line;
PlaySound(SOUND_UP);
CrossCount +=1;
nOnline=0;
}//1'' end of Hit second cross line
while(CrossCount==3){//1''' Hit third cross line
turn_left;;Wait(1000);
while(nOnline<nMAX){//4
//Backwards cross finding
if(SENSOR_3<VERY_BLACK){//5
spin_right;
nOnline++;
}//5
else {//6
if(SENSOR_3<BLACK){//7
turn_right;
}//7
else if(SENSOR_3<WHITE){//8
go_foward;
}//8
else if(SENSOR_3<VERY_WHITE){//9
turn_left;
}//9
else {//10
spin_left;
}//10
nOnline=0;
}//6
}//4
//End of Backwards cross finding
short_break;PlaySound(SOUND_CLICK);
spin_right;Wait(nMAX*STEP/2);
cross_line;
PlaySound(SOUND_UP);
CrossCount +=5;
FinalSwitch +=1;
nOnline=0;
}//1''' end of Hit third cross line
}//3 End of Main Program
-switch_time後にたどる黒の境界線を逆にする。
while(FinalSwitch==1){//1'''' Hits final line
PlaySound(SOUND_UP);
spin_right;Wait(400);
nOnline=0;
t3=CurrentTick();
while(CurrentTick()-t3<after_cross){//2
//While after_cross
if(SENSOR_3<VERY_BLACK){//1'
spin_right;
}//1'
else {//2'
if(SENSOR_3<BLACK){//3'
turn_right;
}//3'
else if(SENSOR_3<WHITE){//4'
go_foward;
}//4'
else if(SENSOR_3<VERY_WHITE){//5'
turn_left;
}else {//6'
spin_left;
}//6'
}//2'
}//2
//End of "While after_cross"
while(fOnline<nMAX){//4
//Final cross finding
if(SENSOR_3<VERY_BLACK){//5
spin_left;
fOnline++;
}//5
else {//6
if(SENSOR_3<BLACK){//7
turn_left;
}//7
else if(SENSOR_3<WHITE){//8
go_foward;
}//8
else if(SENSOR_3<VERY_WHITE){//9
turn_right;
}//9
else {//10
spin_right;
}//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_left;Wait(400);
go_foward;Wait(400);
spin_left;Wait(3000);
PlaySound(SOUND_DOWN);
Off(OUT_AC);
}//1
*総括 [#s2ed4ab2]
一進一退を繰り返していたが、根気よくプログラミングできなかった。結果的に、十分に時間をかけて調整しなかったため、1周することなく終わってしまった。
終了行:
目次
#contents
*ロボットの説明 [#n4ecc57c]
**機能 [#w8e12f76]
ライントレース
**製作者 [#gcb5c86e]
半分アメリカ人
#ref(2013b/Member/tydn1212/Mission1/nxt.jpg,100%,ロボット)
-センサーに干渉しないよう、アームが前方に伸びている。
*課題 [#afcadcf0]
コースをライントレースして走り、コース上にある障害物の空き缶二つを撤去して一周する。右回り、左回りどちらもできるようにする。
*プログラム [#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_left OnRL(SPEED_L+10,-SPEED_L);
#define turn_left OnRL(SPEED_L,0);
#define turn_right OnRL(0,SPEED_L);
#define spin_right 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
-発信後は白と黒の境界線を"starting_time"だけなぞって進む。
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();
t1=CurrentTick();//Set t1
while(CurrentTick()-t1<start_time){//2
//While start_time
if(SENSOR_3<VERY_BLACK){//1'
spin_right;
}//1'
else {//2'
if(SENSOR_3<BLACK){//3'
turn_right;
}//3'
else if(SENSOR_3<WHITE){//4'
go_foward;
}//4'
else if(SENSOR_3<VERY_WHITE){//5'
turn_left;
}//5'
else {//6'
spin_left;
}//6'
}//2'
}//2
//End of "While start_time"
-starting_time後は交差点を意識して進行する。
turn_left;Wait(800);
while(RUN==0){//3
//First Cross Detect
while(nOnline<nMAX){//4
//Basic cross finding
if(SENSOR_3<VERY_BLACK){//5
spin_left;
nOnline++;
}//5
else {//6
if(SENSOR_3<BLACK){//7
turn_left;
}//7
else if(SENSOR_3<WHITE){//8
go_foward;
}//8
else if(SENSOR_3<VERY_WHITE){//9
turn_right;
}//9
else {//10
spin_right;
}//10
nOnline=0;
}//6
}//4
//End of First Cross Detect
short_break;PlaySound(SOUND_CLICK);
spin_right;Wait(nMAX*STEP/2);
cross_line;
PlaySound(SOUND_UP);
CrossCount +=1;
nOnline=0;
-急なカーブを交差点と誤認させないために、黒線の反対側の境界線をなぞるようにする。
while(CrossCount==2){//1'' Hit second cross line
turn_left;Wait(1000);
while(nOnline<nMAX){//4
//Backwards cross finding
if(SENSOR_3<VERY_BLACK){//5
spin_right;
nOnline++;
}//5
else {//6
if(SENSOR_3<BLACK){//7
turn_right;
}//7
else if(SENSOR_3<WHITE){//8
go_foward;
}//8
else if(SENSOR_3<VERY_WHITE){//9
turn_left;
}//9
else {//10
spin_left;
}//10
nOnline=0;
}//6
}//4
//End of Backwards cross finding
short_break;PlaySound(SOUND_CLICK);
spin_right;Wait(nMAX*STEP/2);
cross_line;
PlaySound(SOUND_UP);
CrossCount +=1;
nOnline=0;
}//1'' end of Hit second cross line
while(CrossCount==3){//1''' Hit third cross line
turn_left;;Wait(1000);
while(nOnline<nMAX){//4
//Backwards cross finding
if(SENSOR_3<VERY_BLACK){//5
spin_right;
nOnline++;
}//5
else {//6
if(SENSOR_3<BLACK){//7
turn_right;
}//7
else if(SENSOR_3<WHITE){//8
go_foward;
}//8
else if(SENSOR_3<VERY_WHITE){//9
turn_left;
}//9
else {//10
spin_left;
}//10
nOnline=0;
}//6
}//4
//End of Backwards cross finding
short_break;PlaySound(SOUND_CLICK);
spin_right;Wait(nMAX*STEP/2);
cross_line;
PlaySound(SOUND_UP);
CrossCount +=5;
FinalSwitch +=1;
nOnline=0;
}//1''' end of Hit third cross line
}//3 End of Main Program
-switch_time後にたどる黒の境界線を逆にする。
while(FinalSwitch==1){//1'''' Hits final line
PlaySound(SOUND_UP);
spin_right;Wait(400);
nOnline=0;
t3=CurrentTick();
while(CurrentTick()-t3<after_cross){//2
//While after_cross
if(SENSOR_3<VERY_BLACK){//1'
spin_right;
}//1'
else {//2'
if(SENSOR_3<BLACK){//3'
turn_right;
}//3'
else if(SENSOR_3<WHITE){//4'
go_foward;
}//4'
else if(SENSOR_3<VERY_WHITE){//5'
turn_left;
}else {//6'
spin_left;
}//6'
}//2'
}//2
//End of "While after_cross"
while(fOnline<nMAX){//4
//Final cross finding
if(SENSOR_3<VERY_BLACK){//5
spin_left;
fOnline++;
}//5
else {//6
if(SENSOR_3<BLACK){//7
turn_left;
}//7
else if(SENSOR_3<WHITE){//8
go_foward;
}//8
else if(SENSOR_3<VERY_WHITE){//9
turn_right;
}//9
else {//10
spin_right;
}//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_left;Wait(400);
go_foward;Wait(400);
spin_left;Wait(3000);
PlaySound(SOUND_DOWN);
Off(OUT_AC);
}//1
*総括 [#s2ed4ab2]
一進一退を繰り返していたが、根気よくプログラミングできなかった。結果的に、十分に時間をかけて調整しなかったため、1周することなく終わってしまった。
ページ名: