Racing Robots Session
Dependencies: MbedJSONValue m3pi
robot_logic.cpp
00001 #include "robot_logic.h" 00002 #include "xbee.h" 00003 00004 // Some defines 00005 #define MAX_SPEED 100 00006 #define MAX_SENSOR 100 00007 #define MAX_REAL_SPEED 0.75 00008 00009 #define MIN 0 00010 00011 // Static scope variables 00012 static m3pi m3pi; 00013 00014 #ifdef XBEE 00015 Xbee xbee(p28, p27); 00016 #endif 00017 00018 // Static scope variables for keeping internal state 00019 static int internal_speed = 0; // [-100, +100] 00020 static int internal_turnspeed = 0; // [-100, +100] 00021 static int internal_p = 0; 00022 static int internal_i = 0; 00023 static int internal_d = 0; 00024 static int internal_previous_pos_of_line = 0; 00025 static int internal_led_state = 0; 00026 00027 void drive(int speed) 00028 { 00029 if (speed > MAX_SPEED || speed < -MAX_SPEED) { 00030 error("Speed out of range"); 00031 return; 00032 } 00033 00034 internal_speed = speed; 00035 00036 if (speed == 0 || !canDrive()) { 00037 m3pi.stop(); 00038 } else if (speed > 0) { 00039 m3pi.forward(MAX_REAL_SPEED*speed/MAX_SPEED); 00040 } else if (speed < 0) { 00041 m3pi.backward(MAX_REAL_SPEED*(-speed)/MAX_SPEED); 00042 } 00043 } 00044 00045 void turn(int turnspeed) 00046 { 00047 if (turnspeed > MAX_SPEED || turnspeed < -MAX_SPEED) { 00048 error("Turn out of range"); 00049 return; 00050 } 00051 internal_turnspeed = turnspeed; 00052 00053 float left = internal_speed; 00054 float right = internal_speed; 00055 00056 left -= turnspeed; 00057 right += turnspeed; 00058 00059 if (right < MIN) 00060 right = MIN; 00061 else if (right > MAX_SPEED) 00062 right = MAX_SPEED; 00063 00064 if (left < MIN) 00065 left = MIN; 00066 else if (left > MAX_SPEED) 00067 left = MAX_SPEED; 00068 00069 if(!canDrive()){ 00070 left = right = 0; 00071 } 00072 00073 m3pi.left_motor(MAX_REAL_SPEED*left/MAX_SPEED); 00074 m3pi.right_motor(MAX_REAL_SPEED*right/MAX_SPEED); 00075 } 00076 00077 void stop(void) 00078 { 00079 m3pi.stop(); 00080 } 00081 void sensor_calibrate(void) 00082 { 00083 m3pi.sensor_auto_calibrate(); 00084 } 00085 00086 int line_sensor(void) 00087 { 00088 // Get position of line [-1.0, +1.0] 00089 float pos = m3pi.line_position(); 00090 return ((int)(pos * MAX_SENSOR)); 00091 } 00092 00093 void pid_init(int p, int i, int d) 00094 { 00095 internal_p = p; 00096 internal_i = i; 00097 internal_d = d; 00098 } 00099 00100 int pid_turn(int line_position) 00101 { 00102 float derivative, proportional, integral = 0; 00103 float power; 00104 00105 proportional = line_position / 100.0; 00106 00107 // Compute the derivative 00108 derivative = line_position - internal_previous_pos_of_line; 00109 00110 // Compute the integral 00111 integral += proportional; 00112 00113 // Remember the last position. 00114 internal_previous_pos_of_line = line_position; 00115 00116 // Compute the power 00117 power = (proportional * (internal_p) ) + (integral*(internal_i)) + (derivative*(internal_d)) ; 00118 00119 power = power * MAX_SPEED; 00120 if (power < -MAX_SPEED) 00121 power = -MAX_SPEED; 00122 else if (power > MAX_SPEED) 00123 power = MAX_SPEED; 00124 return power ; 00125 } 00126 00127 void show_stats(void) 00128 { 00129 m3pi.cls(); // Clear display 00130 00131 // Display speed 00132 m3pi.locate(0, 0); 00133 m3pi.printf("S%d", internal_speed); 00134 00135 // Display turn 00136 m3pi.locate(4,0); 00137 m3pi.printf("T%d", internal_turnspeed); 00138 00139 // Display line 00140 m3pi.locate(0, 1); 00141 int line = line_sensor(); 00142 m3pi.printf("POS %d", line); 00143 } 00144 00145 void show_name(char * name) 00146 { 00147 m3pi.cls(); // Clear display 00148 00149 // Display speed 00150 m3pi.locate(0, 0); 00151 // x The horizontal position, from 0 to 7 00152 // y The vertical position, from 0 to 1 00153 m3pi.printf("%s", name); 00154 } 00155 00156 void await(int milliseconds) 00157 { 00158 wait_ms(milliseconds); 00159 } 00160 00161 void led(LedIndex i, LedState state) 00162 { 00163 if(state == LED_ON) { 00164 internal_led_state |= (1 << i); 00165 } else if(state == LED_OFF) { 00166 internal_led_state &= ~(1 << i); 00167 } else if(state == LED_TOGGLE) { 00168 internal_led_state ^= (1 << i); 00169 } else { 00170 error("Illegal LED state"); 00171 } 00172 m3pi.leds(internal_led_state); 00173 } 00174 00175 int canDrive() 00176 { 00177 #ifdef XBEE 00178 return !xbee.stopped(); 00179 #endif 00180 return true; 00181 } 00182 00183 00184 void setCode(int code) 00185 { 00186 #ifdef XBEE 00187 xbee.setCode(code); 00188 #endif 00189 }
Generated on Sat Jul 16 2022 11:43:30 by 1.7.2