- 追加された行はこの色です。
- 削除された行はこの色です。
目次
#contents
*ロボットの説明 [#n4ecc57c]
**機能 [#w8e12f76]
-軽量化重視
-しっかりと空き缶をつかむためのループ搭載
-しっかりと空き缶をつかむためのループ搭載()
-左右の重心を整えてある
#ref(a1.jpg)
#ref(a2.jpg)
#ref(a3.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 go_forward 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 //Time on black
#define short_break Off(OUT_AC);Wait(100);
#define CROSS_TIME 800 //Time to cross the line
#define cross_line OnRL(SPEED_L,SPEED_L);Wait(CROSS_TIME);short_break;
#define start_time 8000 //Time to finish the T cross
#define swiching_time 5000 //Time to switch the side of the line
#define after_cross 7000 //Time to wait after crossing the third cross
#define Can_Move_Time 15000
#define Grave_Can Off(OUT_AC);OnFwd(OUT_B,40);Wait(500);Off(OUT_B);Wait(100);
#define Release_Can OnRev(OUT_B,40);Wait(500);Off(OUT_B);Wait(100);
#define U_Turn OnRL(30,-30);Wait(2800);Off(OUT_AC);Wait(100);
#define Rev_U_Turn OnRL(-30,30);Wait(800);
#define Can_Move_Time 15000
#define Grave_Can Off(OUT_AC);OnFwd(OUT_B,40);Wait(500);Off(OUT_B);Wait(100);
#define Release_Can OnRev(OUT_B,40);Wait(500);Off(OUT_B);Wait(100);
#define U_Turn OnRL(30,-30);Wait(2800);Off(OUT_AC);Wait(100);
#define Rev_U_Turn OnRL(-30,30);Wait(800);
task main()
{//1
SetSensorLight(S3);
int RUN=0;//main while() program
int nOnline=0;//Black counter
int CrossCount=0;//Counts of crossed lines
int FinalSwitch=0;//Kill cross searching program
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'
while(CurrentTick()-t1<start_time){//While start_time
if(SENSOR_3<VERY_BLACK){
spin_left1;
}
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"
-空き缶を探すプログラムを始動
while(SensorUS(S1)>10){//0
if(SENSOR_3<VERY_BLACK){//1'
spin_left1;
}//1'
else {//2'
if(SENSOR_3<BLACK){//3'
if(SENSOR_3<BLACK){
turn_left0;
}//3'
else if(SENSOR_3<WHITE){//4'
}
else if(SENSOR_3<WHITE){
go_foward;
}//4'
else if(SENSOR_3<VERY_WHITE){//5'
}
else if(SENSOR_3<VERY_WHITE){
turn_right0;
}//5'
else {//6'
}
else {
spin_right1;
}//6'
}//2'
}//0
}
}
}//End of "While start_time"
-空き缶を探すプログラムを始動
while(SensorUS(S1)>10){
if(SENSOR_3<VERY_BLACK){
spin_left1;
}
else {
if(SENSOR_3<BLACK){
turn_left0;
}
else if(SENSOR_3<WHITE){
go_forward;
}/
else if(SENSOR_3<VERY_WHITE){
turn_right0;
}
else {
spin_right1;
}
}
}
-空き缶をつかんである程度黒線をだどってから180°回転して空き缶を放し、再び180°回転する。
Grave_Can;
t4=CurrentTick();//Set t4
while(CurrentTick()-t4<Can_Move_Time){//7' Trace line for "Can_Move_Time"
if(SENSOR_3<VERY_BLACK){//1'
spin_left1 OnRL(SPEED_L+5,-SPEED_L);Wait(1);
}//1'
else {//2'
if(SENSOR_3<BLACK){//3'
OnRL(SPEED_L-5,0);Wait(1);
}//3'
else if(SENSOR_3<WHITE){//4'
OnRL(SPEED_H-10,SPEED_H-10);Wait(1);
}//4'
else if(SENSOR_3<VERY_WHITE){//5'
OnRL(0,SPEED_L-5);Wait(1);
}//5'
else {//6'
OnRL(-SPEED_L,SPEED_L+5);Wait(1);
}//6'
}//2'
}//7' END €OF "Trace line for "Can_Move_Time""
U_Turn;
Release_Can;
OnRev(OUT_AC,SPEED_H);Wait(500);Off(OUT_AC);Wait(100);
Rev_U_Turn;
}//2
Grave_Can;
t4=CurrentTick();//Set t4
while(CurrentTick()-t4<Can_Move_Time){//Trace line for "Can_Move_Time"
if(SENSOR_3<VERY_BLACK){
spin_left1 OnRL(SPEED_L+5,-SPEED_L);Wait(1);
}
else {
if(SENSOR_3<BLACK){
OnRL(SPEED_L-5,0);Wait(1);
}
else if(SENSOR_3<WHITE){
OnRL(SPEED_H-10,SPEED_H-10);Wait(1);
}
else if(SENSOR_3<VERY_WHITE){
OnRL(0,SPEED_L-5);Wait(1);
}
else {
OnRL(-SPEED_L,SPEED_L+5);Wait(1);
}
}
}//END €OF "Trace line for "Can_Move_Time""
U_Turn;
Release_Can;
OnRev(OUT_AC,SPEED_H);Wait(500);Off(OUT_AC);Wait(100);//Set back for a moment
Rev_U_Turn;//U turn
}
-ここからは交差点を意識して進行する。
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
-ここからは交差点を意識して進行する。ちなみに"RUN"とは通常のライン・トレイスの間は0として、ライン・トレイスを終えるときに"RUN"が1となる。
while(RUN==0){//Main Program
while(nOnline<nMAX){//Basic cross finding
if(SENSOR_3<VERY_BLACK){
spin_left1;
nOnline++;
}
else {
if(SENSOR_3<BLACK){
turn_left0;
}
else if(SENSOR_3<WHITE){
go_forward;
}
else if(SENSOR_3<VERY_WHITE){
turn_right0;
}
else {
spin_right1;
}
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);
turn_right0;PlayTone(RE,1);Wait(1000);
while(nOnline<nMAX){//Backwards cross finding
if(SENSOR_3<VERY_BLACK){
spin_right1;
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
}
else {
if(SENSOR_3<BLACK){
turn_right0;
}
else if(SENSOR_3<WHITE){
go_foward;
}
else if(SENSOR_3<VERY_WHITE){
turn_left0;
}
else {
spin_left1;
}
nOnline=0;
}//6
}//4
//End of Backwards cross finding
}
}//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
}//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
while(CrossCount==3){// Hit third cross line
while(nOnline<nMAX){//Backwards cross finding
if(SENSOR_3<VERY_BLACK){
spin_right1;
nOnline++;
}
else {
if(SENSOR_3<BLACK){
turn_right0;
}
else if(SENSOR_3<WHITE){
go_forward;
}
else if(SENSOR_3<VERY_WHITE){
turn_left0;
}
else {
spin_left1;
}
nOnline=0;
}
}//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;
}//End of Hit third cross line
}//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);
while(FinalSwitch==1){//Hits final line
PlaySound(SOUND_UP);
t2=CurrentTick();
while(CurrentTick()-t2<switching_time){//Ignore the cross program for "switching_time"
if(SENSOR_3<VERY_BLACK){
spin_right1;
}
else {
if(SENSOR_3<BLACK){
turn_right0;
}
else if(SENSOR_3<WHITE){
go_forward;
}
else if(SENSOR_3<VERY_WHITE){
turn_left0;
}
else {
spin_left1;
}
}
}
spin_left1;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"
t3=CurrentTick();
while(CurrentTick()-t3<after_cross){//While the "after_cross"
if(SENSOR_3<VERY_BLACK){
spin_left1;
}
else {
if(SENSOR_3<BLACK){
turn_left0;
}
else if(SENSOR_3<WHITE){
go_forward;
}
else if(SENSOR_3<VERY_WHITE){
turn_right0;
}
else {
spin_right1;
}
}
}//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
while(nOnline<nMAX){//Final cross finding
if(SENSOR_3<VERY_BLACK){
spin_left1;
nOnline++;
}
else {
if(SENSOR_3<BLACK){
turn_left0;
}
else if(SENSOR_3<WHITE){
go_forward;
}
else if(SENSOR_3<VERY_WHITE){
turn_right0;
}
else {
spin_right1;
}
nOnline=0;
}
}//End of "Final cross finding"
PlaySound(SOUND_UP);
FinalSwitch +=1;
}//End of "Hits final line"
-T字路にぶつかった後、スタート地点に戻る。
go_foward;PlayTone(RE,1);Wait(400);
go_forward;Wait(400);
spin_left1;Wait(400);
go_foward;Wait(400);
go_forward;Wait(400);
spin_left1;Wait(3000);
PlaySound(SOUND_DOWN);
Off(OUT_AC);
}//1
*課題を振り返って [#n4ecc57c]
プログラムを書き込むにつれて、いくつかの原因がよくわからなかったバグに直面した。プログラムを何度も何度も見返して、時間のロスがどんどん大きくなってしまいました(中にはバッテリー残量が30%だけで止まってしまうものもありました)。そのため、空き缶を一つしかどかせず、マイナーな調整が必要であって完璧な走りを実現できませんでした。