Basic funcitonality

Dependencies:   mbed mbed-rtos SevenSegmentSerial HC_SR04_Ultrasonic_Library

Committer:
glanier9
Date:
Fri Apr 30 15:01:34 2021 +0000
Revision:
10:a3796a403d28
Parent:
9:1d973bd9786c
Child:
11:1a6658a543e0
Almost final

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dtran76 5:99be83f824b8 1 //******************************************************
dtran76 5:99be83f824b8 2 // Mbed to Raspberry Pi ** Raspberry Pi to Mbed *
dtran76 5:99be83f824b8 3 //******************************************************
dtran76 5:99be83f824b8 4 // 0 - pass starting line ** S - start race *
dtran76 5:99be83f824b8 5 // 1 - pass checkpoint 1 ** R - reset *
dtran76 5:99be83f824b8 6 // 2 - pass checkpoint 2 ** *
dtran76 5:99be83f824b8 7 // ... ** *
dtran76 5:99be83f824b8 8 // 9 - end race ** *
dtran76 5:99be83f824b8 9 //******************************************************
dtran76 0:0747159bf07d 10
dtran76 0:0747159bf07d 11 #include "mbed.h"
dtran76 0:0747159bf07d 12 #include "ultrasonic.h"
glanier9 1:28e137ae5af7 13 #include "rtos.h"
glanier9 9:1d973bd9786c 14 #include "SevenSegmentSerial.h"
dtran76 0:0747159bf07d 15
glanier9 1:28e137ae5af7 16 Thread thread1;
glanier9 3:293a771fc470 17 Thread thread2;
dtran76 0:0747159bf07d 18 Serial pc(USBTX,USBRX);
dtran76 0:0747159bf07d 19 DigitalOut led0(p5);
dtran76 0:0747159bf07d 20 DigitalOut led1(p6);
dtran76 0:0747159bf07d 21 DigitalOut led2(p7);
glanier9 1:28e137ae5af7 22 PwmOut speaker(p25);
glanier9 3:293a771fc470 23 DigitalOut rgbRed(p23);
glanier9 3:293a771fc470 24 DigitalOut rgbGreen(p24);
glanier9 3:293a771fc470 25 DigitalOut rgbCtrl1(p8);
glanier9 3:293a771fc470 26 DigitalOut rgbCtrl2(p9);
glanier9 3:293a771fc470 27 DigitalOut rgbCtrl3(p10);
glanier9 10:a3796a403d28 28 SevenSegmentSerial ssd(UART_MODE, p28);
dtran76 0:0747159bf07d 29
dtran76 5:99be83f824b8 30 #define B4NOTE 500 //Hz
dtran76 5:99be83f824b8 31 #define E5NOTE 659 //Hz
dtran76 5:99be83f824b8 32
dtran76 5:99be83f824b8 33 int width[3]; //width of each checkpoint, mm
dtran76 5:99be83f824b8 34 int threshold[3]; //how much distance has to change, mm
glanier9 7:04c8f6b7a42a 35 float sensitivity[3] = {0.1,0.1,0.1};
dtran76 0:0747159bf07d 36 int total_laps = 3;
dtran76 0:0747159bf07d 37 int current_lap = 0;
glanier9 1:28e137ae5af7 38 int i = 500;
dtran76 5:99be83f824b8 39
glanier9 3:293a771fc470 40 bool early_start = 0;
glanier9 3:293a771fc470 41 bool start_done = 0;
dtran76 0:0747159bf07d 42
dtran76 0:0747159bf07d 43 int setup[3] = {1,1,1};
dtran76 0:0747159bf07d 44
dtran76 0:0747159bf07d 45 //state machine, tracks current position in track
dtran76 0:0747159bf07d 46 enum state_type {start,past_start,past_cp1,past_cp2};
dtran76 0:0747159bf07d 47 state_type track_state = start;
dtran76 0:0747159bf07d 48
dtran76 5:99be83f824b8 49 //Mbed reset
dtran76 5:99be83f824b8 50 extern "C" void mbed_reset();
dtran76 5:99be83f824b8 51
dtran76 5:99be83f824b8 52 //Starting countdown
glanier9 3:293a771fc470 53 void start_race()
glanier9 3:293a771fc470 54 {
glanier9 3:293a771fc470 55 // 3
glanier9 10:a3796a403d28 56 ssd.setDigit(3,0);
glanier9 3:293a771fc470 57 rgbRed = 1;
dtran76 5:99be83f824b8 58 speaker.period(1.0/B4NOTE);
glanier9 3:293a771fc470 59 speaker =0.5;
glanier9 3:293a771fc470 60 rgbCtrl1 = 1;
glanier9 3:293a771fc470 61 Thread::wait(500);
glanier9 3:293a771fc470 62 speaker = 0;
glanier9 3:293a771fc470 63 Thread::wait(500);
glanier9 3:293a771fc470 64 // 2
glanier9 10:a3796a403d28 65 ssd.setDigit(2,0);
glanier9 3:293a771fc470 66 speaker =0.5;
glanier9 3:293a771fc470 67 rgbCtrl2 = 1;
glanier9 3:293a771fc470 68 Thread::wait(500);
glanier9 3:293a771fc470 69 speaker = 0;
glanier9 3:293a771fc470 70 Thread::wait(500);
glanier9 3:293a771fc470 71 // 1
glanier9 10:a3796a403d28 72 ssd.setDigit(1,0);
glanier9 3:293a771fc470 73 speaker =0.5;
glanier9 3:293a771fc470 74 rgbCtrl3 = 1;
glanier9 3:293a771fc470 75 Thread::wait(500);
glanier9 3:293a771fc470 76 speaker = 0;
glanier9 3:293a771fc470 77 Thread::wait(500);
glanier9 3:293a771fc470 78 // GO!
glanier9 10:a3796a403d28 79 ssd.write("GOOO");
glanier9 3:293a771fc470 80 rgbRed = 0;
glanier9 3:293a771fc470 81 rgbGreen = 1;
glanier9 3:293a771fc470 82 start_done = 1;
dtran76 5:99be83f824b8 83 speaker.period(1.0/E5NOTE);
glanier9 3:293a771fc470 84 speaker =0.5;
glanier9 9:1d973bd9786c 85 Thread::wait(1000);
glanier9 3:293a771fc470 86 speaker = 0;
glanier9 3:293a771fc470 87 rgbCtrl1 = 0;
glanier9 3:293a771fc470 88 rgbCtrl2 = 0;
glanier9 3:293a771fc470 89 rgbCtrl3 = 0;
glanier9 3:293a771fc470 90 }
glanier9 3:293a771fc470 91
glanier9 2:8c29e1aaaff0 92 // Plays bleep for crossing finish line
glanier9 1:28e137ae5af7 93 void play_audio()
glanier9 1:28e137ae5af7 94 {
dtran76 5:99be83f824b8 95 speaker.period(1.0/B4NOTE); // 500hz period
glanier9 1:28e137ae5af7 96 speaker =0.5; //50% duty cycle - max volume
glanier9 2:8c29e1aaaff0 97 Thread::wait(150);
glanier9 1:28e137ae5af7 98 speaker=0.0; // turn off audio
glanier9 1:28e137ae5af7 99 }
glanier9 1:28e137ae5af7 100
dtran76 0:0747159bf07d 101 //executed when crossing starting line
dtran76 0:0747159bf07d 102 void start_line(int distance)
dtran76 0:0747159bf07d 103 {
dtran76 0:0747159bf07d 104 if (setup[0]) {
dtran76 0:0747159bf07d 105 width[0] = distance;
dtran76 5:99be83f824b8 106 threshold[0] = distance*sensitivity[0];
glanier9 1:28e137ae5af7 107 setup[0] = !setup[0];
dtran76 6:c8f14de0e3f4 108 //pc.printf("Setup: Starting Line\n");
dtran76 6:c8f14de0e3f4 109 //pc.printf("Distance: %3d\n\n",distance);
dtran76 0:0747159bf07d 110 }
glanier9 1:28e137ae5af7 111
dtran76 5:99be83f824b8 112 if (width[0] - distance >= threshold[0]) {
dtran76 6:c8f14de0e3f4 113 //pc.printf("Past starting line\n");
dtran76 0:0747159bf07d 114 led0 = 1;
dtran76 0:0747159bf07d 115 led1 = 0;
dtran76 0:0747159bf07d 116 led2 = 0;
dtran76 0:0747159bf07d 117 current_lap++;
glanier9 7:04c8f6b7a42a 118 //pc.printf("%d\n",current_lap);
dtran76 0:0747159bf07d 119 track_state = past_start;
glanier9 7:04c8f6b7a42a 120 switch (current_lap) {
glanier9 7:04c8f6b7a42a 121 case 1 :
glanier9 7:04c8f6b7a42a 122 pc.putc('0');
glanier9 7:04c8f6b7a42a 123 break;
glanier9 7:04c8f6b7a42a 124 case 2 :
glanier9 7:04c8f6b7a42a 125 pc.putc('3');
glanier9 7:04c8f6b7a42a 126 break;
glanier9 7:04c8f6b7a42a 127 case 3 :
glanier9 7:04c8f6b7a42a 128 pc.putc('6');
glanier9 7:04c8f6b7a42a 129 break;
glanier9 7:04c8f6b7a42a 130 }
glanier9 1:28e137ae5af7 131 thread1.start(&play_audio);
dtran76 0:0747159bf07d 132 }
dtran76 0:0747159bf07d 133 }
dtran76 0:0747159bf07d 134
dtran76 0:0747159bf07d 135 //executed when passing checkpoint 1
dtran76 0:0747159bf07d 136 void checkpoint1(int distance)
dtran76 0:0747159bf07d 137 {
dtran76 0:0747159bf07d 138 if (setup[1]) {
dtran76 0:0747159bf07d 139 width[1] = distance;
dtran76 5:99be83f824b8 140 threshold[1] = distance*sensitivity[1];
glanier9 1:28e137ae5af7 141 setup[1] = !setup[1];
dtran76 6:c8f14de0e3f4 142 //pc.printf("Setup: Starting Line\n");
dtran76 6:c8f14de0e3f4 143 //pc.printf("Distance: %3d\n\n",distance);
dtran76 0:0747159bf07d 144 }
glanier9 1:28e137ae5af7 145
dtran76 5:99be83f824b8 146 if (width[1] - distance >= threshold[1]) {
dtran76 6:c8f14de0e3f4 147 //pc.printf("Past Checkpoint 1\n");
dtran76 0:0747159bf07d 148 led1 = 1;
dtran76 0:0747159bf07d 149 track_state = past_cp1;
glanier9 7:04c8f6b7a42a 150 switch (current_lap) {
glanier9 7:04c8f6b7a42a 151 case 1 :
glanier9 7:04c8f6b7a42a 152 pc.putc('1');
glanier9 7:04c8f6b7a42a 153 break;
glanier9 7:04c8f6b7a42a 154 case 2 :
glanier9 7:04c8f6b7a42a 155 pc.putc('4');
glanier9 7:04c8f6b7a42a 156 break;
glanier9 7:04c8f6b7a42a 157 case 3 :
glanier9 7:04c8f6b7a42a 158 pc.putc('7');
glanier9 7:04c8f6b7a42a 159 break;
glanier9 7:04c8f6b7a42a 160 }
dtran76 6:c8f14de0e3f4 161 thread1.start(&play_audio);
dtran76 0:0747159bf07d 162 }
dtran76 0:0747159bf07d 163 }
dtran76 0:0747159bf07d 164
dtran76 0:0747159bf07d 165 //executed when passing checkpoint 2
dtran76 0:0747159bf07d 166 void checkpoint2(int distance)
dtran76 0:0747159bf07d 167 {
dtran76 0:0747159bf07d 168 if (setup[2]) {
dtran76 0:0747159bf07d 169 width[2] = distance;
dtran76 5:99be83f824b8 170 threshold[2] = distance*sensitivity[2];
glanier9 9:1d973bd9786c 171 setup[2] = !setup[2];
dtran76 6:c8f14de0e3f4 172 //pc.printf("Setup: Starting Line\n");
dtran76 6:c8f14de0e3f4 173 //pc.printf("Distance: %3d\n\n",distance);
dtran76 0:0747159bf07d 174 }
glanier9 1:28e137ae5af7 175
dtran76 5:99be83f824b8 176 if (width[2] - distance >= threshold[2]) {
dtran76 6:c8f14de0e3f4 177 //pc.printf("Past Checkpoint 2\n");
dtran76 0:0747159bf07d 178 led2 = 1;
dtran76 0:0747159bf07d 179 track_state = past_cp2;
glanier9 7:04c8f6b7a42a 180 switch (current_lap) {
glanier9 7:04c8f6b7a42a 181 case 1 :
glanier9 7:04c8f6b7a42a 182 pc.putc('2');
glanier9 7:04c8f6b7a42a 183 break;
glanier9 7:04c8f6b7a42a 184 case 2 :
glanier9 7:04c8f6b7a42a 185 pc.putc('5');
glanier9 7:04c8f6b7a42a 186 break;
glanier9 7:04c8f6b7a42a 187 case 3 :
glanier9 7:04c8f6b7a42a 188 pc.putc('8');
glanier9 7:04c8f6b7a42a 189 break;
glanier9 7:04c8f6b7a42a 190 }
dtran76 6:c8f14de0e3f4 191 thread1.start(&play_audio);
dtran76 0:0747159bf07d 192 }
dtran76 0:0747159bf07d 193 }
dtran76 0:0747159bf07d 194
dtran76 0:0747159bf07d 195 ultrasonic sonar0(p15,p16,0.1,0.1,&start_line); //starting line
dtran76 0:0747159bf07d 196 ultrasonic sonar1(p17,p18,0.1,0.1,&checkpoint1); //checkpoint 1
dtran76 0:0747159bf07d 197 ultrasonic sonar2(p21,p22,0.1,0.1,&checkpoint2); //checkpoint 2
dtran76 0:0747159bf07d 198
glanier9 1:28e137ae5af7 199 int main()
dtran76 0:0747159bf07d 200 {
glanier9 10:a3796a403d28 201 // Clear SSD
glanier9 10:a3796a403d28 202 ssd.clear();
glanier9 10:a3796a403d28 203
dtran76 5:99be83f824b8 204 //sonar initialization
dtran76 0:0747159bf07d 205 sonar0.startUpdates();
dtran76 0:0747159bf07d 206 sonar1.startUpdates();
dtran76 0:0747159bf07d 207 sonar2.startUpdates();
glanier9 1:28e137ae5af7 208
dtran76 5:99be83f824b8 209 //sonar calibration
dtran76 0:0747159bf07d 210 sonar0.checkDistance();
dtran76 0:0747159bf07d 211 sonar1.checkDistance();
dtran76 0:0747159bf07d 212 sonar2.checkDistance();
dtran76 0:0747159bf07d 213
dtran76 5:99be83f824b8 214 //wait for start char from Pi
dtran76 5:99be83f824b8 215 while (1) {
dtran76 5:99be83f824b8 216 if (pc.getc() == 'S') {
dtran76 5:99be83f824b8 217 break;
dtran76 5:99be83f824b8 218 }
dtran76 5:99be83f824b8 219 Thread::wait(50);
dtran76 5:99be83f824b8 220 }
dtran76 5:99be83f824b8 221
glanier9 7:04c8f6b7a42a 222 //starting countdown sequence
glanier9 3:293a771fc470 223 thread2.start(&start_race);
glanier9 3:293a771fc470 224
dtran76 5:99be83f824b8 225 //false start detect
glanier9 3:293a771fc470 226 while(!start_done) {
glanier9 10:a3796a403d28 227 sonar0.checkDistance();
glanier9 3:293a771fc470 228 if (current_lap) {
glanier9 10:a3796a403d28 229 thread2.terminate();
glanier9 10:a3796a403d28 230 speaker = 0.5;
glanier9 10:a3796a403d28 231 speaker.period(1/B4NOTE);
glanier9 10:a3796a403d28 232 while(1) {
glanier9 10:a3796a403d28 233 speaker = 0;
glanier9 10:a3796a403d28 234 rgbCtrl1 = rgbCtrl2 = rgbCtrl3 = 0;
glanier9 10:a3796a403d28 235 led0 = led1 = led2 = 0;
glanier9 10:a3796a403d28 236 rgbRed = 0;
glanier9 10:a3796a403d28 237 rgbGreen = 0;
glanier9 10:a3796a403d28 238 led0 = !led0;
glanier9 10:a3796a403d28 239 led1 = !led1;
glanier9 10:a3796a403d28 240 led2 = !led2;
glanier9 10:a3796a403d28 241 Thread::wait(200);
glanier9 10:a3796a403d28 242 rgbRed = 1;
dtran76 5:99be83f824b8 243 rgbCtrl1 = !rgbCtrl1;
dtran76 5:99be83f824b8 244 rgbCtrl2 = !rgbCtrl2;
dtran76 5:99be83f824b8 245 rgbCtrl3 = !rgbCtrl3;
dtran76 6:c8f14de0e3f4 246 led0 = !led0;
dtran76 6:c8f14de0e3f4 247 led1 = !led1;
dtran76 6:c8f14de0e3f4 248 led2 = !led2;
glanier9 10:a3796a403d28 249 Thread::wait(200);
glanier9 10:a3796a403d28 250 //wait for start char from Pi
dtran76 5:99be83f824b8 251 }
glanier9 3:293a771fc470 252 }
glanier9 3:293a771fc470 253 }
glanier9 3:293a771fc470 254
glanier9 1:28e137ae5af7 255 while(1) {
dtran76 0:0747159bf07d 256 switch (track_state) {
dtran76 0:0747159bf07d 257 case start:
dtran76 0:0747159bf07d 258 sonar0.checkDistance();
dtran76 0:0747159bf07d 259 break;
dtran76 0:0747159bf07d 260 case past_start:
dtran76 0:0747159bf07d 261 sonar1.checkDistance();
dtran76 0:0747159bf07d 262 break;
dtran76 0:0747159bf07d 263 case past_cp1:
dtran76 0:0747159bf07d 264 sonar2.checkDistance();
dtran76 0:0747159bf07d 265 break;
dtran76 0:0747159bf07d 266 case past_cp2:
dtran76 0:0747159bf07d 267 sonar0.checkDistance();
dtran76 0:0747159bf07d 268 break;
dtran76 0:0747159bf07d 269 }
dtran76 0:0747159bf07d 270 if (current_lap > total_laps) {
dtran76 0:0747159bf07d 271 pc.putc('9');
dtran76 6:c8f14de0e3f4 272 //pc.printf("Race Over");
dtran76 0:0747159bf07d 273 while(1) {
dtran76 5:99be83f824b8 274 if (pc.getc() == 'R') {
dtran76 5:99be83f824b8 275 mbed_reset();
dtran76 5:99be83f824b8 276 }
glanier9 3:293a771fc470 277 Thread::wait(50);
dtran76 0:0747159bf07d 278 }
dtran76 0:0747159bf07d 279 }
glanier9 3:293a771fc470 280 Thread::wait(50);
dtran76 0:0747159bf07d 281 }
dtran76 0:0747159bf07d 282 }