Basic funcitonality

Dependencies:   mbed mbed-rtos SevenSegmentSerial HC_SR04_Ultrasonic_Library

Committer:
dtran76
Date:
Tue Apr 27 17:12:52 2021 +0000
Revision:
6:c8f14de0e3f4
Parent:
5:99be83f824b8
Child:
7:04c8f6b7a42a
made all LEDs blink on false start, added beeps to every checkpoint crossing

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