/************************************************************************ * Title rockofin.c * Programmer Darren Kelley * Date April 15, 1999 * Version 3 * * Description * This program allows my robot (rear wheel drive and front wheel steering * to perform obstacle avoidance, scan for the brightest area in the sky * and launch a rocket(PD3).FOR FRONT SENSORS AT INSIDE ANGLE OF 120 DEGREES ************************************************************************/ /**************************** Includes **********************************/ #include #include /************************ End of includes *******************************/ /**************************** Defines **********************************/ #define poke *(unsigned char *) (0x7000) #define irrt analog(0) #define irlf analog(1) #define sonar40 analog(2) #define cds_side analog(3) #define sonar24 analog(4) #define bend analog(5) #define cds_box analog(6) #define SnrTxL 0x02 #define SnrTxR 0x01 #define Clear 0xC0 #define bit3 0x08 #define bit4 0x10 #define bit5 0x20 #define sonar_max 24 #define sonar_thrhld 75 #define low_degree 1000 #define center_degree 2650 #define search_delay 2670 #define increment 5 #define pad_motor 0 #define maxtime 200 /************************ End of Defines *******************************/ /**************************** Prototypes **********************************/ void main_init(void); void adjust_speed(int, int); void motor(int, int); void straight(void); void fwd_right(int); void fwd_left(int); void bk_right(int); void bk_left(int); void bk_straight(int); void obstacle_avoid(void); void start_search(void); void search(void); void sonar_rt(void); void sonar_lf(void); void search(void); void start_pad(void); void adjust_pad(void); void launch(void); void laun_seq(void); /**************************End of Prototypes ******************************/ /**************************** Globals **********************************/ int main_cnt = 0; int speed = 30; int rev_speed = -30; int center = 3000; int right = 2700; int left = 3300; int ir_thrhldlf = 105; int ir_thrhldrt = 105; int ir_maxlf = 110; int ir_maxrt = 110; int present_speed0 = 0; int present_speed1 = 0; int speed_delay = 87; /* delay = 174 for loop corresponds to 2 ms*/ int irert = 0x40; int irelf = 0x80; int sonarrt_cnt = 0; int sonarlf_cnt = 0; int up, count, j, high, found, high_count;/* globals for search start and launch*/ int degree, location, high_degree; int gotit =0; int launched = 0; int movedelay = 30; /**************************End of globals ******************************/ /************************** Main ************************************/ void main(void) { main_init(); while (irrt < ir_maxrt); /* Wait until the right ir is set high to turn on*/ while(1) { for(main_cnt=0; main_cntir_thrhldrt) { bk_right(); } else if(irlf>ir_thrhldlf) { bk_left(); } else if(sonarrt_cnt 200) && (sonarlf_cnt < 300)) { sonarlf_cnt++; } if(sonarlf_cnt<=10) { sonarlf_cnt = 300; } printf("%d \n\n", sonarlf_cnt); } /**************************** sonar_lf *****************************/ void sonar_rt(void) /**************************** sonar_rt ***************************** * Description * pulses right sonar transmitter for 1ms checks the sonar receiver * for a pulse * *Usage: to control robots direction ************************************************************************/ { int i; sonarrt_cnt = 0; /* initialize counter to 0*/ poke = SnrTxR; /*turn sonar transducer on*/ for (i = 0; i < 100; i++); /* wait for 1 ms*/ poke = Clear; /*turn sonar transducer off*/ for (i = 0; i<100; i++); /*delay to reduce effects of transference of signal*/ while((sonar40 > 200) && (sonarrt_cnt < 300)) { sonarrt_cnt++; } if(sonarrt_cnt<=10) { sonarrt_cnt = 300; } printf("%d \n\n", sonarrt_cnt); } /*****************************sonar_rt******************************* /*****************************start_pad************************ / Start function moves pad form center point to full right / starting postion to begin searching for brightest area. /************************************************************/ void start_pad(void) { degree = center_degree; /* initialize degree to center position*/ while(degree>low_degree) { degree = degree - increment; servo(1, degree); for(j=0; j=high_degree) { degree = degree - increment; } else if (found == 1 && degreeangle) { motor(pad_motor, 100); printf("Motor going up"); down = 0; } else { motor(pad_motor, 0); printf("Done !!"); found = 1; } } } /*********************************** adjust_pad *********************/ void launch(void) /**************************** launch ***************************** * Description * sets port d bit 3 to high for 10 ms causing a fuse to ignite and launch * the rocket * * *Usage: ************************************************************************/ { int i, j; for (j=0; j<20; j++) { for(i=0; i<10000; i++) { SET_BIT(PORTD, 0x08); /*turn port d bit 3 on for 7 s*/ } } CLEAR_BIT(PORTD, 0x08); /* turn port d bit 3 off*/ printf("Launch successfull"); } /****************************** launch ********************************/ void laun_seq(void) /*******************************laun_seq************************************ * Description * executes appropriate sequence of functions to launch rocket. * * * *Usage: ************************************************************************/ { start_pad(); search(); adjust_pad(); launch( ); } /****************************** laun_seq *******************************/