Basic funcitonality
Dependencies: mbed mbed-rtos SevenSegmentSerial HC_SR04_Ultrasonic_Library
main.cpp@4:8588557fbd75, 2021-04-26 (annotated)
- Committer:
- glanier9
- Date:
- Mon Apr 26 20:52:21 2021 +0000
- Revision:
- 4:8588557fbd75
- Parent:
- 3:293a771fc470
Added draft color coding comments. Some added prototype code for sounds and error checking.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dtran76 | 0:0747159bf07d | 1 | //************************** |
dtran76 | 0:0747159bf07d | 2 | // Mbed to Raspberry Pi |
dtran76 | 0:0747159bf07d | 3 | //************************** |
dtran76 | 0:0747159bf07d | 4 | // 0 - pass starting line |
dtran76 | 0:0747159bf07d | 5 | // 1 - pass checkpoint 1 |
dtran76 | 0:0747159bf07d | 6 | // 2 - pass checkpoint 2 |
dtran76 | 0:0747159bf07d | 7 | // ... |
dtran76 | 0:0747159bf07d | 8 | // 9 - end race |
dtran76 | 0:0747159bf07d | 9 | |
glanier9 | 4:8588557fbd75 | 10 | /* |
glanier9 | 4:8588557fbd75 | 11 | |
glanier9 | 4:8588557fbd75 | 12 | Color Coding |
glanier9 | 4:8588557fbd75 | 13 | |
glanier9 | 4:8588557fbd75 | 14 | Finish Line: |
glanier9 | 4:8588557fbd75 | 15 | red + |
glanier9 | 4:8588557fbd75 | 16 | black - |
glanier9 | 4:8588557fbd75 | 17 | yellow mbed out (rbg ctrl) |
glanier9 | 4:8588557fbd75 | 18 | red rbgRed |
glanier9 | 4:8588557fbd75 | 19 | blue pwm (audio) |
glanier9 | 4:8588557fbd75 | 20 | white echo |
glanier9 | 4:8588557fbd75 | 21 | orange trigger |
glanier9 | 4:8588557fbd75 | 22 | |
glanier9 | 4:8588557fbd75 | 23 | Checkpoint 1-2 |
glanier9 | 4:8588557fbd75 | 24 | red + |
glanier9 | 4:8588557fbd75 | 25 | black - |
glanier9 | 4:8588557fbd75 | 26 | white echo |
glanier9 | 4:8588557fbd75 | 27 | orange trigger |
glanier9 | 4:8588557fbd75 | 28 | yellow led ctrl |
glanier9 | 4:8588557fbd75 | 29 | |
glanier9 | 4:8588557fbd75 | 30 | */ |
glanier9 | 4:8588557fbd75 | 31 | |
glanier9 | 4:8588557fbd75 | 32 | // Includes |
dtran76 | 0:0747159bf07d | 33 | #include "mbed.h" |
dtran76 | 0:0747159bf07d | 34 | #include "ultrasonic.h" |
glanier9 | 1:28e137ae5af7 | 35 | #include "rtos.h" |
glanier9 | 4:8588557fbd75 | 36 | #include "SevenSegmentSerial.h" |
dtran76 | 0:0747159bf07d | 37 | |
glanier9 | 4:8588557fbd75 | 38 | // Threads |
glanier9 | 1:28e137ae5af7 | 39 | Thread thread1; |
glanier9 | 3:293a771fc470 | 40 | Thread thread2; |
glanier9 | 4:8588557fbd75 | 41 | // PC Serial |
dtran76 | 0:0747159bf07d | 42 | Serial pc(USBTX,USBRX); |
glanier9 | 4:8588557fbd75 | 43 | //LED Ctrls (1 per CP) |
dtran76 | 0:0747159bf07d | 44 | DigitalOut led0(p5); |
dtran76 | 0:0747159bf07d | 45 | DigitalOut led1(p6); |
dtran76 | 0:0747159bf07d | 46 | DigitalOut led2(p7); |
glanier9 | 4:8588557fbd75 | 47 | // Finish Line RGB Ctrl |
glanier9 | 3:293a771fc470 | 48 | DigitalOut rgbCtrl1(p8); |
glanier9 | 3:293a771fc470 | 49 | DigitalOut rgbCtrl2(p9); |
glanier9 | 3:293a771fc470 | 50 | DigitalOut rgbCtrl3(p10); |
glanier9 | 4:8588557fbd75 | 51 | // Finish Line RGB Colors |
glanier9 | 4:8588557fbd75 | 52 | DigitalOut rgbRed(p23); |
glanier9 | 4:8588557fbd75 | 53 | DigitalOut rgbGreen(p24); |
glanier9 | 4:8588557fbd75 | 54 | PwmOut speaker(p25); |
glanier9 | 4:8588557fbd75 | 55 | // Seven Segment Display |
glanier9 | 4:8588557fbd75 | 56 | SevenSegmentSerial ssd(UART_MODE, p28); |
dtran76 | 0:0747159bf07d | 57 | |
glanier9 | 4:8588557fbd75 | 58 | // Globals |
dtran76 | 0:0747159bf07d | 59 | int width[3]; //width of each checkpoint, mm |
glanier9 | 4:8588557fbd75 | 60 | int sensitivity[3]; //sensitivity, adjust with testing, mm |
dtran76 | 0:0747159bf07d | 61 | int total_laps = 3; |
dtran76 | 0:0747159bf07d | 62 | int current_lap = 0; |
glanier9 | 3:293a771fc470 | 63 | int B4Note = 500; |
glanier9 | 3:293a771fc470 | 64 | int E5Note = 659; |
glanier9 | 1:28e137ae5af7 | 65 | int i = 500; |
glanier9 | 3:293a771fc470 | 66 | bool early_start = 0; |
glanier9 | 3:293a771fc470 | 67 | bool start_done = 0; |
dtran76 | 0:0747159bf07d | 68 | int setup[3] = {1,1,1}; |
dtran76 | 0:0747159bf07d | 69 | |
dtran76 | 0:0747159bf07d | 70 | //state machine, tracks current position in track |
dtran76 | 0:0747159bf07d | 71 | enum state_type {start,past_start,past_cp1,past_cp2}; |
dtran76 | 0:0747159bf07d | 72 | state_type track_state = start; |
dtran76 | 0:0747159bf07d | 73 | |
glanier9 | 3:293a771fc470 | 74 | // Race start lights and sound |
glanier9 | 3:293a771fc470 | 75 | void start_race() |
glanier9 | 3:293a771fc470 | 76 | { |
glanier9 | 3:293a771fc470 | 77 | // 3 |
glanier9 | 4:8588557fbd75 | 78 | ssd.setDigit(3,0); |
glanier9 | 3:293a771fc470 | 79 | speaker.period(1.0/B4Note); |
glanier9 | 3:293a771fc470 | 80 | speaker =0.5; |
glanier9 | 4:8588557fbd75 | 81 | rgbRed = 1; |
glanier9 | 3:293a771fc470 | 82 | rgbCtrl1 = 1; |
glanier9 | 3:293a771fc470 | 83 | Thread::wait(500); |
glanier9 | 3:293a771fc470 | 84 | speaker = 0; |
glanier9 | 3:293a771fc470 | 85 | Thread::wait(500); |
glanier9 | 4:8588557fbd75 | 86 | |
glanier9 | 3:293a771fc470 | 87 | // 2 |
glanier9 | 4:8588557fbd75 | 88 | ssd.setDigit(2,1); |
glanier9 | 4:8588557fbd75 | 89 | ssd = 2; |
glanier9 | 3:293a771fc470 | 90 | speaker =0.5; |
glanier9 | 3:293a771fc470 | 91 | rgbCtrl2 = 1; |
glanier9 | 3:293a771fc470 | 92 | Thread::wait(500); |
glanier9 | 3:293a771fc470 | 93 | speaker = 0; |
glanier9 | 3:293a771fc470 | 94 | Thread::wait(500); |
glanier9 | 4:8588557fbd75 | 95 | |
glanier9 | 3:293a771fc470 | 96 | // 1 |
glanier9 | 4:8588557fbd75 | 97 | ssd.setDigit(1,2); |
glanier9 | 3:293a771fc470 | 98 | speaker =0.5; |
glanier9 | 3:293a771fc470 | 99 | rgbCtrl3 = 1; |
glanier9 | 3:293a771fc470 | 100 | Thread::wait(500); |
glanier9 | 3:293a771fc470 | 101 | speaker = 0; |
glanier9 | 3:293a771fc470 | 102 | Thread::wait(500); |
glanier9 | 4:8588557fbd75 | 103 | |
glanier9 | 3:293a771fc470 | 104 | // GO! |
glanier9 | 4:8588557fbd75 | 105 | ssd.write("GOOO"); |
glanier9 | 3:293a771fc470 | 106 | rgbRed = 0; |
glanier9 | 3:293a771fc470 | 107 | rgbGreen = 1; |
glanier9 | 3:293a771fc470 | 108 | start_done = 1; |
glanier9 | 3:293a771fc470 | 109 | speaker.period(1.0/E5Note); |
glanier9 | 3:293a771fc470 | 110 | speaker =0.5; |
glanier9 | 4:8588557fbd75 | 111 | Thread::wait(1000); |
glanier9 | 3:293a771fc470 | 112 | speaker = 0; |
glanier9 | 3:293a771fc470 | 113 | rgbCtrl1 = 0; |
glanier9 | 3:293a771fc470 | 114 | rgbCtrl2 = 0; |
glanier9 | 3:293a771fc470 | 115 | rgbCtrl3 = 0; |
glanier9 | 3:293a771fc470 | 116 | } |
glanier9 | 3:293a771fc470 | 117 | |
glanier9 | 2:8c29e1aaaff0 | 118 | // Plays bleep for crossing finish line |
glanier9 | 1:28e137ae5af7 | 119 | void play_audio() |
glanier9 | 1:28e137ae5af7 | 120 | { |
glanier9 | 3:293a771fc470 | 121 | speaker.period(1.0/B4Note); // 500hz period |
glanier9 | 1:28e137ae5af7 | 122 | speaker =0.5; //50% duty cycle - max volume |
glanier9 | 2:8c29e1aaaff0 | 123 | Thread::wait(150); |
glanier9 | 1:28e137ae5af7 | 124 | speaker=0.0; // turn off audio |
glanier9 | 1:28e137ae5af7 | 125 | } |
glanier9 | 1:28e137ae5af7 | 126 | |
dtran76 | 0:0747159bf07d | 127 | //executed when crossing starting line |
dtran76 | 0:0747159bf07d | 128 | void start_line(int distance) |
dtran76 | 0:0747159bf07d | 129 | { |
dtran76 | 0:0747159bf07d | 130 | if (setup[0]) { |
dtran76 | 0:0747159bf07d | 131 | pc.printf("Setup\n"); |
dtran76 | 0:0747159bf07d | 132 | pc.printf("%d",distance); |
dtran76 | 0:0747159bf07d | 133 | width[0] = distance; |
glanier9 | 1:28e137ae5af7 | 134 | setup[0] = !setup[0]; |
glanier9 | 4:8588557fbd75 | 135 | sensitivity[0] = 0.1f*width[0]; |
dtran76 | 0:0747159bf07d | 136 | } |
glanier9 | 1:28e137ae5af7 | 137 | |
glanier9 | 4:8588557fbd75 | 138 | if (width[0] - distance >= sensitivity[0]) { |
dtran76 | 0:0747159bf07d | 139 | pc.printf("Past start line\n"); |
dtran76 | 0:0747159bf07d | 140 | led0 = 1; |
dtran76 | 0:0747159bf07d | 141 | led1 = 0; |
dtran76 | 0:0747159bf07d | 142 | led2 = 0; |
dtran76 | 0:0747159bf07d | 143 | current_lap++; |
dtran76 | 0:0747159bf07d | 144 | pc.printf("%d\n",current_lap); |
dtran76 | 0:0747159bf07d | 145 | track_state = past_start; |
dtran76 | 0:0747159bf07d | 146 | pc.putc('0'); |
glanier9 | 1:28e137ae5af7 | 147 | thread1.start(&play_audio); |
dtran76 | 0:0747159bf07d | 148 | } |
glanier9 | 4:8588557fbd75 | 149 | |
dtran76 | 0:0747159bf07d | 150 | } |
dtran76 | 0:0747159bf07d | 151 | |
dtran76 | 0:0747159bf07d | 152 | //executed when passing checkpoint 1 |
dtran76 | 0:0747159bf07d | 153 | void checkpoint1(int distance) |
dtran76 | 0:0747159bf07d | 154 | { |
dtran76 | 0:0747159bf07d | 155 | if (setup[1]) { |
dtran76 | 0:0747159bf07d | 156 | pc.printf("Setup\n"); |
dtran76 | 0:0747159bf07d | 157 | pc.printf("%d",distance); |
dtran76 | 0:0747159bf07d | 158 | width[1] = distance; |
glanier9 | 1:28e137ae5af7 | 159 | setup[1] = !setup[1]; |
glanier9 | 4:8588557fbd75 | 160 | sensitivity[1] = 0.1f*width[1]; |
dtran76 | 0:0747159bf07d | 161 | } |
glanier9 | 1:28e137ae5af7 | 162 | |
dtran76 | 0:0747159bf07d | 163 | pc.printf("Past Checkpoint 1\n"); |
glanier9 | 4:8588557fbd75 | 164 | if (width[1] - distance >= sensitivity[1]) { |
dtran76 | 0:0747159bf07d | 165 | led1 = 1; |
dtran76 | 0:0747159bf07d | 166 | track_state = past_cp1; |
dtran76 | 0:0747159bf07d | 167 | pc.putc('1'); |
dtran76 | 0:0747159bf07d | 168 | } |
dtran76 | 0:0747159bf07d | 169 | } |
dtran76 | 0:0747159bf07d | 170 | |
dtran76 | 0:0747159bf07d | 171 | //executed when passing checkpoint 2 |
dtran76 | 0:0747159bf07d | 172 | void checkpoint2(int distance) |
dtran76 | 0:0747159bf07d | 173 | { |
dtran76 | 0:0747159bf07d | 174 | if (setup[2]) { |
dtran76 | 0:0747159bf07d | 175 | pc.printf("Setup\n"); |
dtran76 | 0:0747159bf07d | 176 | pc.printf("%d",distance); |
dtran76 | 0:0747159bf07d | 177 | width[2] = distance; |
glanier9 | 1:28e137ae5af7 | 178 | setup[2] = !setup[2]; |
glanier9 | 4:8588557fbd75 | 179 | sensitivity[2] = 0.1f*width[2]; |
dtran76 | 0:0747159bf07d | 180 | } |
glanier9 | 1:28e137ae5af7 | 181 | |
dtran76 | 0:0747159bf07d | 182 | pc.printf("Past Checkpoint 2\n"); |
glanier9 | 4:8588557fbd75 | 183 | if (width[2] - distance >= sensitivity[2]) { |
dtran76 | 0:0747159bf07d | 184 | led2 = 1; |
dtran76 | 0:0747159bf07d | 185 | track_state = past_cp2; |
dtran76 | 0:0747159bf07d | 186 | pc.putc('2'); |
dtran76 | 0:0747159bf07d | 187 | } |
dtran76 | 0:0747159bf07d | 188 | } |
glanier9 | 4:8588557fbd75 | 189 | // Sonars (19-20 CANNOT be set for sonar, they don't allow for interrupts) |
dtran76 | 0:0747159bf07d | 190 | ultrasonic sonar0(p15,p16,0.1,0.1,&start_line); //starting line |
dtran76 | 0:0747159bf07d | 191 | ultrasonic sonar1(p17,p18,0.1,0.1,&checkpoint1); //checkpoint 1 |
dtran76 | 0:0747159bf07d | 192 | ultrasonic sonar2(p21,p22,0.1,0.1,&checkpoint2); //checkpoint 2 |
dtran76 | 0:0747159bf07d | 193 | |
glanier9 | 1:28e137ae5af7 | 194 | int main() |
dtran76 | 0:0747159bf07d | 195 | { |
glanier9 | 4:8588557fbd75 | 196 | // Reset |
glanier9 | 4:8588557fbd75 | 197 | ssd.clear(); |
glanier9 | 4:8588557fbd75 | 198 | |
glanier9 | 4:8588557fbd75 | 199 | // Settings |
glanier9 | 4:8588557fbd75 | 200 | ssd.setBrightness(100); |
glanier9 | 4:8588557fbd75 | 201 | |
glanier9 | 4:8588557fbd75 | 202 | // Start Sonars |
dtran76 | 0:0747159bf07d | 203 | sonar0.startUpdates(); |
dtran76 | 0:0747159bf07d | 204 | sonar1.startUpdates(); |
dtran76 | 0:0747159bf07d | 205 | sonar2.startUpdates(); |
dtran76 | 0:0747159bf07d | 206 | sonar0.checkDistance(); |
dtran76 | 0:0747159bf07d | 207 | sonar1.checkDistance(); |
dtran76 | 0:0747159bf07d | 208 | sonar2.checkDistance(); |
dtran76 | 0:0747159bf07d | 209 | |
glanier9 | 4:8588557fbd75 | 210 | // Start Race Lights + Sound |
glanier9 | 3:293a771fc470 | 211 | thread2.start(&start_race); |
glanier9 | 3:293a771fc470 | 212 | while(!start_done) { |
glanier9 | 3:293a771fc470 | 213 | if (current_lap) { |
glanier9 | 3:293a771fc470 | 214 | // Flash everything red. Play bad sounds. |
glanier9 | 3:293a771fc470 | 215 | } |
glanier9 | 3:293a771fc470 | 216 | Thread::wait(50); |
glanier9 | 3:293a771fc470 | 217 | } |
glanier9 | 3:293a771fc470 | 218 | |
glanier9 | 4:8588557fbd75 | 219 | // Race Checkpoint Tracking |
glanier9 | 1:28e137ae5af7 | 220 | while(1) { |
dtran76 | 0:0747159bf07d | 221 | switch (track_state) { |
dtran76 | 0:0747159bf07d | 222 | case start: |
dtran76 | 0:0747159bf07d | 223 | sonar0.checkDistance(); |
dtran76 | 0:0747159bf07d | 224 | break; |
dtran76 | 0:0747159bf07d | 225 | case past_start: |
dtran76 | 0:0747159bf07d | 226 | sonar1.checkDistance(); |
dtran76 | 0:0747159bf07d | 227 | break; |
dtran76 | 0:0747159bf07d | 228 | case past_cp1: |
dtran76 | 0:0747159bf07d | 229 | sonar2.checkDistance(); |
dtran76 | 0:0747159bf07d | 230 | break; |
dtran76 | 0:0747159bf07d | 231 | case past_cp2: |
dtran76 | 0:0747159bf07d | 232 | sonar0.checkDistance(); |
dtran76 | 0:0747159bf07d | 233 | break; |
dtran76 | 0:0747159bf07d | 234 | } |
dtran76 | 0:0747159bf07d | 235 | if (current_lap > total_laps) { |
dtran76 | 0:0747159bf07d | 236 | pc.putc('9'); |
glanier9 | 4:8588557fbd75 | 237 | speaker.period(1.0/E5Note); // 500hz period |
glanier9 | 4:8588557fbd75 | 238 | speaker =0.5; //50% duty cycle - max volume |
glanier9 | 4:8588557fbd75 | 239 | Thread::wait(1000); |
glanier9 | 4:8588557fbd75 | 240 | speaker=0.0; // turn off audio |
dtran76 | 0:0747159bf07d | 241 | while(1) { |
dtran76 | 0:0747159bf07d | 242 | pc.printf("Race Over"); |
glanier9 | 3:293a771fc470 | 243 | Thread::wait(50); |
dtran76 | 0:0747159bf07d | 244 | } |
dtran76 | 0:0747159bf07d | 245 | } |
glanier9 | 3:293a771fc470 | 246 | Thread::wait(50); |
dtran76 | 0:0747159bf07d | 247 | } |
dtran76 | 0:0747159bf07d | 248 | } |