// ROBOT CONTROLER v9.0 // last updated Nov. 20, 2004 // using 89C450, LCD, SRF04, motor PMW, compass, bumper switches, 2 GP2D02 modules, // LED panel,piezo element, ISD5116 sound device, servo control and battery monitor module, // RF trancievers // Aug. 16, 2002 CMUcam // Nov. 14, 2002 moved sonar back // Nov. 24, 2002 added "move cursor" and "forward" functions // Nov. 26, 2002 moved motor control pin, connected CMUcam // Nov. 27, 2002 using compass to turn around // Dec. 16, 2002 improved alternate program selection (thanks to Martin) // Dec. 17, 2002 remembers obsticles // 19 ran out of ram,switched to unsigned, enabled XDATA (7.6) // 26 added distance and obsticle functions (7.7) // Mar. 3, 2003 added IR reciever (7.8) // ??? ?? 2003 added piezo speaker // Nov. 16, 2003 added ISD5116 sound chip (8.0) // Jan 29, 2004 added FOLLOW_WALL state (8.1) // Feb. 2, 2004 added 16F88 to control steering servo and measure battery voltage // Feb. 3, 2004 added battery voltage monitoring // Nov. 20, 2004 added RF module (9.0) put pullup on p04 /*-- microcontroller pins P0_0 - P0_3 16 position selector switch P0_4 SOUND_MODULE // connector 12 P0_5 BATTERY_INPUT P0_6 PIEZO P0_7 IR reciever P1_0 steering servo P1_1 sensor servo P1_2 CMUcam (RX1), RF module P1_3 CMUcam (TX1), RF module P1_4 sonar start P1_5 sonar result P1_6 left IR control P1_7 left IR data LED_1 P2_0 LED_2 P2_1 LED_3 P2_2 LED_4 P2_3 LED_5 P2_4 LED_6 P2_5 LED_7 P2_6 LED_8 P2_7 P3_0 RX, bootload P3_1 TX, bootload, display P3_2 right IR control P3_3 right IR data P3_4 motor control module P3_5 compass P3_6 left bumper P3_7 right bumper */ // GP2D02 pins // green = control, blue = data, red = 5v, black = ground // Futaba servo // pulse = 700us (far left) to 2400us (far right) // space = 20ms #include "reg.h" #include //#include #include // for abs(); // for distance modules #define RIGHT_IR_CONTROL P1_6 #define RIGHT_IR_DATA P1_7 #define LEFT_IR_CONTROL P3_2 #define LEFT_IR_DATA P3_3 #define SONAR_START P1_4 #define SONAR_RESULT P1_5 #define FRONT_OFFSET 30 // cm from sonar to bumper #define SIDE_OFFSET 15 // cm #define AHEAD 1600 // for sonar servo // for steering servo #define STEERING_SERVO P1_0 #define SENSOR_SERVO P1_1 #define SLIGHTLY_LEFT 1900 // ms #define LEFT 2000 // ms #define SLIGHTLY_RIGHT 1300 // ms #define RIGHT 1000 // ms #define STRAIGHT 1600 // ms // for misc. I/O #define MOTOR P3_4 #define STOP motor_speed(0); #define LEFT_BUMPER P3_6 #define RIGHT_BUMPER P3_7 #define COMPASS_PULSE P3_5 #define TACH_INPUT P3_5 // was P2_0 #define IRR P0_7 #define PIEZO P0_6 #define BATTERY_INPUT P0_5 //#define SOUND_MODULE P1_3 // connector 12 #define SOUND_MODULE P0_4 // connector 12 // for LED's #define LED_1 P2_0 #define LED_2 P2_1 #define LED_3 P2_2 #define LED_4 P2_3 #define LED_5 P2_4 #define LED_6 P2_5 #define LED_7 P2_6 #define LED_8 P2_7 // for display #define CLEAR_DISPLAY send(0x0d); send(0x0a); send(0x18); #define HOME send(0x03); send(0x02); // (^c ^b) #define SPACE send(0x20); // #define YES 1 #define NO 0 #define HIGH 1 #define LOW 0 #define TRUE 1 #define FALSE 0 #define NOT ! #define AND && #define OR || // for software UARTs #define VAL 255-96 // width of 1 bit @ 9600 baud #define WAIT_48 TR0=0;TF0=0;TH0=255;TL0=VAL/2;TR0=1;while(!TF0); #define WAIT_96 TR0=0;TF0=0;TH0=255;TL0=VAL;TR0=1;while(!TF0); #define UBYTE unsigned char #define UINT unsigned int // states #define ASSESSMENT 1 #define CRUISE 2 #define VEER 3 #define VEER_LEFT 4 #define VEER_RIGHT 5 #define SEMI_OPEN 6 #define DEAD_END 7 #define TOO_CLOSE 8 #define FORWARD 9 #define STUCK 10 #define FOLLOW_WALL 11 #define WHAT_THE 0x2700 #define WARNING_LOW_BATTERY 0x08e0 #define DOING 0x2200 #define BOING 0x2300 #define WOO_HOO 0x2400 #define OH_BROTHER 0x2500 #define DOH 0x2600 #define WHAT_THE 0x2700 #define UH_OH 0x2800 #define BLEEP 0x2900 #define HEAD_SHAKE 0x2a00 #define YEEHAA 0x4000 #define SNORE 0x4200 #define PLEASE_COME_AGAIN 0x4400 #define CUCKOO 0x4600 #define HA_HA 0x4800 #define NOW_CUT_THAT_OUT 0x4A00 #define HEY_KNOCK_IT_OFF 0x4C00 #define I_DO_BELIEVE_YOU_ARE_RIGHT 0x4E00 #define GIGGLE 0x5380 #define I_KNEW_I_SHOULD_HAVE_TAKEN 0x5600 #define WHAT_DO_YOU_THINK_YOURE_DOING 0x5800 #define MISSED_IT_BY_THAT_MUCH 0x5A00 #define WARNING_WARNING_WARNING 0x5C00 #define THAT_DOES_NOT_COMPUTE 0x5E00 #define MONEY 0x6000 #define OH_GOOD_GRIEF 0x7400 #define THERES_SOMETHING_SCREWY 0x7600 #define SCREECH 0x7800 #define AW_CRAP 0x7A00 #define IM_AFRAID_THATS_SOMETHING_I_CANNOT_ALLOW 0x7C00 #define IM_SORRY_DAVE 0x8000 #define IM_COMPLETELY_OPERATIONAL 0x8400 // A1 (110 Hz) to G3 (784 Hz) #define A3 440 #define B3 494 #define C3 525 #define D3 587 #define E3 659 #define F3 698 #define G3 784 #define A2 A3 / 2 #define B2 B3 / 2 #define C2 C3 / 2 #define D2 D3 / 2 #define E2 E3 / 2 #define F2 F3 / 2 #define G2 G3 / 2 #define A1 A3 / 4 #define B1 B3 / 4 #define C1 C3 / 4 #define D1 D3 / 4 #define E1 E3 / 4 #define F1 F3 / 4 #define G1 G3 / 4 #define A4 A3 * 2 #define B4 B3 * 2 #define C4 C3 * 2 #define D4 D3 * 2 #define E4 E3 * 2 #define F4 F3 * 2 #define G4 G3 * 2 #define A5 A3 * 4 #define B5 B3 * 4 #define C5 C3 * 4 #define D5 D3 * 4 #define E5 E3 * 4 #define F5 F3 * 4 #define G5 G3 * 4 //#define //#define NORTH 0 //#define EAST 90 //#define SOUTH 180 //#define WEST 270 /*----------------------------------*/ // function list (also known as prototypes) void state_controller(void); // states (to understand the robot's behavior, look at these functions) void assessment(void); // stop, scan, delagate void forward(void); // when 30 to 90 cm in front void follow_wall(void); void semi_open(void); // make 1 small move to the left or right void cruise(void); // when there's lots of room (>90cm) void veer (void); // deside which way to veer void veer_left (void); // avoid obsticle without stopping first void veer_right (void); // " void dead_end(void); // void too_close(void); // when closer than 15 cm to an object void stuck(void); // mid-level functions void look_left (void); void look_right (void); //void look_ahead (void); void five_point_scan (void); unsigned int is_bearing_within_range (unsigned int, unsigned int, unsigned int); void clear_obsticle_memory(void); void check_distances(void); // movements void move (int); // move forward or backward specified distance (cm) void turn_left (unsigned int); // select number of degrees to turn void turn_right (unsigned int); // select number of degrees to turn void reverse_left (void); void reverse_right (void); // devices void send(unsigned char); // sends character to LCD void send_decimal_4(unsigned int); // sends 4 digit number to LCD void send_decimal_3(signed int); void send_string(unsigned char *string); void move_cursor(unsigned char, unsigned char); // horizontal, vertical void aim_sonar(unsigned int, unsigned int); // pulse width in ms, # of pulses void steer(unsigned int, unsigned int); // pulse width, # of pulses void motor_speed(unsigned char); // 0 to 100%, - for reverse (uses 2nd serial port) void serial_init(void); // sets up the serial port void pause(unsigned int); // select pause in milliseconds void set_timer(unsigned int); // microseconds, counts up and trips flag (TF0) void start_system_clock(void); // uses timer 2 void update_system_clock(void); // driven by interrupt every millisecond unsigned int sonar(void); // gets distance in cm unsigned int bearing(void); // gets bearing in degrees unsigned int left_ir(void); // gets distance in cm unsigned int right_ir(void); // gets distance in cm void send_string_to_rf_module(unsigned char *string); void rf_putc(unsigned char); void send_string_to_sound_module(unsigned char *string); void send_to_sound_module(unsigned char); void tone(UINT,UINT); UBYTE get_rc_code(void); void say(int); // plays a recorded sound starting at the given address UBYTE get_battery_voltage(void); // alternate programs void test_mode(void); // allows user to select an alternate program void tach(void); void cmucam(void); void rc(void); void motor_test(void); // left bumper increases speed, right decreases void compass_test(void); // displays bearing void distances(void); // displays distance in cm // void sonar_test(void); void boomarang(void); // goes forward, turns 180 deg, comes back void sound_test(void); void compass_test_2(void);// goes north void sentry(void); // alert if anything passes within 80cm of sonar void compass_test_3(void);// go north, U-turn, go south void sensor_servo_test(void);// bumper controls servo void steering_servo_test(void);// void ir_calibrate(void); // raw data from IR modules void rc_test(void); // IR reciever test void cap_meter(void); void servo_test(void); //UBYTE get_byte_from_camera(void); void i2c_compass_test(void); //UBYTE read_compass_register(void); void rf_test(void); void select_alt_program(void); //void (void); //void (void); // T2CON (timer 2 control register) sbit CP_RL2 = 0xC8; sbit C_T2 = 0xC9; sbit TR2 = 0xCA; sbit EXEN2 = 0xCB; sbit TCLK = 0xCC; sbit RCLK = 0xCD; sbit EXF2 = 0xCE; sbit TF2 = 0xCF; sfr T2CON = 0xC8; sfr T2MOD = 0xC9; sfr RCAP2L = 0xCA; sfr RCAP2H = 0xCB; sfr TL2 = 0xCC; sfr TH2 = 0xCD; // SCON1 sbit RI_1 = 0xC0; sbit TI_1 = 0xC1; sbit RB8_1 = 0xC2; sbit TB8_1 = 0xC3; sbit REN_1 = 0xC4; sbit SM2_1 = 0xC5; sbit SM1_1 = 0xC6; sbit SM0FE_1 = 0xC7; sfr PMR = 0xC4; // enable xdata ram // global variables //char code *alt[2]={"test 1","test 2"}; unsigned char code alt[15][20]={ "distances", "CMUcam tests", "boomarang", "bearing", "motor test", "remote control", "tach", "sentry", "compass test 3", "sound test", "sensor servo test", "steering servo test", "cap meter", "RC test" }; unsigned char distance_left, distance_ahead, distance_right; unsigned int prefered_bearing, debug, lw, rw, ticks; unsigned long int current_time; // milliseconds since power up (system clock) signed int zone[6]; // 5 distance measurments from the sonar (cm) _\|/_ unsigned char next_state, last_state; unsigned int obsticle_left, obsticle_right, obsticle_ahead; unsigned char reverse_attempts; unsigned char xdata string[30]; // text to be sent to the display //======================================================