/* LIGHT SENSORS ************* Sensor# blue white Port# Location -------------------------------------------------- 6 30 8 19 middle left 5 18 6 16 actual front left 3 40 10 22 side right 4 20 6 20 side left 7 77/160 15/56 18 center 1 14 4 23 middle right 2 22 6 17 actual front right -------------------------------------------------- */ #define LSP_MIDDLE_LEFT 19 #define LSP_MIDDLE_RIGHT 23 #define LSP_CENTER 18 #define LSP_SIDE_LEFT 20 #define LSP_SIDE_RIGHT 22 #define LSP_ACTUAL_FRONT_LEFT 16 #define LSP_ACTUAL_FRONT_RIGHT 17 /* #define LST_MIDDLE_LEFT 40 #define LST_MIDDLE_RIGHT 16 #define LST_CENTER 100 #define LST_SIDE_LEFT 23 #define LST_SIDE_RIGHT 43 #define LST_ACTUAL_FRONT_LEFT 32 #define LST_ACTUAL_FRONT_RIGHT 23 */ #define NSENSORS 7 #define LS_ACTUAL_FRONT_LEFT 0 #define LS_ACTUAL_FRONT_RIGHT 1 #define LS_CENTER 2 #define LS_MIDDLE_LEFT 3 #define LS_MIDDLE_RIGHT 4 #define LS_SIDE_LEFT 5 #define LS_SIDE_RIGHT 6 int lsports[NSENSORS]= { LSP_ACTUAL_FRONT_LEFT, LSP_ACTUAL_FRONT_RIGHT, LSP_CENTER, LSP_MIDDLE_LEFT, LSP_MIDDLE_RIGHT, LSP_SIDE_LEFT, LSP_SIDE_RIGHT }; /*int lstresh[NSENSORS]= { LST_ACTUAL_FRONT_LEFT, LST_ACTUAL_FRONT_RIGHT, LST_CENTER, LST_MIDDLE_LEFT, LST_MIDDLE_RIGHT, LST_SIDE_LEFT, LST_SIDE_RIGHT }; */ int lstresh[NSENSORS][2]; int majority; #define MANUAL_ORIENT 0 #define SP_REAR_SIDE_LEFT 9 #define SP_ACTUAL_REAR_LEFT 10 #define SP_ACTUAL_REAR_RIGHT 11 #define SP_REAR_SIDE_RIGHT 12 #define SP_FRONT_SIDE_LEFT 15 #define SP_ACTUAL_FRONT_RIGHT 13 #define SP_ACTUAL_FRONT_LEFT 14 #define SP_FRONT_SIDE_RIGHT 24 #define SP_IR_FRONT 28 #define SP_IR_BACK 30 #define SP_IR_RIGHT 29 #define SP_IR_LEFT 31 #define IR_FRONT 1 #define IR_BACK 2 #define IR_RIGHT 3 #define IR_LEFT 4 #define LEFT_SERVO 5 #define RIGHT_SERVO 4 #define RIGHT_DIFFTURN 750 #define LEFT_DIFFTURN 3500 /*#define LEFT_CENTER 1930 #define RIGHT_CENTER 2000 */ #define LEFT_CENTER 2240 #define RIGHT_CENTER 2000 #define FASTSPEED 100 #define FASTSPEED_CORR 65 #define SLOWSPEED 65 #define SLOWSPEED_CORR 40 #define LEFT_TURNED_LEFT 1240 #define RIGHT_TURNED_LEFT 1000 #define LEFT_TURNED_RIGHT 3240 #define RIGHT_TURNED_RIGHT 3000 #define RIGHT_MOTORS 0 #define LEFT_MOTORS 1 #define FAST 1 #define SLOW 0 #define LEFT 0 #define RIGHT 1 #define BOTH 2 #define NSPEEDS 2 int speeds[NSPEEDS]={50,100}; int ws_sensors[10]; void print_color(int color) { if( color==0 ) printf("WHITE"); else if( color==1 ) printf("BLUE"); else printf("INVALID COLOR"); } int calibrate() { int i,j; for( i=0;i<2; i++ ) { printf("Hit START to calibrate "); print_color(i); printf("...\n"); start_press(); for( j=0;jseensince+20L ) break; */ if( !succ && seensince!=-1L ) seensince=-1L; if( succ && seensince==-1L ) seensince=mseconds(); if( seensince!=-1L && mseconds()>seensince+10L ) break; } if( timeo!=0L && mseconds()>=starttime+timeo ) { printf("TIMEOUT.\n"); timedout=1; break; } for( i=0;i<2;i++ ) if( digital(i+7) != shaftenc[i] ) { shaftenc[i]=1-shaftenc[i]; shaftcount[i]++; if( slow==-1 && shaftcount[i]>shaftcount[1-i]+2) { slow=i; setspeed(i,cspeed); } else if( slow!=-1 ) if ( shaftcount[slow]=starttime+timeo ) { printf("TIMEOUT.\n"); timedout=1; break; } for( i=0;i<2;i++ ) if( digital(i+7) != shaftenc[i] ) { shaftenc[i]=1-shaftenc[i]; shaftcount[i]++; if( slow==-1 && shaftcount[i]>shaftcount[1-i]+1) { slow=i; if( i==1 ) sign=-1; else sign=1; setspeed(i,sign*cspeed); } else if( slow!=-1 ) if ( shaftcount[slow]=starttime+timeo ) { printf("TIMEOUT.\n"); timedout=1; break; } if( digital(right) && (status&1) ) { setspeed(0,0); status-=1; } if( digital(left) && (status&2) ) { setspeed(1,0); status-=2; } if( !status ) break; for( i=0;i<2;i++ ) if( digital(i+7) != shaftenc[i] ) { shaftenc[i]=1-shaftenc[i]; shaftcount[i]++; /* printf("shaftenc0=%d shaftenc1=%d\n",shaftcount[0],shaftcount[1]); */ } } setspeed(0,0); setspeed(1,0); if( !timedout ) return -1; if( status==2 ) return LEFT; if( status==1 ) return RIGHT; return BOTH; } int diff_turn(int speed, int cspeed,int shaftenc,long timeo) { int timedout; servo(LEFT_SERVO, LEFT_DIFFTURN); servo(RIGHT_SERVO, RIGHT_DIFFTURN); sleep(.3); timedout=walk_shaftenc_dist2(speed,cspeed,shaftenc,timeo); servo(LEFT_SERVO, LEFT_CENTER); servo(RIGHT_SERVO, RIGHT_CENTER); sleep(.3); return timedout; } #define IPOS_STR 0 #define IPOS_BACK 1 #define IPOS_WALL 2 #define IPOS_CENTER 3 void print_pos(int pos) { if( pos==IPOS_STR ) printf("STRAIGHT"); if( pos==IPOS_BACK ) printf("BACK"); if( pos==IPOS_WALL ) printf("WALL"); if( pos==IPOS_CENTER ) printf("CENTER"); } /* | |opponent's | |color | +----- ---> go this way | | own color +------------ */ int line_following(int speed,int nrot,int linecolor,long timeo) { int i; int shaftenc[2],shaftcount[2]; long finish; int cc; long starttime; int timedout; for(i=0;i<2;i++ ) { shaftenc[i]=digital(i+7); shaftcount[i]=0; } setspeed(0,speed); setspeed(1,speed); finish=-1L; cc=0; timedout=0; starttime=mseconds(); for( ;; ) { if( timeo!=0L && mseconds()>=starttime+timeo ) { printf("TIMEOUT.\n"); timedout=1; break; } for( i=0;i<2;i++ ) if( digital(i+7) != shaftenc[i] ) { shaftenc[i]=1-shaftenc[i]; shaftcount[i]++; /* printf("shaftenc0=%d shaftenc1=%d\n",shaftcount[0],shaftcount[1]); */ if( nrot && shaftcount[i]==nrot ) break; } if( i<2 ) break; if( finish!=-1L&& finish<=mseconds() ) { cc=0; finish=-1L; servo(LEFT_SERVO, LEFT_CENTER); servo(RIGHT_SERVO, RIGHT_CENTER); } if( cc!=1 && (read_light_sensor(LS_SIDE_LEFT)==linecolor || read_light_sensor(LS_MIDDLE_RIGHT)!=linecolor) ) { servo(LEFT_SERVO,LEFT_CENTER-400); servo(RIGHT_SERVO,RIGHT_CENTER-400); cc=1; } if( cc!=2 && (read_light_sensor(LS_SIDE_RIGHT)==linecolor || read_light_sensor(LS_MIDDLE_LEFT)!=linecolor) ) { servo(LEFT_SERVO,LEFT_CENTER+400); servo(RIGHT_SERVO,RIGHT_CENTER+400); cc=2; } } setspeed(0,0); setspeed(1,0); return timedout; } int wall_following(int speed,int nrot,int lasthit,long timeo) { int i,hit; int shaftenc[2],shaftcount[2]; long lastshaft; long starttime; int timedout; int cc; long finished; for(i=0;i<2;i++ ) { shaftenc[i]=digital(i+7); shaftcount[i]=0; } setspeed(0,speed); setspeed(1,speed); timedout=0; lastshaft=starttime=mseconds(); cc=-1; finished=0L; for( ;; ) { if( timeo!=0L && mseconds()>=starttime+timeo ) { printf("TIMEOUT.\n"); timedout=1; break; } if( finished!=0L && mseconds()>=finished ) { servo(LEFT_SERVO, LEFT_CENTER); servo(RIGHT_SERVO, RIGHT_CENTER); finished=0L; cc=-1; } for( i=0;i<2;i++ ) if( digital(i+7) != shaftenc[i] ) { lastshaft=mseconds(); shaftenc[i]=1-shaftenc[i]; shaftcount[i]++; /* printf("shaftenc0=%d shaftenc1=%d\n",shaftcount[0],shaftcount[1]); */ if( nrot && shaftcount[i]==nrot ) break; } if( cc!=1 && digital(SP_FRONT_SIDE_LEFT) ) { servo(LEFT_SERVO, LEFT_CENTER+200); servo(RIGHT_SERVO, RIGHT_CENTER+200); finished=mseconds()+300L; lasthit=LEFT; cc=1; } if( cc!=2 && digital(SP_FRONT_SIDE_RIGHT) ) { servo(LEFT_SERVO, LEFT_CENTER-200); servo(RIGHT_SERVO, RIGHT_CENTER-200); finished=mseconds()+300L; lasthit=RIGHT; cc=2; } hit=-1; if( cc!=1 && digital(SP_ACTUAL_FRONT_LEFT) ) { hit=LEFT; } if( cc!=2 && digital(SP_ACTUAL_FRONT_RIGHT) ) { hit=RIGHT; } if( mseconds()>lastshaft+250L ) { hit=lasthit; } if( hit!=-1 ) { lasthit=hit; if( cc!=-1 ) { servo(LEFT_SERVO, LEFT_CENTER); servo(RIGHT_SERVO, RIGHT_CENTER); finished=0L; cc=-1; } if( hit==LEFT ) { walk_shaftenc_dist(-50,-30,0,400L,-1); diff_turn(-100,-85,6,0L); setspeed(0,speed); setspeed(1,speed); } if( hit==RIGHT ) { walk_shaftenc_dist(-50,-30,0,400L,-1); diff_turn(100,85,6,0L); setspeed(0,speed); setspeed(1,speed); } lastshaft=mseconds(); } } setspeed(0,0); setspeed(1,0); return timedout; } int timeout_walk_till_hit(int speed,int right,int left,long timeout,int trials) { int trial; int result; for( trial=0; trial=2 ) break; i=timeout_walk_till_hit(100,SP_ACTUAL_FRONT_RIGHT,SP_ACTUAL_FRONT_LEFT,4000L,1); if( i!=-1 ) i=timeout_walk_till_hit(100,SP_ACTUAL_FRONT_RIGHT,SP_ACTUAL_FRONT_LEFT,1000L,2); while(i!=-1 ) { walk_shaftenc_dist(-100,-85,10,1000L,-1); diff_turn(-100,-85,30,3000L); wall_following(100,200,RIGHT,4000L); i=timeout_walk_till_hit(100,SP_ACTUAL_FRONT_RIGHT,SP_ACTUAL_FRONT_LEFT,1000L,2); } walk_shaftenc_dist(-100,-85,10,1000L,-1); diff_turn(100,85,30,0L); } } void cleanup() { int count[2],front[2],back[2],vals[NSENSORS]; int i; for( i=0;i<2;i++ ) { count[i]=front[i]=back[i]=0; } printf("CLEANUP...\n"); for( i=0;i