Zachary Sunberg / Mbed 2 deprecated SAILORSbot

Dependencies:   mbed

Committer:
zsunberg
Date:
Thu Aug 13 20:47:22 2015 +0000
Revision:
34:1629bdc97a0e
Parent:
33:3b768c7201c9
Child:
35:09f92a88c0a7
lowered comms to 2 Hz because of communication delays

Who changed what in which revision?

UserRevisionLine numberNew contents of line
zsunberg 0:9f058fe8cab5 1 #include "robot.h"
zsunberg 31:e36b7722df56 2 #include "turn.h"
zsunberg 31:e36b7722df56 3 #include "nudge.h"
zsunberg 23:55f8b1abbf99 4 #include "my_functions.h"
zsunberg 0:9f058fe8cab5 5
zsunberg 1:a7aab5937375 6 /*
zsunberg 30:ea511cd81f43 7 * This function will be called at approximately 20 hz when the control mode is LINE_FOLLOW_MODE
Zachary Sunberg 4:70fea94b29ae 8 */
Zachary Sunberg 5:70c86dbc8832 9 void line_follow_loop(){
Zachary Sunberg 4:70fea94b29ae 10 led4 = 1;
laurennyg 19:c900c40b270e 11
zsunberg 31:e36b7722df56 12 // Zach's control code
zsunberg 31:e36b7722df56 13 //////////////////////
zsunberg 30:ea511cd81f43 14 static double previous_position = 0.0;
zsunberg 30:ea511cd81f43 15 static double integral = 0.0;
zsunberg 30:ea511cd81f43 16
zsunberg 30:ea511cd81f43 17 double derivative = (line_position - previous_position);
zsunberg 30:ea511cd81f43 18 integral += line_position;
zsunberg 30:ea511cd81f43 19 previous_position = line_position;
Zachary Sunberg 29:6aa49bba0d81 20
zsunberg 30:ea511cd81f43 21 double delta = k_p*line_position + k_i*integral + k_d*derivative;
Zachary Sunberg 29:6aa49bba0d81 22
Zachary Sunberg 29:6aa49bba0d81 23 leftspeed = speed+delta;
Zachary Sunberg 29:6aa49bba0d81 24 rightspeed = speed-delta;
zsunberg 28:15b95329a064 25
zsunberg 30:ea511cd81f43 26 if(leftspeed > MAX){
zsunberg 30:ea511cd81f43 27 leftspeed = MAX;
zsunberg 30:ea511cd81f43 28 }
zsunberg 30:ea511cd81f43 29 if(rightspeed > MAX){
zsunberg 30:ea511cd81f43 30 rightspeed = MAX;
zsunberg 30:ea511cd81f43 31 }
zsunberg 30:ea511cd81f43 32 if(leftspeed < MIN){
zsunberg 30:ea511cd81f43 33 leftspeed = MIN;
zsunberg 30:ea511cd81f43 34 }
zsunberg 30:ea511cd81f43 35 if(rightspeed < MIN){
zsunberg 30:ea511cd81f43 36 rightspeed = MIN;
zsunberg 30:ea511cd81f43 37 }
zsunberg 31:e36b7722df56 38 /////////////////////
zsunberg 31:e36b7722df56 39
zsunberg 30:ea511cd81f43 40
zsunberg 27:949a31d30439 41 // Do your control calculations here
zsunberg 27:949a31d30439 42 ////////////////////////////////////
laurennyg 19:c900c40b270e 43
zsunberg 27:949a31d30439 44
zsunberg 27:949a31d30439 45 // set motor speeds here
zsunberg 27:949a31d30439 46 // leftspeed = ???;
zsunberg 27:949a31d30439 47 // rightspeed = ???;
zsunberg 27:949a31d30439 48 ////////////////////////////////////
laurennyg 19:c900c40b270e 49
zsunberg 31:e36b7722df56 50
zsunberg 31:e36b7722df56 51 // Code to check if we need to stop
zsunberg 33:3b768c7201c9 52 if(sensors[0] < 1000 && sensors[1] < 1000 && sensors[2] < 1000 && sensors[3] < 1000 && sensors[4] < 1000){
zsunberg 31:e36b7722df56 53 //dead end
zsunberg 31:e36b7722df56 54 leftspeed = 0.0;
zsunberg 31:e36b7722df56 55 rightspeed = 0.0;
zsunberg 31:e36b7722df56 56 pi.stop();
zsunberg 31:e36b7722df56 57 mode = MANUAL_MODE;
zsunberg 33:3b768c7201c9 58 }else if(sensors[0] > 1800 && sensors[4] > 1800){
zsunberg 31:e36b7722df56 59 //intersection
zsunberg 31:e36b7722df56 60 leftspeed = 0.0;
zsunberg 31:e36b7722df56 61 rightspeed = 0.0;
zsunberg 31:e36b7722df56 62 pi.stop();
zsunberg 31:e36b7722df56 63 mode = MANUAL_MODE;
zsunberg 31:e36b7722df56 64 }
zsunberg 12:f0df5dea322d 65
Zachary Sunberg 4:70fea94b29ae 66 led4 = 0;
Zachary Sunberg 4:70fea94b29ae 67 }
Zachary Sunberg 4:70fea94b29ae 68
Zachary Sunberg 4:70fea94b29ae 69
Zachary Sunberg 4:70fea94b29ae 70 // INPUT COMMANDS
Zachary Sunberg 4:70fea94b29ae 71 // l:<float> set left wheel speed (only effective in MANUAL_MODE)
Zachary Sunberg 4:70fea94b29ae 72 // r:<float> set right wheel speed (only effective in MANUAL_MODE)
Zachary Sunberg 4:70fea94b29ae 73 // c:<int> change mode
Zachary Sunberg 29:6aa49bba0d81 74 // g:<p|i|d|s>:<float>
Zachary Sunberg 29:6aa49bba0d81 75 // change gains/speed
zsunberg 22:dae192ffca90 76 // b: check battery
zsunberg 31:e36b7722df56 77 // t:<l|r> turn
zsunberg 31:e36b7722df56 78 // n:<float> nudge
Zachary Sunberg 4:70fea94b29ae 79
Zachary Sunberg 4:70fea94b29ae 80 // OUTPUT MESSAGES
Zachary Sunberg 4:70fea94b29ae 81 // p:<float> line position
Zachary Sunberg 4:70fea94b29ae 82 // s:<int>,<int>,<int>,<int>,<int>
Zachary Sunberg 4:70fea94b29ae 83 // light sensor values
Zachary Sunberg 4:70fea94b29ae 84 // m:<int> mode
zsunberg 23:55f8b1abbf99 85 // a:<message> acknowledge
zsunberg 22:dae192ffca90 86 void communicate()
zsunberg 22:dae192ffca90 87 {
zsunberg 22:dae192ffca90 88 led1 = 1;
zsunberg 22:dae192ffca90 89 int* s = sensors; // just to make the next line more compact
zsunberg 22:dae192ffca90 90 xbee.printf("s:%i,%i,%i,%i,%i\n", s[0], s[1], s[2], s[3], s[4]);
zsunberg 30:ea511cd81f43 91 xbee.printf("p:%f\n", line_position);
zsunberg 22:dae192ffca90 92 xbee.printf("m:%d\n", mode);
Zachary Sunberg 29:6aa49bba0d81 93 // send any other variables here
Zachary Sunberg 29:6aa49bba0d81 94 ////////////////////////////////
Zachary Sunberg 29:6aa49bba0d81 95
Zachary Sunberg 29:6aa49bba0d81 96 ////////////////////////////////
zsunberg 22:dae192ffca90 97 led1 = 0;
zsunberg 22:dae192ffca90 98 }
Zachary Sunberg 4:70fea94b29ae 99
Zachary Sunberg 25:c4577daa425a 100 void signal_comm(){
Zachary Sunberg 25:c4577daa425a 101 comm_time = true;
Zachary Sunberg 25:c4577daa425a 102 }
Zachary Sunberg 25:c4577daa425a 103
zsunberg 1:a7aab5937375 104 int parse_command(const char* cmd)
zsunberg 1:a7aab5937375 105 {
zsunberg 1:a7aab5937375 106 if(cmd[1]==':'){
Zachary Sunberg 8:f96af1d15e9e 107 // left motor
Zachary Sunberg 7:7f94942cd50d 108 if(cmd[0]=='l'){
Zachary Sunberg 7:7f94942cd50d 109 if(mode==MANUAL_MODE){
Zachary Sunberg 7:7f94942cd50d 110 leftspeed = atof(&cmd[2]);
Zachary Sunberg 7:7f94942cd50d 111 }
Zachary Sunberg 8:f96af1d15e9e 112 // right motor
Zachary Sunberg 7:7f94942cd50d 113 }else if(cmd[0]=='r'){
Zachary Sunberg 7:7f94942cd50d 114 if(mode==MANUAL_MODE){
Zachary Sunberg 7:7f94942cd50d 115 rightspeed = atof(&cmd[2]);
Zachary Sunberg 7:7f94942cd50d 116 }
Zachary Sunberg 8:f96af1d15e9e 117 // mode
Zachary Sunberg 4:70fea94b29ae 118 }else if(cmd[0]=='c'){
Zachary Sunberg 4:70fea94b29ae 119 mode = atoi(&cmd[2]);
zsunberg 23:55f8b1abbf99 120 xbee.printf("a:c:%d\n", mode);// acknowledge the mode change
zsunberg 21:18b585a44155 121 // xbee.printf("mode set to %d\n", mode);
Zachary Sunberg 8:f96af1d15e9e 122 // gains
Zachary Sunberg 8:f96af1d15e9e 123 }else if(cmd[0]=='g'){
Zachary Sunberg 8:f96af1d15e9e 124 if(cmd[2]=='p'){
Zachary Sunberg 8:f96af1d15e9e 125 k_p = atof(&cmd[4]);
zsunberg 30:ea511cd81f43 126 xbee.printf("k_p: %f\n", k_p);
Zachary Sunberg 8:f96af1d15e9e 127 }else if(cmd[2]=='i'){
Zachary Sunberg 8:f96af1d15e9e 128 k_i = atof(&cmd[4]);
zsunberg 30:ea511cd81f43 129 xbee.printf("k_i: %f\n", k_i);
Zachary Sunberg 8:f96af1d15e9e 130 }else if(cmd[2]=='d'){
Zachary Sunberg 8:f96af1d15e9e 131 k_d = atof(&cmd[4]);
zsunberg 30:ea511cd81f43 132 xbee.printf("k_d: %f\n", k_d);
Zachary Sunberg 29:6aa49bba0d81 133 }else if(cmd[2]=='s'){
Zachary Sunberg 29:6aa49bba0d81 134 speed = atof(&cmd[4]);
zsunberg 30:ea511cd81f43 135 xbee.printf("speed: %f\n", speed);
Zachary Sunberg 8:f96af1d15e9e 136 }
Zachary Sunberg 29:6aa49bba0d81 137 // xbee.printf("gains p:%f, i:%f, d:%f\n", k_p, k_i, k_d);
zsunberg 22:dae192ffca90 138 // battery
zsunberg 22:dae192ffca90 139 }else if(cmd[0]=='b'){
zsunberg 22:dae192ffca90 140 xbee.printf("battery voltage: %f\n", pi.battery());
zsunberg 31:e36b7722df56 141 // turn
zsunberg 31:e36b7722df56 142 }else if(cmd[0]=='t'){
zsunberg 31:e36b7722df56 143 float dir = 0.0;
zsunberg 31:e36b7722df56 144 if(cmd[2] == 'l'){
zsunberg 31:e36b7722df56 145 dir = 1.0;
zsunberg 31:e36b7722df56 146 }else{
zsunberg 31:e36b7722df56 147 dir = -1.0;
zsunberg 31:e36b7722df56 148 }
zsunberg 31:e36b7722df56 149 start_turn(dir);
zsunberg 31:e36b7722df56 150 xbee.printf("a:c:%d\n", TURN_MODE);
zsunberg 31:e36b7722df56 151 }else if(cmd[0]=='n'){
zsunberg 31:e36b7722df56 152 start_nudge(atof(&cmd[2]));
zsunberg 32:7e518320305f 153 xbee.printf("a:c:%d\n", NUDGE_MODE);
zsunberg 31:e36b7722df56 154
Zachary Sunberg 29:6aa49bba0d81 155 // parse your own commands here
Zachary Sunberg 29:6aa49bba0d81 156 ///////////////////////////////
Zachary Sunberg 29:6aa49bba0d81 157
Zachary Sunberg 29:6aa49bba0d81 158 ///////////////////////////////
zsunberg 1:a7aab5937375 159 }else{
zsunberg 30:ea511cd81f43 160 //XXX disabling this is disabling error checking
zsunberg 23:55f8b1abbf99 161 xbee.printf("%s\n",cmd);
zsunberg 1:a7aab5937375 162 }
zsunberg 1:a7aab5937375 163 }else{
zsunberg 30:ea511cd81f43 164 //XXX disabling this is disabling error checking
zsunberg 1:a7aab5937375 165 xbee.printf("%s\n",cmd);
zsunberg 1:a7aab5937375 166 }
zsunberg 1:a7aab5937375 167 return 0;
zsunberg 1:a7aab5937375 168 }
zsunberg 0:9f058fe8cab5 169
Zachary Sunberg 25:c4577daa425a 170 void check_incoming(){
zsunberg 26:49945d96d461 171 char read;
zsunberg 26:49945d96d461 172
zsunberg 0:9f058fe8cab5 173 while(xbee.readable()){
Zachary Sunberg 29:6aa49bba0d81 174 led2 = 1;
zsunberg 1:a7aab5937375 175 read = xbee.getc();
zsunberg 1:a7aab5937375 176 if(read=='\n'){
zsunberg 1:a7aab5937375 177 received[r_index]='\0'; // put a null character at the end
zsunberg 1:a7aab5937375 178 parse_command(received);
zsunberg 1:a7aab5937375 179 r_index=0;
zsunberg 0:9f058fe8cab5 180 } else {
zsunberg 30:ea511cd81f43 181 if(r_index >= 1024){
zsunberg 1:a7aab5937375 182 r_index=0;
zsunberg 1:a7aab5937375 183 }
zsunberg 1:a7aab5937375 184 received[r_index]=read;
zsunberg 1:a7aab5937375 185 r_index++;
zsunberg 0:9f058fe8cab5 186 }
zsunberg 0:9f058fe8cab5 187 }
zsunberg 1:a7aab5937375 188 led2=0;
zsunberg 0:9f058fe8cab5 189 }
zsunberg 0:9f058fe8cab5 190
zsunberg 20:f0ca65974329 191 void control()
zsunberg 20:f0ca65974329 192 {
zsunberg 30:ea511cd81f43 193 pi.sensor_reading(sensors);
zsunberg 30:ea511cd81f43 194 line_position = pi.line_position();
zsunberg 20:f0ca65974329 195 if(mode==LINE_FOLLOW_MODE){
zsunberg 20:f0ca65974329 196 line_follow_loop();
zsunberg 20:f0ca65974329 197 }
Zachary Sunberg 25:c4577daa425a 198 pi.left_motor(rightspeed);
Zachary Sunberg 25:c4577daa425a 199 pi.right_motor(leftspeed);
zsunberg 20:f0ca65974329 200 }
zsunberg 20:f0ca65974329 201
zsunberg 0:9f058fe8cab5 202 int main() {
zsunberg 0:9f058fe8cab5 203
zsunberg 26:49945d96d461 204 // xbee.attach(&Rx_interrupt, Serial::RxIrq);
zsunberg 0:9f058fe8cab5 205 xbeeReset = 0;
zsunberg 0:9f058fe8cab5 206 wait(2);
zsunberg 0:9f058fe8cab5 207 xbeeReset = 1;
zsunberg 1:a7aab5937375 208 pi.sensor_auto_calibrate();
zsunberg 20:f0ca65974329 209 leftspeed = 0.0;
zsunberg 20:f0ca65974329 210 rightspeed = 0.0;
zsunberg 26:49945d96d461 211
zsunberg 1:a7aab5937375 212 r_index = 0;
zsunberg 1:a7aab5937375 213 received[0] = '\0';
zsunberg 10:860856cead84 214 mode = MANUAL_MODE;
zsunberg 20:f0ca65974329 215
zsunberg 34:1629bdc97a0e 216 communication.attach(&signal_comm, 0.5); // lowered to 2 Hz because of communications problems
zsunberg 21:18b585a44155 217 controls.attach(&control, 0.02);
zsunberg 0:9f058fe8cab5 218
Zachary Sunberg 25:c4577daa425a 219 // main loop
zsunberg 0:9f058fe8cab5 220 while(1){
zsunberg 20:f0ca65974329 221 led3 = mode;
Zachary Sunberg 6:9792935abfc3 222
Zachary Sunberg 25:c4577daa425a 223 check_incoming();
Zachary Sunberg 25:c4577daa425a 224
Zachary Sunberg 25:c4577daa425a 225 if(comm_time){
Zachary Sunberg 25:c4577daa425a 226 communicate();
Zachary Sunberg 25:c4577daa425a 227 comm_time = false;
Zachary Sunberg 25:c4577daa425a 228 }
Zachary Sunberg 4:70fea94b29ae 229
zsunberg 0:9f058fe8cab5 230 }
zsunberg 0:9f058fe8cab5 231
zsunberg 0:9f058fe8cab5 232 return 0;
zsunberg 0:9f058fe8cab5 233 }