Basic funcitonality

Dependencies:   mbed mbed-rtos SevenSegmentSerial HC_SR04_Ultrasonic_Library

Committer:
glanier9
Date:
Fri Apr 30 14:21:29 2021 +0000
Revision:
9:1d973bd9786c
Parent:
7:04c8f6b7a42a
Child:
10:a3796a403d28
edits for seven segment display;

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 9:1d973bd9786c 28 SevenSegmentSerial mydisplay(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 3:293a771fc470 56 rgbRed = 1;
dtran76 5:99be83f824b8 57 speaker.period(1.0/B4NOTE);
glanier9 3:293a771fc470 58 speaker =0.5;
glanier9 3:293a771fc470 59 rgbCtrl1 = 1;
glanier9 3:293a771fc470 60 Thread::wait(500);
glanier9 3:293a771fc470 61 speaker = 0;
glanier9 3:293a771fc470 62 Thread::wait(500);
glanier9 3:293a771fc470 63 // 2
glanier9 3:293a771fc470 64 speaker =0.5;
glanier9 3:293a771fc470 65 rgbCtrl2 = 1;
glanier9 3:293a771fc470 66 Thread::wait(500);
glanier9 3:293a771fc470 67 speaker = 0;
glanier9 3:293a771fc470 68 Thread::wait(500);
glanier9 3:293a771fc470 69 // 1
glanier9 3:293a771fc470 70 speaker =0.5;
glanier9 3:293a771fc470 71 rgbCtrl3 = 1;
glanier9 3:293a771fc470 72 Thread::wait(500);
glanier9 3:293a771fc470 73 speaker = 0;
glanier9 3:293a771fc470 74 Thread::wait(500);
glanier9 3:293a771fc470 75 // GO!
glanier9 3:293a771fc470 76 rgbRed = 0;
glanier9 3:293a771fc470 77 rgbGreen = 1;
glanier9 3:293a771fc470 78 start_done = 1;
dtran76 5:99be83f824b8 79 speaker.period(1.0/E5NOTE);
glanier9 3:293a771fc470 80 speaker =0.5;
glanier9 9:1d973bd9786c 81 Thread::wait(1000);
glanier9 3:293a771fc470 82 speaker = 0;
glanier9 3:293a771fc470 83 rgbCtrl1 = 0;
glanier9 3:293a771fc470 84 rgbCtrl2 = 0;
glanier9 3:293a771fc470 85 rgbCtrl3 = 0;
glanier9 3:293a771fc470 86 }
glanier9 3:293a771fc470 87
glanier9 2:8c29e1aaaff0 88 // Plays bleep for crossing finish line
glanier9 1:28e137ae5af7 89 void play_audio()
glanier9 1:28e137ae5af7 90 {
dtran76 5:99be83f824b8 91 speaker.period(1.0/B4NOTE); // 500hz period
glanier9 1:28e137ae5af7 92 speaker =0.5; //50% duty cycle - max volume
glanier9 2:8c29e1aaaff0 93 Thread::wait(150);
glanier9 1:28e137ae5af7 94 speaker=0.0; // turn off audio
glanier9 1:28e137ae5af7 95 }
glanier9 1:28e137ae5af7 96
dtran76 0:0747159bf07d 97 //executed when crossing starting line
dtran76 0:0747159bf07d 98 void start_line(int distance)
dtran76 0:0747159bf07d 99 {
dtran76 0:0747159bf07d 100 if (setup[0]) {
dtran76 0:0747159bf07d 101 width[0] = distance;
dtran76 5:99be83f824b8 102 threshold[0] = distance*sensitivity[0];
glanier9 1:28e137ae5af7 103 setup[0] = !setup[0];
dtran76 6:c8f14de0e3f4 104 //pc.printf("Setup: Starting Line\n");
dtran76 6:c8f14de0e3f4 105 //pc.printf("Distance: %3d\n\n",distance);
dtran76 0:0747159bf07d 106 }
glanier9 1:28e137ae5af7 107
dtran76 5:99be83f824b8 108 if (width[0] - distance >= threshold[0]) {
dtran76 6:c8f14de0e3f4 109 //pc.printf("Past starting line\n");
dtran76 0:0747159bf07d 110 led0 = 1;
dtran76 0:0747159bf07d 111 led1 = 0;
dtran76 0:0747159bf07d 112 led2 = 0;
dtran76 0:0747159bf07d 113 current_lap++;
glanier9 7:04c8f6b7a42a 114 //pc.printf("%d\n",current_lap);
dtran76 0:0747159bf07d 115 track_state = past_start;
glanier9 7:04c8f6b7a42a 116 switch (current_lap) {
glanier9 7:04c8f6b7a42a 117 case 1 :
glanier9 7:04c8f6b7a42a 118 pc.putc('0');
glanier9 7:04c8f6b7a42a 119 break;
glanier9 7:04c8f6b7a42a 120 case 2 :
glanier9 7:04c8f6b7a42a 121 pc.putc('3');
glanier9 7:04c8f6b7a42a 122 break;
glanier9 7:04c8f6b7a42a 123 case 3 :
glanier9 7:04c8f6b7a42a 124 pc.putc('6');
glanier9 7:04c8f6b7a42a 125 break;
glanier9 7:04c8f6b7a42a 126 }
glanier9 1:28e137ae5af7 127 thread1.start(&play_audio);
dtran76 0:0747159bf07d 128 }
dtran76 0:0747159bf07d 129 }
dtran76 0:0747159bf07d 130
dtran76 0:0747159bf07d 131 //executed when passing checkpoint 1
dtran76 0:0747159bf07d 132 void checkpoint1(int distance)
dtran76 0:0747159bf07d 133 {
dtran76 0:0747159bf07d 134 if (setup[1]) {
dtran76 0:0747159bf07d 135 width[1] = distance;
dtran76 5:99be83f824b8 136 threshold[1] = distance*sensitivity[1];
glanier9 1:28e137ae5af7 137 setup[1] = !setup[1];
dtran76 6:c8f14de0e3f4 138 //pc.printf("Setup: Starting Line\n");
dtran76 6:c8f14de0e3f4 139 //pc.printf("Distance: %3d\n\n",distance);
dtran76 0:0747159bf07d 140 }
glanier9 1:28e137ae5af7 141
dtran76 5:99be83f824b8 142 if (width[1] - distance >= threshold[1]) {
dtran76 6:c8f14de0e3f4 143 //pc.printf("Past Checkpoint 1\n");
dtran76 0:0747159bf07d 144 led1 = 1;
dtran76 0:0747159bf07d 145 track_state = past_cp1;
glanier9 7:04c8f6b7a42a 146 switch (current_lap) {
glanier9 7:04c8f6b7a42a 147 case 1 :
glanier9 7:04c8f6b7a42a 148 pc.putc('1');
glanier9 7:04c8f6b7a42a 149 break;
glanier9 7:04c8f6b7a42a 150 case 2 :
glanier9 7:04c8f6b7a42a 151 pc.putc('4');
glanier9 7:04c8f6b7a42a 152 break;
glanier9 7:04c8f6b7a42a 153 case 3 :
glanier9 7:04c8f6b7a42a 154 pc.putc('7');
glanier9 7:04c8f6b7a42a 155 break;
glanier9 7:04c8f6b7a42a 156 }
dtran76 6:c8f14de0e3f4 157 thread1.start(&play_audio);
dtran76 0:0747159bf07d 158 }
dtran76 0:0747159bf07d 159 }
dtran76 0:0747159bf07d 160
dtran76 0:0747159bf07d 161 //executed when passing checkpoint 2
dtran76 0:0747159bf07d 162 void checkpoint2(int distance)
dtran76 0:0747159bf07d 163 {
dtran76 0:0747159bf07d 164 if (setup[2]) {
dtran76 0:0747159bf07d 165 width[2] = distance;
dtran76 5:99be83f824b8 166 threshold[2] = distance*sensitivity[2];
glanier9 9:1d973bd9786c 167 setup[2] = !setup[2];
dtran76 6:c8f14de0e3f4 168 //pc.printf("Setup: Starting Line\n");
dtran76 6:c8f14de0e3f4 169 //pc.printf("Distance: %3d\n\n",distance);
dtran76 0:0747159bf07d 170 }
glanier9 1:28e137ae5af7 171
dtran76 5:99be83f824b8 172 if (width[2] - distance >= threshold[2]) {
dtran76 6:c8f14de0e3f4 173 //pc.printf("Past Checkpoint 2\n");
dtran76 0:0747159bf07d 174 led2 = 1;
dtran76 0:0747159bf07d 175 track_state = past_cp2;
glanier9 7:04c8f6b7a42a 176 switch (current_lap) {
glanier9 7:04c8f6b7a42a 177 case 1 :
glanier9 7:04c8f6b7a42a 178 pc.putc('2');
glanier9 7:04c8f6b7a42a 179 break;
glanier9 7:04c8f6b7a42a 180 case 2 :
glanier9 7:04c8f6b7a42a 181 pc.putc('5');
glanier9 7:04c8f6b7a42a 182 break;
glanier9 7:04c8f6b7a42a 183 case 3 :
glanier9 7:04c8f6b7a42a 184 pc.putc('8');
glanier9 7:04c8f6b7a42a 185 break;
glanier9 7:04c8f6b7a42a 186 }
dtran76 6:c8f14de0e3f4 187 thread1.start(&play_audio);
dtran76 0:0747159bf07d 188 }
dtran76 0:0747159bf07d 189 }
dtran76 0:0747159bf07d 190
dtran76 0:0747159bf07d 191 ultrasonic sonar0(p15,p16,0.1,0.1,&start_line); //starting line
dtran76 0:0747159bf07d 192 ultrasonic sonar1(p17,p18,0.1,0.1,&checkpoint1); //checkpoint 1
dtran76 0:0747159bf07d 193 ultrasonic sonar2(p21,p22,0.1,0.1,&checkpoint2); //checkpoint 2
dtran76 0:0747159bf07d 194
glanier9 1:28e137ae5af7 195 int main()
dtran76 0:0747159bf07d 196 {
dtran76 5:99be83f824b8 197 //sonar initialization
dtran76 0:0747159bf07d 198 sonar0.startUpdates();
dtran76 0:0747159bf07d 199 sonar1.startUpdates();
dtran76 0:0747159bf07d 200 sonar2.startUpdates();
glanier9 1:28e137ae5af7 201
dtran76 5:99be83f824b8 202 //sonar calibration
dtran76 0:0747159bf07d 203 sonar0.checkDistance();
dtran76 0:0747159bf07d 204 sonar1.checkDistance();
dtran76 0:0747159bf07d 205 sonar2.checkDistance();
dtran76 0:0747159bf07d 206
dtran76 5:99be83f824b8 207 //wait for start char from Pi
dtran76 5:99be83f824b8 208 while (1) {
dtran76 5:99be83f824b8 209 if (pc.getc() == 'S') {
dtran76 5:99be83f824b8 210 break;
dtran76 5:99be83f824b8 211 }
dtran76 5:99be83f824b8 212 Thread::wait(50);
dtran76 5:99be83f824b8 213 }
dtran76 5:99be83f824b8 214
glanier9 7:04c8f6b7a42a 215 //starting countdown sequence
glanier9 3:293a771fc470 216 thread2.start(&start_race);
glanier9 3:293a771fc470 217
dtran76 5:99be83f824b8 218 //false start detect
glanier9 3:293a771fc470 219 while(!start_done) {
glanier9 3:293a771fc470 220 if (current_lap) {
dtran76 5:99be83f824b8 221 rgbCtrl1 = rgbCtrl2 = rgbCtrl3 = 0;
dtran76 6:c8f14de0e3f4 222 led0 = led1 = led2 = 0;
dtran76 5:99be83f824b8 223 rgbRed = 1;
dtran76 5:99be83f824b8 224 rgbGreen = 0;
dtran76 6:c8f14de0e3f4 225 bool other = true;
dtran76 6:c8f14de0e3f4 226 speaker.period(1/E5NOTE);
dtran76 5:99be83f824b8 227 while (1) {
dtran76 5:99be83f824b8 228 rgbCtrl1 = !rgbCtrl1;
dtran76 5:99be83f824b8 229 rgbCtrl2 = !rgbCtrl2;
dtran76 5:99be83f824b8 230 rgbCtrl3 = !rgbCtrl3;
dtran76 6:c8f14de0e3f4 231 led0 = !led0;
dtran76 6:c8f14de0e3f4 232 led1 = !led1;
dtran76 6:c8f14de0e3f4 233 led2 = !led2;
dtran76 6:c8f14de0e3f4 234 speaker = other ? 0.5 : 0.0;
dtran76 6:c8f14de0e3f4 235 other = !other;
dtran76 5:99be83f824b8 236 if (pc.getc() == 'R') {
dtran76 5:99be83f824b8 237 mbed_reset();
dtran76 5:99be83f824b8 238 }
dtran76 5:99be83f824b8 239 Thread::wait(50);
dtran76 5:99be83f824b8 240 }
glanier9 3:293a771fc470 241 }
glanier9 3:293a771fc470 242 Thread::wait(50);
glanier9 3:293a771fc470 243 }
glanier9 3:293a771fc470 244
glanier9 1:28e137ae5af7 245 while(1) {
dtran76 0:0747159bf07d 246 switch (track_state) {
dtran76 0:0747159bf07d 247 case start:
dtran76 0:0747159bf07d 248 sonar0.checkDistance();
dtran76 0:0747159bf07d 249 break;
dtran76 0:0747159bf07d 250 case past_start:
dtran76 0:0747159bf07d 251 sonar1.checkDistance();
dtran76 0:0747159bf07d 252 break;
dtran76 0:0747159bf07d 253 case past_cp1:
dtran76 0:0747159bf07d 254 sonar2.checkDistance();
dtran76 0:0747159bf07d 255 break;
dtran76 0:0747159bf07d 256 case past_cp2:
dtran76 0:0747159bf07d 257 sonar0.checkDistance();
dtran76 0:0747159bf07d 258 break;
dtran76 0:0747159bf07d 259 }
dtran76 0:0747159bf07d 260 if (current_lap > total_laps) {
dtran76 0:0747159bf07d 261 pc.putc('9');
dtran76 6:c8f14de0e3f4 262 //pc.printf("Race Over");
dtran76 0:0747159bf07d 263 while(1) {
dtran76 5:99be83f824b8 264 if (pc.getc() == 'R') {
dtran76 5:99be83f824b8 265 mbed_reset();
dtran76 5:99be83f824b8 266 }
glanier9 3:293a771fc470 267 Thread::wait(50);
dtran76 0:0747159bf07d 268 }
dtran76 0:0747159bf07d 269 }
glanier9 3:293a771fc470 270 Thread::wait(50);
dtran76 0:0747159bf07d 271 }
dtran76 0:0747159bf07d 272 }