Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
- Committer:
- zsunberg
- Date:
- 2015-08-05
- Revision:
- 26:49945d96d461
- Parent:
- 25:c4577daa425a
- Child:
- 27:949a31d30439
File content as of revision 26:49945d96d461:
#include "robot.h" #include "my_functions.h" /* * This function will be called at approximately 50 hz when the control mode is LINE_FOLLOW_MODE */ void line_follow_loop(){ led4 = 1; //varaibles to float prev_position = 0; float derivative, proportional, integral = 0; int sensors[5]; float position = 0; float power; //speed increase or decrease float speed = MAX; //get sensors pi.sensor_reading(sensors); //line position position = pi.line_position(); proportional = position; //derivative derivative = position - prev_position; //integral integral += proportional; //last position prev_position = position; power = (proportional * k_p) + (integral * k_i) + (derivative * k_d); //new speeds rightspeed = speed - power; leftspeed = speed + power; if(rightspeed < MIN) rightspeed = MIN; else if(rightspeed > MAX) rightspeed = MAX; if(leftspeed < MIN) leftspeed = MIN; else if(leftspeed > MAX) leftspeed = MAX; //pi.left_motor(leftspeed); // pi.right_motor(rightspeed); if(sensors[0] < 1200 && sensors[1] < 1200 && sensors[2] < 1200 && sensors[3] < 1200 && sensors[4] < 1200) { pi.stop(); //dead end mode = MANUAL_MODE; } else if(sensors[0] > 1800 || sensors[4] > 1800) { //intersection mode = MANUAL_MODE; } // set mode to MANUAL_MODE when the end is detected // mode = MANUAL_MODE // wait_ms(10); led4 = 0; } // INPUT COMMANDS // l:<float> set left wheel speed (only effective in MANUAL_MODE) // r:<float> set right wheel speed (only effective in MANUAL_MODE) // c:<int> change mode // g:<p|i|d>:<float> // change gains // b: check battery // OUTPUT MESSAGES // p:<float> line position // s:<int>,<int>,<int>,<int>,<int> // light sensor values // m:<int> mode // a:<message> acknowledge void communicate() { led1 = 1; __disable_irq(); pi.sensor_reading(sensors); __enable_irq(); int* s = sensors; // just to make the next line more compact xbee.printf("s:%i,%i,%i,%i,%i\n", s[0], s[1], s[2], s[3], s[4]); __disable_irq(); xbee.printf("p:%f\n", pi.line_position()); __enable_irq(); xbee.printf("m:%d\n", mode); led1 = 0; } void signal_comm(){ comm_time = true; } int parse_command(const char* cmd) { if(cmd[1]==':'){ // left motor if(cmd[0]=='l'){ if(mode==MANUAL_MODE){ leftspeed = atof(&cmd[2]); } // right motor }else if(cmd[0]=='r'){ if(mode==MANUAL_MODE){ rightspeed = atof(&cmd[2]); } // mode }else if(cmd[0]=='c'){ mode = atoi(&cmd[2]); xbee.printf("a:c:%d\n", mode);// acknowledge the mode change // xbee.printf("mode set to %d\n", mode); // gains }else if(cmd[0]=='g'){ if(cmd[2]=='p'){ k_p = atof(&cmd[4]); }else if(cmd[2]=='i'){ k_i = atof(&cmd[4]); }else if(cmd[2]=='d'){ k_d = atof(&cmd[4]); } xbee.printf("gains p:%f, i:%f, d:%f\n", k_p, k_i, k_d); // battery }else if(cmd[0]=='b'){ __disable_irq(); xbee.printf("battery voltage: %f\n", pi.battery()); __enable_irq(); }else{ xbee.printf("%s\n",cmd); } }else{ xbee.printf("%s\n",cmd); } return 0; } void check_incoming(){ led2 = 1; char read; while(xbee.readable()){ read = xbee.getc(); if(read=='\n'){ received[r_index]='\0'; // put a null character at the end parse_command(received); r_index=0; } else { if(r_index >= 80){ r_index=0; } received[r_index]=read; r_index++; } } led2=0; } void control() { if(mode==LINE_FOLLOW_MODE){ line_follow_loop(); } pi.left_motor(rightspeed); pi.right_motor(leftspeed); } int main() { // xbee.attach(&Rx_interrupt, Serial::RxIrq); xbeeReset = 0; wait(2); xbeeReset = 1; pi.sensor_auto_calibrate(); leftspeed = 0.0; rightspeed = 0.0; r_index = 0; received[0] = '\0'; mode = MANUAL_MODE; communication.attach(&signal_comm, 0.1); controls.attach(&control, 0.02); // main loop while(1){ led3 = mode; check_incoming(); if(comm_time){ communicate(); comm_time = false; } } return 0; }