Basic funcitonality
Dependencies: mbed mbed-rtos SevenSegmentSerial HC_SR04_Ultrasonic_Library
main.cpp@10:a3796a403d28, 2021-04-30 (annotated)
- 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?
User | Revision | Line number | New 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 | } |