Zachary Sunberg / Mbed 2 deprecated SAILORSbot

Dependencies:   mbed

Committer:
zsunberg
Date:
Tue Jul 12 03:58:51 2016 +0000
Revision:
35:09f92a88c0a7
Parent:
34:1629bdc97a0e
Child:
37:c31268270bb2
removed PID code

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