Basic funcitonality

Dependencies:   mbed mbed-rtos SevenSegmentSerial HC_SR04_Ultrasonic_Library

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?

UserRevisionLine numberNew 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 }