Zachary Sunberg / Mbed 2 deprecated SAILORSbot_student

Dependencies:   mbed

Fork of SAILORSbot by Zachary Sunberg

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