Gordon Sulc
/
Bee
main.cpp
- Committer:
- gsulc
- Date:
- 2011-12-16
- Revision:
- 0:178a07cd3e39
File content as of revision 0:178a07cd3e39:
#include "mbed.h" #include "bees.h" #define DEBUG 1 #define V_PER_IN 0.0098 // mV/in #ifdef DEBUG Serial pc(USBTX, USBRX); // tx, rx #endif DigitalOut myled(LED1); AnalogIn srf(p20); Serial xbee(p9, p10); DigitalOut xbee_reset(p11); /// AnalogIn r_encoder(p15); AnalogIn l_encoder(p16); DigitalOut r_charge(p5); DigitalOut l_charge(p6); Motor r_motor(p21,p30,p29); Motor l_motor(p22,p7,p8); volatile int prev_r_enc = 0; volatile int prev_l_enc = 0; volatile int r_tics = 0; volatile int l_tics = 0; volatile int r_goal = 0; volatile int l_goal = 0; volatile float r_C = -1; volatile float l_C = -1; Ticker charge_period; Ticker discharge_period; int directions[2*DIRECTIONS+1]; MovementState move_state = Stopped; /// //DoType dotype; int main() { Bee_Type type; Operation_Mode mode; float distance; QTIsensor_init(); charge_period.attach(&QTIsensor_charge,0.02); wait_ms(0.5); discharge_period.attach(&QTIsensor_discharge,0.02); // init xbee_reset = 0; wait_ms(1); xbee_reset = 1; // set the type of robot type = Leader; if(type == Leader) mode = Blaze; else if (type == Follower) mode = GetDirections; //calibrate(0.5, 40); //move(100); //wait(2); //move_state = Moving; //move(0.5, 80); distance = 10000 * srf; srand((int)distance); while(1) { if(DEBUG) { pc.printf("Left : %d Goal: %d\n\r", l_tics, l_goal); pc.printf("Right: %d Goal: %d\n\r", r_tics, r_goal); } //wait(0.2); distance = (254 - 6) * srf; if (DEBUG) pc.printf("Range: %f\n\r", distance); if(distance <= 8) rotate(1); //distance = srf / V_PER_IN; //if(DEBUG) // pc.printf("Distance: %f in\n\r", distance); //if(xbee.readable()) // directions[1] = xbee.getc(); /* This state machine swithces between the operating modes of the robot and calls the appropriate function in bees.cpp */ //calibrate(0.5,50); /*switch(mode) { case Seek: if(DEBUG) pc.printf("Seeking Pollen\n\r"); if(find_pollen()) mode = Return; break; case Return: if(DEBUG) pc.printf("Returning to Base\n\r"); if(return_home()) { if(type == Seeker) mode = SendDirections; else if(type == Gatherer) mode = Gather; } break; case SendDirections: if(DEBUG) pc.printf("Sending Directions\n\r"); if(send_directions()) mode = Seek; break; case GetDirections: if(DEBUG) pc.printf("Waiting for Directions\n\r"); if(get_directions()) mode = Gather; break; case Gather: if(DEBUG) pc.printf("Gathering Pollen\n\r"); if(goto_pollen()) mode = Gather; break; default: if(DEBUG) pc.printf("Broken :(\n\r"); }*/ switch(mode) { case Blaze: if(DEBUG) pc.printf("Creating Path\n\r"); blaze(); //pc.printf("now exiting blaze\n\r"); mode = Copy; break; case SendDirections: if(DEBUG) pc.printf("Sending Directions\n\r"); send_directions(); break; case GetDirections: if(DEBUG) pc.printf("Waiting for Directions\n\r"); if(get_directions()) mode = Copy; break; case Copy: if(DEBUG) pc.printf("Moving\n\r"); if(copy()) { if(type == Leader) mode = SendDirections; } break; default: if(DEBUG) pc.printf("Broken :(\n\r"); } //pc.printf("now checking move_state\n\r"); switch(move_state) { case Stopped: //do nothing r_motor.speed(NEUTRAL); l_motor.speed(NEUTRAL); break; /*case Stop: //stop the motors r_motor.stop(); l_motor.stop(); mov_state = Stopped;*/ case Moving: //sample encoders //update_movement(0.5); //pc.printf("now checking encoders right = %d goal = %d, left = %d goal = %d\n\r",r_tics,r_goal,l_tics,l_goal); if ((r_tics >= r_goal) || (l_tics >= l_goal)) { r_motor.speed(NEUTRAL); l_motor.speed(NEUTRAL); move_state = Stopped; } break; } myled = 1; wait(0.2); myled = 0; wait(0.2); } }