single player mbedKart

Dependencies:   Motor

(notes)

Committer:
DerekW2015
Date:
Mon Dec 10 04:53:16 2018 +0000
Revision:
11:8d4b7702ac06
Parent:
9:6649141315be
Child:
12:4fec6ed886ab
Speed control WORKS

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DerekW2015 0:a9a4c0fd5f8a 1 #include "mbed.h"
DerekW2015 0:a9a4c0fd5f8a 2 #include "Motor.h"
DerekW2015 0:a9a4c0fd5f8a 3 #include "rgbled.h"
DerekW2015 0:a9a4c0fd5f8a 4 #include "rgbSensor.h"
DerekW2015 0:a9a4c0fd5f8a 5
DerekW2015 11:8d4b7702ac06 6 // Define threads and mutexes
DerekW2015 11:8d4b7702ac06 7 Thread thread1;
DerekW2015 11:8d4b7702ac06 8 Thread thread2;
DerekW2015 11:8d4b7702ac06 9 Mutex motors_lock;
DerekW2015 11:8d4b7702ac06 10
DerekW2015 0:a9a4c0fd5f8a 11 // Define devices
DerekW2015 0:a9a4c0fd5f8a 12 Motor left(p22, p16, p15); // pwm, fwd, rev
DerekW2015 0:a9a4c0fd5f8a 13 Motor right(p23, p19, p20); // pwm, fwd, rev
DerekW2015 0:a9a4c0fd5f8a 14 BusOut myled(LED1,LED2,LED3,LED4);
DerekW2015 0:a9a4c0fd5f8a 15 RGBLed myRGBled(p26, p25, p24); // red, green, blue
DerekW2015 0:a9a4c0fd5f8a 16 rgbSensor rgbsensor(p28, p27);
DerekW2015 0:a9a4c0fd5f8a 17 Serial blue(p13, p14); // serial tx, serial rx
DerekW2015 11:8d4b7702ac06 18 enum speed_state { accelerating, braking, coasting };
DerekW2015 0:a9a4c0fd5f8a 19
sli425 3:6c749bff51aa 20 //Game state variables
sli425 3:6c749bff51aa 21 int progress = 0;
DerekW2015 11:8d4b7702ac06 22 int current_item = 0;
DerekW2015 11:8d4b7702ac06 23 float speed_cmd = 0.0;
DerekW2015 11:8d4b7702ac06 24 float max_speed = 1.0;
DerekW2015 11:8d4b7702ac06 25 float acceleration_rate = 0.04;
DerekW2015 11:8d4b7702ac06 26 float brake_rate = 0.1;
DerekW2015 11:8d4b7702ac06 27 float coast_rate = 0.02;
sli425 3:6c749bff51aa 28 int cstate;
DerekW2015 11:8d4b7702ac06 29 speed_state sstate = coasting;
DerekW2015 6:57a0323bb6b7 30 bool collide = false;
sli425 3:6c749bff51aa 31
DerekW2015 0:a9a4c0fd5f8a 32 // Global game actions
DerekW2015 8:92bf0cc337b5 33 bool paused = false;
DerekW2015 8:92bf0cc337b5 34 void check_unpause() {
DerekW2015 8:92bf0cc337b5 35 char bnum=0;
DerekW2015 8:92bf0cc337b5 36 char bhit=0;
DerekW2015 8:92bf0cc337b5 37 while (true) {
DerekW2015 8:92bf0cc337b5 38 if (blue.getc()=='B') { //button data packet
DerekW2015 8:92bf0cc337b5 39 bnum = blue.getc(); //button number
DerekW2015 8:92bf0cc337b5 40 bhit = blue.getc(); //1=hit, 0=release
DerekW2015 8:92bf0cc337b5 41 if (blue.getc()==char(~('!' + 'B' + bnum + bhit))) { //checksum OK?
DerekW2015 8:92bf0cc337b5 42 if (bnum == '1') { //number button 1, pause
DerekW2015 8:92bf0cc337b5 43 if (bhit=='1') paused = false;
DerekW2015 8:92bf0cc337b5 44 }
DerekW2015 8:92bf0cc337b5 45 }
DerekW2015 8:92bf0cc337b5 46 }
DerekW2015 8:92bf0cc337b5 47 }
DerekW2015 8:92bf0cc337b5 48 }
DerekW2015 8:92bf0cc337b5 49 void game_paused() {
DerekW2015 8:92bf0cc337b5 50 // Cycle through LEDs
DerekW2015 8:92bf0cc337b5 51 Thread pause_thread;
DerekW2015 8:92bf0cc337b5 52 pause_thread.start(check_unpause);
DerekW2015 8:92bf0cc337b5 53 while (paused) {
DerekW2015 8:92bf0cc337b5 54 int num = 1;
DerekW2015 8:92bf0cc337b5 55 for (int i = 0; i < 3; i++) {
DerekW2015 8:92bf0cc337b5 56 num *= 2;
DerekW2015 8:92bf0cc337b5 57 myled = num;
DerekW2015 8:92bf0cc337b5 58 ThisThread::sleep_for(100);
DerekW2015 8:92bf0cc337b5 59 }
DerekW2015 8:92bf0cc337b5 60 ThisThread::sleep_for(500);
DerekW2015 8:92bf0cc337b5 61 for (int i = 3; i > 0; i--) {
DerekW2015 8:92bf0cc337b5 62 num /= 2;
DerekW2015 8:92bf0cc337b5 63 myled = num;
DerekW2015 8:92bf0cc337b5 64 ThisThread::sleep_for(100);
DerekW2015 8:92bf0cc337b5 65 }
DerekW2015 8:92bf0cc337b5 66 ThisThread::sleep_for(500);
DerekW2015 8:92bf0cc337b5 67 }
DerekW2015 11:8d4b7702ac06 68 }
DerekW2015 11:8d4b7702ac06 69
DerekW2015 11:8d4b7702ac06 70 // Thread to control speed
DerekW2015 11:8d4b7702ac06 71 void speed_control() {
DerekW2015 11:8d4b7702ac06 72 // The kart has to be in one of three states at all times
DerekW2015 11:8d4b7702ac06 73 while(1) {
DerekW2015 11:8d4b7702ac06 74 while(sstate == coasting) {
DerekW2015 11:8d4b7702ac06 75 if (speed_cmd > 0.0) {
DerekW2015 11:8d4b7702ac06 76 speed_cmd -= coast_rate;
DerekW2015 11:8d4b7702ac06 77 left.speed(speed_cmd);
DerekW2015 11:8d4b7702ac06 78 right.speed(speed_cmd);
DerekW2015 11:8d4b7702ac06 79 }
DerekW2015 11:8d4b7702ac06 80 ThisThread::sleep_for(200);
DerekW2015 11:8d4b7702ac06 81 }
DerekW2015 11:8d4b7702ac06 82 while(sstate == accelerating) {
DerekW2015 11:8d4b7702ac06 83 if (speed_cmd < 1.0) {
DerekW2015 11:8d4b7702ac06 84 speed_cmd += acceleration_rate;
DerekW2015 11:8d4b7702ac06 85 left.speed(speed_cmd);
DerekW2015 11:8d4b7702ac06 86 right.speed(speed_cmd);
DerekW2015 11:8d4b7702ac06 87 }
DerekW2015 11:8d4b7702ac06 88 ThisThread::sleep_for(200);
DerekW2015 11:8d4b7702ac06 89 }
DerekW2015 11:8d4b7702ac06 90 while(sstate == braking) {
DerekW2015 11:8d4b7702ac06 91 if (speed_cmd > 0.0) {
DerekW2015 11:8d4b7702ac06 92 speed_cmd -= brake_rate;
DerekW2015 11:8d4b7702ac06 93 left.speed(speed_cmd);
DerekW2015 11:8d4b7702ac06 94 right.speed(speed_cmd);
DerekW2015 11:8d4b7702ac06 95 }
DerekW2015 11:8d4b7702ac06 96 ThisThread::sleep_for(200);
DerekW2015 11:8d4b7702ac06 97 }
DerekW2015 11:8d4b7702ac06 98 }
DerekW2015 11:8d4b7702ac06 99 }
DerekW2015 11:8d4b7702ac06 100
DerekW2015 11:8d4b7702ac06 101 // Thread to brake
DerekW2015 11:8d4b7702ac06 102 void brake() {
DerekW2015 11:8d4b7702ac06 103 motors_lock.lock();
DerekW2015 11:8d4b7702ac06 104 myled = 8;
DerekW2015 11:8d4b7702ac06 105 while(1) {
DerekW2015 11:8d4b7702ac06 106 if (speed_cmd > 0.0) {
DerekW2015 11:8d4b7702ac06 107 speed_cmd -= brake_rate;
DerekW2015 11:8d4b7702ac06 108 left.speed(speed_cmd);
DerekW2015 11:8d4b7702ac06 109 right.speed(speed_cmd);
DerekW2015 11:8d4b7702ac06 110 }
DerekW2015 11:8d4b7702ac06 111 ThisThread::sleep_for(200);
DerekW2015 11:8d4b7702ac06 112 }
DerekW2015 11:8d4b7702ac06 113 }
DerekW2015 0:a9a4c0fd5f8a 114
sli425 3:6c749bff51aa 115 // Thread for checking rgb sensor values and updating game variables
sli425 3:6c749bff51aa 116 // Change later depending on behavior of RGB sensor and colors used
sli425 3:6c749bff51aa 117 int thresh = 150; //change this depending on RGB values
sli425 3:6c749bff51aa 118 void check_RGB() {
sli425 3:6c749bff51aa 119 rgbsensor.update();
sli425 3:6c749bff51aa 120 int C_value = rgbsensor.get_C();
sli425 3:6c749bff51aa 121 int R_value = rgbsensor.get_R();
sli425 3:6c749bff51aa 122 int G_value = rgbsensor.get_G();
sli425 3:6c749bff51aa 123 int B_value = rgbsensor.get_B();
sli425 3:6c749bff51aa 124 if(C_value > thresh && R_value > thresh && G_value > thresh && B_value > thresh && current_item == 0) { //Check for if cart runs over an item box
sli425 3:6c749bff51aa 125 current_item = rand() % 4 + 1; //change this depending on items implemented and random item alg
sli425 3:6c749bff51aa 126 cstate = 0;
sli425 3:6c749bff51aa 127 }
sli425 3:6c749bff51aa 128 else if(C_value > thresh && R_value > thresh && G_value > thresh && B_value > thresh) { //Check for if cart runs over a speed boost panel
sli425 3:6c749bff51aa 129 max_speed = 1; //change this depending on speed up panel algs
sli425 3:6c749bff51aa 130 cstate = 0;
sli425 3:6c749bff51aa 131 }
sli425 3:6c749bff51aa 132 else if(C_value > thresh && R_value > thresh && G_value > thresh && B_value > thresh) { //Check if cart collides with wall
DerekW2015 6:57a0323bb6b7 133 collide = true;
sli425 3:6c749bff51aa 134 }
sli425 3:6c749bff51aa 135 else if(C_value > thresh && R_value > thresh && G_value > thresh && B_value > thresh) { //Check if cart reaches next checkpoint. cstate is set to 1 upon seeing first color of checkpoint
sli425 3:6c749bff51aa 136 cstate = 1;
sli425 3:6c749bff51aa 137 }
sli425 3:6c749bff51aa 138 else if(C_value > thresh && R_value > thresh && G_value > thresh && B_value > thresh && cstate == 1) {
sli425 3:6c749bff51aa 139 //Second part of checking if cart reaches next checkpoint. If the previous color was passed through previously, updates checkpoint progress
sli425 3:6c749bff51aa 140 cstate = 0;
sli425 3:6c749bff51aa 141 progress++;
sli425 3:6c749bff51aa 142 }
sli425 3:6c749bff51aa 143 else {
sli425 3:6c749bff51aa 144 cstate = 0;
sli425 3:6c749bff51aa 145 }
sli425 3:6c749bff51aa 146 }
sli425 3:6c749bff51aa 147
DerekW2015 0:a9a4c0fd5f8a 148 int main() {
DerekW2015 0:a9a4c0fd5f8a 149 // Start threads
DerekW2015 9:6649141315be 150 thread1.start(check_RGB);
DerekW2015 11:8d4b7702ac06 151 thread2.start(speed_control); // Since we're stopped, this won't do anything
DerekW2015 0:a9a4c0fd5f8a 152
DerekW2015 0:a9a4c0fd5f8a 153 // Bluetooth controller code
DerekW2015 0:a9a4c0fd5f8a 154 char bnum=0;
DerekW2015 0:a9a4c0fd5f8a 155 char bhit=0;
DerekW2015 0:a9a4c0fd5f8a 156 while(1) {
DerekW2015 0:a9a4c0fd5f8a 157 if (blue.getc()=='!') {
DerekW2015 0:a9a4c0fd5f8a 158 if (blue.getc()=='B') { //button data packet
DerekW2015 0:a9a4c0fd5f8a 159 bnum = blue.getc(); //button number
DerekW2015 0:a9a4c0fd5f8a 160 bhit = blue.getc(); //1=hit, 0=release
DerekW2015 0:a9a4c0fd5f8a 161 if (blue.getc()==char(~('!' + 'B' + bnum + bhit))) { //checksum OK?
DerekW2015 0:a9a4c0fd5f8a 162 switch (bnum) {
DerekW2015 0:a9a4c0fd5f8a 163 case '1': //number button 1, pause
DerekW2015 0:a9a4c0fd5f8a 164 if (bhit=='1') {
DerekW2015 0:a9a4c0fd5f8a 165 //myled = bnum - '0'; //current button number will appear on LEDs
DerekW2015 8:92bf0cc337b5 166 paused = true;
DerekW2015 8:92bf0cc337b5 167 game_paused();
DerekW2015 0:a9a4c0fd5f8a 168 }
DerekW2015 0:a9a4c0fd5f8a 169 break;
DerekW2015 0:a9a4c0fd5f8a 170 case '2': //number button 2, accelerate
DerekW2015 0:a9a4c0fd5f8a 171 if (bhit=='1') {
DerekW2015 11:8d4b7702ac06 172 sstate = accelerating;
DerekW2015 0:a9a4c0fd5f8a 173 } else {
DerekW2015 11:8d4b7702ac06 174 sstate = coasting;
DerekW2015 0:a9a4c0fd5f8a 175 }
DerekW2015 0:a9a4c0fd5f8a 176 break;
DerekW2015 0:a9a4c0fd5f8a 177 case '3': //number button 3
DerekW2015 0:a9a4c0fd5f8a 178 if (bhit=='1') {
DerekW2015 0:a9a4c0fd5f8a 179 //myled = bnum - '0'; //current button number will appear on LEDs
DerekW2015 0:a9a4c0fd5f8a 180 //add hit code here
DerekW2015 0:a9a4c0fd5f8a 181 } else {
DerekW2015 0:a9a4c0fd5f8a 182 //add release code here
DerekW2015 0:a9a4c0fd5f8a 183 }
DerekW2015 0:a9a4c0fd5f8a 184 break;
DerekW2015 0:a9a4c0fd5f8a 185 case '4': //number button 4, brakes
DerekW2015 0:a9a4c0fd5f8a 186 if (bhit=='1') {
DerekW2015 0:a9a4c0fd5f8a 187 //myled = bnum - '0'; //current button number will appear on LEDs
DerekW2015 11:8d4b7702ac06 188 sstate = braking;
DerekW2015 0:a9a4c0fd5f8a 189 } else {
DerekW2015 11:8d4b7702ac06 190 sstate = coasting;
DerekW2015 0:a9a4c0fd5f8a 191 }
DerekW2015 0:a9a4c0fd5f8a 192 break;
DerekW2015 0:a9a4c0fd5f8a 193 case '5': //button 5 up arrow
DerekW2015 0:a9a4c0fd5f8a 194 if (bhit=='1') {
DerekW2015 0:a9a4c0fd5f8a 195 //myled = bnum - '0'; //current button number will appear on LEDs
DerekW2015 0:a9a4c0fd5f8a 196 //throw_item();
DerekW2015 0:a9a4c0fd5f8a 197 //item_box();
DerekW2015 0:a9a4c0fd5f8a 198 } else {
DerekW2015 0:a9a4c0fd5f8a 199
DerekW2015 0:a9a4c0fd5f8a 200 }
DerekW2015 0:a9a4c0fd5f8a 201 break;
DerekW2015 0:a9a4c0fd5f8a 202 case '6': //button 6 down arrow
DerekW2015 0:a9a4c0fd5f8a 203 if (bhit=='1') {
DerekW2015 11:8d4b7702ac06 204 //myled = bnum - '0'; //current button number will appear on LEDs
DerekW2015 0:a9a4c0fd5f8a 205 left.speed(-1.0);
DerekW2015 0:a9a4c0fd5f8a 206 right.speed(-1.0);
DerekW2015 0:a9a4c0fd5f8a 207 } else {
DerekW2015 0:a9a4c0fd5f8a 208 left.speed(0.0);
DerekW2015 0:a9a4c0fd5f8a 209 right.speed(0.0);
DerekW2015 0:a9a4c0fd5f8a 210 }
DerekW2015 0:a9a4c0fd5f8a 211 break;
DerekW2015 0:a9a4c0fd5f8a 212 case '7': //button 7 left arrow
DerekW2015 0:a9a4c0fd5f8a 213 if (bhit=='1') {
DerekW2015 0:a9a4c0fd5f8a 214 //myled = bnum - '0'; //current button number will appear on LEDs
DerekW2015 0:a9a4c0fd5f8a 215 left.speed(0.3);
DerekW2015 0:a9a4c0fd5f8a 216 right.speed(1.0);
DerekW2015 0:a9a4c0fd5f8a 217 } else {
DerekW2015 0:a9a4c0fd5f8a 218 left.speed(0.0);
DerekW2015 0:a9a4c0fd5f8a 219 right.speed(0.0);
DerekW2015 0:a9a4c0fd5f8a 220 }
DerekW2015 0:a9a4c0fd5f8a 221 break;
DerekW2015 0:a9a4c0fd5f8a 222 case '8': //button 8 right arrow
DerekW2015 0:a9a4c0fd5f8a 223 if (bhit=='1') {
DerekW2015 0:a9a4c0fd5f8a 224 //myled = bnum - '0'; //current button number will appear on LEDs
DerekW2015 0:a9a4c0fd5f8a 225 left.speed(1.0);
DerekW2015 0:a9a4c0fd5f8a 226 right.speed(0.3);
DerekW2015 0:a9a4c0fd5f8a 227 } else {
DerekW2015 0:a9a4c0fd5f8a 228 left.speed(0.0);
DerekW2015 0:a9a4c0fd5f8a 229 right.speed(0.0);
DerekW2015 0:a9a4c0fd5f8a 230 }
DerekW2015 0:a9a4c0fd5f8a 231 break;
DerekW2015 0:a9a4c0fd5f8a 232 default:
DerekW2015 0:a9a4c0fd5f8a 233 break;
DerekW2015 0:a9a4c0fd5f8a 234 }
DerekW2015 0:a9a4c0fd5f8a 235 }
DerekW2015 0:a9a4c0fd5f8a 236 }
DerekW2015 0:a9a4c0fd5f8a 237 }
DerekW2015 0:a9a4c0fd5f8a 238 }
DerekW2015 0:a9a4c0fd5f8a 239 }