Team Ascent / Mbed 2 deprecated FinalBluetoothFunction

Dependencies:   mbed

Committer:
fraserhmbed
Date:
Thu Mar 26 15:52:33 2015 +0000
Revision:
2:054c41590f3f
Parent:
1:c4af0bbe20b9
bluetooth command top level

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fraserhmbed 0:f54028dab58f 1
fraserhmbed 0:f54028dab58f 2 /* what target am i at?
fraserhmbed 0:f54028dab58f 3 wait for input from phone
fraserhmbed 0:f54028dab58f 4 if input is 1 or 2 then return number to choose target choice function which then fires at target
fraserhmbed 0:f54028dab58f 5 did i hit the target?
fraserhmbed 0:f54028dab58f 6 wait for input from phone
fraserhmbed 0:f54028dab58f 7 if input is yes then go back to maze navigation function
fraserhmbed 0:f54028dab58f 8 if input is no then try again
fraserhmbed 0:f54028dab58f 9 ********************************************************** */
fraserhmbed 0:f54028dab58f 10
Dbee16 1:c4af0bbe20b9 11 #include "mbed.h"
Dbee16 1:c4af0bbe20b9 12
fraserhmbed 0:f54028dab58f 13 Serial blue(PTC4,PTC3);
fraserhmbed 0:f54028dab58f 14 DigitalOut led(LED1);
fraserhmbed 0:f54028dab58f 15
fraserhmbed 2:054c41590f3f 16
fraserhmbed 2:054c41590f3f 17 void manual_mode()
fraserhmbed 2:054c41590f3f 18 {
fraserhmbed 2:054c41590f3f 19 while( blue.readable() )
fraserhmbed 2:054c41590f3f 20 int direction = 0x11;
fraserhmbed 2:054c41590f3f 21 unsigned char rem_dir; //remote_direction
fraserhmbed 2:054c41590f3f 22
fraserhmbed 2:054c41590f3f 23 blue.printf("Thanks, calculating it now, you entered %c\n",rem_dir);
fraserhmbed 2:054c41590f3f 24 if( ( rem_dir == 'f') ) {
fraserhmbed 2:054c41590f3f 25 direction = 0x11;
fraserhmbed 2:054c41590f3f 26 blue.printf("You wanted to go straight\n");
fraserhmbed 2:054c41590f3f 27 switch (rem_dir) {
fraserhmbed 2:054c41590f3f 28
fraserhmbed 2:054c41590f3f 29 case('f'):
fraserhmbed 2:054c41590f3f 30 direction = 0x11;
fraserhmbed 2:054c41590f3f 31 blue.printf("You wanted to go straight\n");
fraserhmbed 2:054c41590f3f 32 break;
fraserhmbed 2:054c41590f3f 33 case( 'b' ) :
fraserhmbed 2:054c41590f3f 34 direction = 0x00;
fraserhmbed 2:054c41590f3f 35 blue.printf("You wanted to go backwards\n");
fraserhmbed 2:054c41590f3f 36 break;
fraserhmbed 2:054c41590f3f 37 case( 'l' ) :
fraserhmbed 2:054c41590f3f 38
fraserhmbed 2:054c41590f3f 39 direction = 0x01;
fraserhmbed 2:054c41590f3f 40 blue.printf("You wanted to spin anti-clockwise\n");
fraserhmbed 2:054c41590f3f 41
fraserhmbed 2:054c41590f3f 42 break;
fraserhmbed 2:054c41590f3f 43 case ('r') :
fraserhmbed 2:054c41590f3f 44
fraserhmbed 2:054c41590f3f 45 direction = 0x10;
fraserhmbed 2:054c41590f3f 46 blue.printf("You wanted to spin clockwise\n");
fraserhmbed 2:054c41590f3f 47 break;
fraserhmbed 2:054c41590f3f 48 case ('s') :
fraserhmbed 2:054c41590f3f 49 motor_r.write(0);
fraserhmbed 2:054c41590f3f 50 motor_l.write(0);
fraserhmbed 2:054c41590f3f 51 blue.printf("Stopping now.\n");
fraserhmbed 2:054c41590f3f 52 break;
fraserhmbed 2:054c41590f3f 53 }
fraserhmbed 2:054c41590f3f 54 if ( (rem_dir == 'b' ) ) {
fraserhmbed 2:054c41590f3f 55
fraserhmbed 2:054c41590f3f 56 direction = 0x00;
fraserhmbed 2:054c41590f3f 57 blue.printf("You wanted to go backwards\n");
fraserhmbed 2:054c41590f3f 58 }
fraserhmbed 2:054c41590f3f 59 if ( (rem_dir == 'l' ) ) {
fraserhmbed 2:054c41590f3f 60
fraserhmbed 2:054c41590f3f 61 direction = 0x01;
fraserhmbed 2:054c41590f3f 62 blue.printf("You wanted to spin anti-clockwise\n");
fraserhmbed 2:054c41590f3f 63
fraserhmbed 2:054c41590f3f 64 }
fraserhmbed 2:054c41590f3f 65 if ( (rem_dir == 'r' ) ) {
fraserhmbed 2:054c41590f3f 66
fraserhmbed 2:054c41590f3f 67 direction = 0x10;
fraserhmbed 2:054c41590f3f 68 blue.printf("You wanted to spin clockwise\n");
fraserhmbed 2:054c41590f3f 69 }
fraserhmbed 2:054c41590f3f 70 if (rem_dir =='s') {
fraserhmbed 2:054c41590f3f 71
fraserhmbed 2:054c41590f3f 72 motor_r.write(0);
fraserhmbed 2:054c41590f3f 73 motor_l.write(0);
fraserhmbed 2:054c41590f3f 74 blue.printf("STAAAAHP\n");
fraserhmbed 2:054c41590f3f 75 } else {
fraserhmbed 2:054c41590f3f 76 wait(0.1);
fraserhmbed 2:054c41590f3f 77 wait(0.1);
fraserhmbed 2:054c41590f3f 78 blue.printf("What duty left?\n");
fraserhmbed 2:054c41590f3f 79 while ( blue.readable()==0 ) {} // loops until there is an input from the user
fraserhmbed 2:054c41590f3f 80 char l_speed = blue.getc();
fraserhmbed 2:054c41590f3f 81 int l_result = l_speed - '0';
fraserhmbed 2:054c41590f3f 82 int r_result = r_speed - '0';
fraserhmbed 2:054c41590f3f 83 set_direction(direction, (float)l_result/10, (float)r_result/10);
fraserhmbed 2:054c41590f3f 84 }
fraserhmbed 2:054c41590f3f 85
fraserhmbed 2:054c41590f3f 86 }
fraserhmbed 2:054c41590f3f 87
fraserhmbed 2:054c41590f3f 88 }
fraserhmbed 2:054c41590f3f 89
fraserhmbed 2:054c41590f3f 90 }
fraserhmbed 2:054c41590f3f 91
fraserhmbed 2:054c41590f3f 92 }
fraserhmbed 2:054c41590f3f 93
fraserhmbed 2:054c41590f3f 94
fraserhmbed 2:054c41590f3f 95
Dbee16 1:c4af0bbe20b9 96 // which target are we at?
fraserhmbed 2:054c41590f3f 97 void TargetChoice()
Dbee16 1:c4af0bbe20b9 98 {
Dbee16 1:c4af0bbe20b9 99
fraserhmbed 0:f54028dab58f 100 blue.printf("Which target am I at?"); // ask user question
fraserhmbed 0:f54028dab58f 101 char TargetIn = blue.getc(); // assign user input to TargetIn
fraserhmbed 2:054c41590f3f 102 int command=0;
Dbee16 1:c4af0bbe20b9 103
Dbee16 1:c4af0bbe20b9 104 while(command==0) { // loop until a command has been given
Dbee16 1:c4af0bbe20b9 105 switch (TargetIn) { // input is either 1 or 2 in DECIMAL
fraserhmbed 0:f54028dab58f 106 case 0x31: // if target 1
fraserhmbed 2:054c41590f3f 107 closetarget(); //
fraserhmbed 0:f54028dab58f 108 command = 1; // exit while
Dbee16 1:c4af0bbe20b9 109 break;
fraserhmbed 0:f54028dab58f 110 case 0x32: // if target 2
fraserhmbed 2:054c41590f3f 111 fartarget(); // return 2 to ball firing or call ball fire 2
fraserhmbed 0:f54028dab58f 112 command = 1; // exit while
Dbee16 1:c4af0bbe20b9 113 break;
Dbee16 1:c4af0bbe20b9 114 }
fraserhmbed 0:f54028dab58f 115 }
fraserhmbed 0:f54028dab58f 116 }
fraserhmbed 0:f54028dab58f 117
fraserhmbed 0:f54028dab58f 118 // did we hit the target
Dbee16 1:c4af0bbe20b9 119 int SuccessCheck()
Dbee16 1:c4af0bbe20b9 120 {
Dbee16 1:c4af0bbe20b9 121
fraserhmbed 0:f54028dab58f 122 blue.printf("Did I hit the target?"); // ask user question
fraserhmbed 0:f54028dab58f 123 char SuccessIn = blue.getc(); // assign user input to SuccessIn
fraserhmbed 0:f54028dab58f 124 int command=0, success=0;
Dbee16 1:c4af0bbe20b9 125
fraserhmbed 0:f54028dab58f 126 while(command==0) { // loop until a command has been given
fraserhmbed 0:f54028dab58f 127 switch (SuccessIn) { // input either y (0x79) or n (0x6E)
Dbee16 1:c4af0bbe20b9 128 case 0x79: // if input is y
Dbee16 1:c4af0bbe20b9 129 success=1; // return 1 directs to go back to the maze and locate next target
fraserhmbed 0:f54028dab58f 130 command = 1;
Dbee16 1:c4af0bbe20b9 131 break;
Dbee16 1:c4af0bbe20b9 132
fraserhmbed 0:f54028dab58f 133 case 0x6E: // if input is n
Dbee16 1:c4af0bbe20b9 134 success=0; // return 0 to go back to trying to hit the target
fraserhmbed 0:f54028dab58f 135 command = 1;
Dbee16 1:c4af0bbe20b9 136 break;
Dbee16 1:c4af0bbe20b9 137 }
Dbee16 1:c4af0bbe20b9 138
fraserhmbed 0:f54028dab58f 139 }
Dbee16 1:c4af0bbe20b9 140 return success;
Dbee16 1:c4af0bbe20b9 141 }
Dbee16 1:c4af0bbe20b9 142
fraserhmbed 0:f54028dab58f 143 //main bluetooth operation function
Dbee16 1:c4af0bbe20b9 144 void MazeBluetoothing()
Dbee16 1:c4af0bbe20b9 145 {
Dbee16 1:c4af0bbe20b9 146
Dbee16 1:c4af0bbe20b9 147 // int bluetooth=0; does this still initialise int bluetooth to 0? for the while loop?
Dbee16 1:c4af0bbe20b9 148 while(int bluetooth=0) {
Dbee16 1:c4af0bbe20b9 149
Dbee16 1:c4af0bbe20b9 150 int target = TargetChoice(); // call target choosing function
Dbee16 1:c4af0bbe20b9 151
Dbee16 1:c4af0bbe20b9 152 // if target = 1 then call function to fire at target 1, if target = 2 then call fire function 2
Dbee16 1:c4af0bbe20b9 153 switch (target) {
Dbee16 1:c4af0bbe20b9 154 case 1:
Dbee16 1:c4af0bbe20b9 155 //call target 1 function
Dbee16 1:c4af0bbe20b9 156 break;
fraserhmbed 0:f54028dab58f 157
Dbee16 1:c4af0bbe20b9 158 case 2:
Dbee16 1:c4af0bbe20b9 159 //call target 2 function
Dbee16 1:c4af0bbe20b9 160 break;
Dbee16 1:c4af0bbe20b9 161 }
Dbee16 1:c4af0bbe20b9 162 int success = SuccessCheck();
Dbee16 1:c4af0bbe20b9 163
Dbee16 1:c4af0bbe20b9 164 // if success is 0, then reposition & go back to start of bluetoothing()
Dbee16 1:c4af0bbe20b9 165 switch (success) {
Dbee16 1:c4af0bbe20b9 166 case 0:
Dbee16 1:c4af0bbe20b9 167 // call repositioning functionthen break to go back to loop of bluetoothing
Dbee16 1:c4af0bbe20b9 168 break;
Dbee16 1:c4af0bbe20b9 169
Dbee16 1:c4af0bbe20b9 170 case 1:
Dbee16 1:c4af0bbe20b9 171 bluetooth=1;
Dbee16 1:c4af0bbe20b9 172 break;
Dbee16 1:c4af0bbe20b9 173
Dbee16 1:c4af0bbe20b9 174 }
Dbee16 1:c4af0bbe20b9 175 }
fraserhmbed 0:f54028dab58f 176 }
fraserhmbed 0:f54028dab58f 177
fraserhmbed 0:f54028dab58f 178
fraserhmbed 0:f54028dab58f 179 //motor select pins
fraserhmbed 0:f54028dab58f 180 DigitalOut motor_lf(PTE2);
fraserhmbed 0:f54028dab58f 181 DigitalOut motor_lb(PTE3);
fraserhmbed 0:f54028dab58f 182 DigitalOut motor_rf(PTE4);
fraserhmbed 0:f54028dab58f 183 DigitalOut motor_rb(PTE5);
fraserhmbed 0:f54028dab58f 184
fraserhmbed 0:f54028dab58f 185 //Frequency of Pulse Width Modulated signal in Hz
fraserhmbed 0:f54028dab58f 186 #define PWM_FREQ 1000
fraserhmbed 0:f54028dab58f 187
fraserhmbed 0:f54028dab58f 188 //PWM pin (Enable 1 and 2)
fraserhmbed 0:f54028dab58f 189 PwmOut motor_l (PTC2);
fraserhmbed 0:f54028dab58f 190 PwmOut motor_r (PTE29);
fraserhmbed 0:f54028dab58f 191
fraserhmbed 0:f54028dab58f 192 //LED to test
fraserhmbed 0:f54028dab58f 193 DigitalOut myled(LED_BLUE);
fraserhmbed 0:f54028dab58f 194
Dbee16 1:c4af0bbe20b9 195 void SpinFunct()
Dbee16 1:c4af0bbe20b9 196 {
fraserhmbed 0:f54028dab58f 197 //Set PWM frequency to 1000Hz
fraserhmbed 0:f54028dab58f 198 motor_l.period( 1.0f / (float) PWM_FREQ);
fraserhmbed 0:f54028dab58f 199 motor_r.period( 1.0f / (float) PWM_FREQ);
fraserhmbed 0:f54028dab58f 200 //Initialise direction to nothing.
fraserhmbed 0:f54028dab58f 201 motor_rf=0;
fraserhmbed 0:f54028dab58f 202 motor_rb=0;
fraserhmbed 0:f54028dab58f 203 motor_lf=0;
Dbee16 1:c4af0bbe20b9 204 motor_lb=0;
fraserhmbed 0:f54028dab58f 205 led=1;
fraserhmbed 0:f54028dab58f 206 set_direction(0x10, 0.5, 0.3); //robot spins to the right, 80% right forward ; 20% left backward
Dbee16 1:c4af0bbe20b9 207 wait(5);
Dbee16 1:c4af0bbe20b9 208 led=0;
Dbee16 1:c4af0bbe20b9 209
fraserhmbed 0:f54028dab58f 210 }
fraserhmbed 0:f54028dab58f 211
fraserhmbed 2:054c41590f3f 212 // cant send 10 in ascii or in hex as they
Dbee16 1:c4af0bbe20b9 213 /*
fraserhmbed 0:f54028dab58f 214
Dbee16 1:c4af0bbe20b9 215 send 11, 0.5, 0.2 in one string
Dbee16 1:c4af0bbe20b9 216 for the floats, it will send (num)(point)(num) ef 0.3 = 30, 2E, 33
Dbee16 1:c4af0bbe20b9 217 all in ASCII remember
Dbee16 1:c4af0bbe20b9 218
Dbee16 1:c4af0bbe20b9 219 so for:
Dbee16 1:c4af0bbe20b9 220 11 0.5 0.2
Dbee16 1:c4af0bbe20b9 221 it will send:
Dbee16 1:c4af0bbe20b9 222 31 31 20 30 2e 35 20 30 2e 32
Dbee16 1:c4af0bbe20b9 223
Dbee16 1:c4af0bbe20b9 224 sending 313120302e3520302e32 would cause a stack overload
Dbee16 1:c4af0bbe20b9 225
Dbee16 1:c4af0bbe20b9 226 going to have to split the user into 3 different lines of tx
Dbee16 1:c4af0bbe20b9 227
Dbee16 1:c4af0bbe20b9 228 so it'd be simpler too but more difficult for the user to control.
Dbee16 1:c4af0bbe20b9 229 might need to add in a "for how long for?" function that will only drive the motors for a short period of time
fraserhmbed 0:f54028dab58f 230
Dbee16 1:c4af0bbe20b9 231 user would have to be knowledgeable of the set direction function aka get daniel to do the demonstration
Dbee16 1:c4af0bbe20b9 232
Dbee16 1:c4af0bbe20b9 233 so then user sends: direction 11,10,01; speed 0.2,0.5,0.7; angle 0.2,0.4,0.8; time 1,2,3,4;
Dbee16 1:c4af0bbe20b9 234
Dbee16 1:c4af0bbe20b9 235 yes it is slow, but it allows for exact computation of distance, speed and angle
Dbee16 1:c4af0bbe20b9 236
Dbee16 1:c4af0bbe20b9 237 so 1 function with 4 different while loops
fraserhmbed 0:f54028dab58f 238
Dbee16 1:c4af0bbe20b9 239 while user has not input a direction, loop again
Dbee16 1:c4af0bbe20b9 240
Dbee16 1:c4af0bbe20b9 241 one function : remote control
Dbee16 1:c4af0bbe20b9 242 */
fraserhmbed 0:f54028dab58f 243
Dbee16 1:c4af0bbe20b9 244 int main()
Dbee16 1:c4af0bbe20b9 245 {
Dbee16 1:c4af0bbe20b9 246
Dbee16 1:c4af0bbe20b9 247 int spin[4] = {0x73, 0x70, 0x69, 0x6e};
fraserhmbed 0:f54028dab58f 248 int ctrl[4] = {0x63, 0x74, 0x72, 0x6c};
fraserhmbed 0:f54028dab58f 249 int maze[4] = {0x6d, 0x61, 0x7a, 0x65};
fraserhmbed 0:f54028dab58f 250 unsigned char x[4];
fraserhmbed 0:f54028dab58f 251
fraserhmbed 2:054c41590f3f 252
fraserhmbed 2:054c41590f3f 253 //Set PWM frequency to 1000Hz
fraserhmbed 2:054c41590f3f 254 motor_rb=0;
fraserhmbed 2:054c41590f3f 255 motor_lf=0;
fraserhmbed 2:054c41590f3f 256 motor_lb=0;
fraserhmbed 2:054c41590f3f 257
fraserhmbed 0:f54028dab58f 258 while (1) {
fraserhmbed 0:f54028dab58f 259 blue.printf("What will I do?\n"); // ask user question
fraserhmbed 0:f54028dab58f 260 while (blue.readable()==0) {} // loops until there is an input from the user
Dbee16 1:c4af0bbe20b9 261
Dbee16 1:c4af0bbe20b9 262 for(int i=0; i<4; i++) {
Dbee16 1:c4af0bbe20b9 263 x[i] = blue.getc(); //Store incoming response into array
Dbee16 1:c4af0bbe20b9 264 }
Dbee16 1:c4af0bbe20b9 265
fraserhmbed 2:054c41590f3f 266 int FindSpin=0, FindCtrl=0, FindMaze=0;
fraserhmbed 0:f54028dab58f 267
Dbee16 1:c4af0bbe20b9 268 for(int s=0; s<4; s++) {
Dbee16 1:c4af0bbe20b9 269 if (x[s]==spin[s]) {
Dbee16 1:c4af0bbe20b9 270 FindSpin++;
Dbee16 1:c4af0bbe20b9 271 }
fraserhmbed 2:054c41590f3f 272
Dbee16 1:c4af0bbe20b9 273 if (x[s]==ctrl[s]) {
Dbee16 1:c4af0bbe20b9 274 FindCtrl++;
Dbee16 1:c4af0bbe20b9 275 }
Dbee16 1:c4af0bbe20b9 276 if (x[s]==maze[s]) {
Dbee16 1:c4af0bbe20b9 277 FindMaze++;
Dbee16 1:c4af0bbe20b9 278 }
fraserhmbed 0:f54028dab58f 279 }
Dbee16 1:c4af0bbe20b9 280
Dbee16 1:c4af0bbe20b9 281 if (FindSpin==4) {
Dbee16 1:c4af0bbe20b9 282 SpinFunct();
Dbee16 1:c4af0bbe20b9 283 }
fraserhmbed 2:054c41590f3f 284
fraserhmbed 2:054c41590f3f 285 if (FindCtrl==4) {
fraserhmbed 2:054c41590f3f 286 manual_mode() ;
Dbee16 1:c4af0bbe20b9 287 }
fraserhmbed 2:054c41590f3f 288
Dbee16 1:c4af0bbe20b9 289 if (FindMaze==4) {
Dbee16 1:c4af0bbe20b9 290 led=1;
Dbee16 1:c4af0bbe20b9 291 wait(4);
Dbee16 1:c4af0bbe20b9 292 led=0;
Dbee16 1:c4af0bbe20b9 293 }
fraserhmbed 0:f54028dab58f 294 }
fraserhmbed 2:054c41590f3f 295 }