Basic funcitonality

Dependencies:   mbed mbed-rtos SevenSegmentSerial HC_SR04_Ultrasonic_Library

Committer:
glanier9
Date:
Mon Apr 19 20:28:11 2021 +0000
Revision:
3:293a771fc470
Parent:
2:8c29e1aaaff0
Child:
4:8588557fbd75
Child:
5:99be83f824b8
Made start sounds and lights. Ready to program the case that someone crosses the line early.

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
dtran76 0:0747159bf07d 10 #include "mbed.h"
dtran76 0:0747159bf07d 11 #include "ultrasonic.h"
glanier9 1:28e137ae5af7 12 #include "rtos.h"
dtran76 0:0747159bf07d 13
glanier9 1:28e137ae5af7 14 Thread thread1;
glanier9 3:293a771fc470 15 Thread thread2;
dtran76 0:0747159bf07d 16 Serial pc(USBTX,USBRX);
dtran76 0:0747159bf07d 17 DigitalOut led0(p5);
dtran76 0:0747159bf07d 18 DigitalOut led1(p6);
dtran76 0:0747159bf07d 19 DigitalOut led2(p7);
glanier9 1:28e137ae5af7 20 PwmOut speaker(p25);
glanier9 3:293a771fc470 21 DigitalOut rgbRed(p23);
glanier9 3:293a771fc470 22 DigitalOut rgbGreen(p24);
glanier9 3:293a771fc470 23 DigitalOut rgbCtrl1(p8);
glanier9 3:293a771fc470 24 DigitalOut rgbCtrl2(p9);
glanier9 3:293a771fc470 25 DigitalOut rgbCtrl3(p10);
dtran76 0:0747159bf07d 26
dtran76 0:0747159bf07d 27 int width[3]; //width of each checkpoint, mm
dtran76 0:0747159bf07d 28 int sensitivity = 5; //sensitivity, adjust with testing, mm
dtran76 0:0747159bf07d 29 int total_laps = 3;
dtran76 0:0747159bf07d 30 int current_lap = 0;
glanier9 3:293a771fc470 31 int B4Note = 500;
glanier9 3:293a771fc470 32 int E5Note = 659;
glanier9 1:28e137ae5af7 33 int i = 500;
glanier9 3:293a771fc470 34 bool early_start = 0;
glanier9 3:293a771fc470 35 bool start_done = 0;
dtran76 0:0747159bf07d 36
dtran76 0:0747159bf07d 37 int setup[3] = {1,1,1};
dtran76 0:0747159bf07d 38
dtran76 0:0747159bf07d 39 //state machine, tracks current position in track
dtran76 0:0747159bf07d 40 enum state_type {start,past_start,past_cp1,past_cp2};
dtran76 0:0747159bf07d 41 state_type track_state = start;
dtran76 0:0747159bf07d 42
glanier9 3:293a771fc470 43 // Race start lights and sound
glanier9 3:293a771fc470 44 void start_race()
glanier9 3:293a771fc470 45 {
glanier9 3:293a771fc470 46 // 3
glanier9 3:293a771fc470 47 rgbRed = 1;
glanier9 3:293a771fc470 48 speaker.period(1.0/B4Note);
glanier9 3:293a771fc470 49 speaker =0.5;
glanier9 3:293a771fc470 50 rgbCtrl1 = 1;
glanier9 3:293a771fc470 51 Thread::wait(500);
glanier9 3:293a771fc470 52 speaker = 0;
glanier9 3:293a771fc470 53 Thread::wait(500);
glanier9 3:293a771fc470 54 // 2
glanier9 3:293a771fc470 55 speaker =0.5;
glanier9 3:293a771fc470 56 rgbCtrl2 = 1;
glanier9 3:293a771fc470 57 Thread::wait(500);
glanier9 3:293a771fc470 58 speaker = 0;
glanier9 3:293a771fc470 59 Thread::wait(500);
glanier9 3:293a771fc470 60 // 1
glanier9 3:293a771fc470 61 speaker =0.5;
glanier9 3:293a771fc470 62 rgbCtrl3 = 1;
glanier9 3:293a771fc470 63 Thread::wait(500);
glanier9 3:293a771fc470 64 speaker = 0;
glanier9 3:293a771fc470 65 Thread::wait(500);
glanier9 3:293a771fc470 66 // GO!
glanier9 3:293a771fc470 67 rgbRed = 0;
glanier9 3:293a771fc470 68 rgbGreen = 1;
glanier9 3:293a771fc470 69 start_done = 1;
glanier9 3:293a771fc470 70 speaker.period(1.0/E5Note);
glanier9 3:293a771fc470 71 speaker =0.5;
glanier9 3:293a771fc470 72 Thread::wait(500);
glanier9 3:293a771fc470 73 speaker = 0;
glanier9 3:293a771fc470 74 rgbCtrl1 = 0;
glanier9 3:293a771fc470 75 rgbCtrl2 = 0;
glanier9 3:293a771fc470 76 rgbCtrl3 = 0;
glanier9 3:293a771fc470 77 }
glanier9 3:293a771fc470 78
glanier9 2:8c29e1aaaff0 79 // Plays bleep for crossing finish line
glanier9 1:28e137ae5af7 80 void play_audio()
glanier9 1:28e137ae5af7 81 {
glanier9 3:293a771fc470 82 speaker.period(1.0/B4Note); // 500hz period
glanier9 1:28e137ae5af7 83 speaker =0.5; //50% duty cycle - max volume
glanier9 2:8c29e1aaaff0 84 Thread::wait(150);
glanier9 1:28e137ae5af7 85 speaker=0.0; // turn off audio
glanier9 1:28e137ae5af7 86 }
glanier9 1:28e137ae5af7 87
dtran76 0:0747159bf07d 88 //executed when crossing starting line
dtran76 0:0747159bf07d 89 void start_line(int distance)
dtran76 0:0747159bf07d 90 {
dtran76 0:0747159bf07d 91 if (setup[0]) {
dtran76 0:0747159bf07d 92 pc.printf("Setup\n");
dtran76 0:0747159bf07d 93 pc.printf("%d",distance);
dtran76 0:0747159bf07d 94 width[0] = distance;
glanier9 1:28e137ae5af7 95 setup[0] = !setup[0];
dtran76 0:0747159bf07d 96 }
glanier9 1:28e137ae5af7 97
dtran76 0:0747159bf07d 98 if (width[0] - distance >= sensitivity) {
dtran76 0:0747159bf07d 99 pc.printf("Past start line\n");
dtran76 0:0747159bf07d 100 led0 = 1;
dtran76 0:0747159bf07d 101 led1 = 0;
dtran76 0:0747159bf07d 102 led2 = 0;
dtran76 0:0747159bf07d 103 current_lap++;
dtran76 0:0747159bf07d 104 pc.printf("%d\n",current_lap);
dtran76 0:0747159bf07d 105 track_state = past_start;
dtran76 0:0747159bf07d 106 pc.putc('0');
glanier9 1:28e137ae5af7 107 thread1.start(&play_audio);
dtran76 0:0747159bf07d 108 }
dtran76 0:0747159bf07d 109 }
dtran76 0:0747159bf07d 110
dtran76 0:0747159bf07d 111 //executed when passing checkpoint 1
dtran76 0:0747159bf07d 112 void checkpoint1(int distance)
dtran76 0:0747159bf07d 113 {
dtran76 0:0747159bf07d 114 if (setup[1]) {
dtran76 0:0747159bf07d 115 pc.printf("Setup\n");
dtran76 0:0747159bf07d 116 pc.printf("%d",distance);
dtran76 0:0747159bf07d 117 width[1] = distance;
glanier9 1:28e137ae5af7 118 setup[1] = !setup[1];
dtran76 0:0747159bf07d 119 }
glanier9 1:28e137ae5af7 120
dtran76 0:0747159bf07d 121 pc.printf("Past Checkpoint 1\n");
dtran76 0:0747159bf07d 122 if (width[1] - distance >= sensitivity) {
dtran76 0:0747159bf07d 123 led1 = 1;
dtran76 0:0747159bf07d 124 track_state = past_cp1;
dtran76 0:0747159bf07d 125 pc.putc('1');
dtran76 0:0747159bf07d 126 }
dtran76 0:0747159bf07d 127 }
dtran76 0:0747159bf07d 128
dtran76 0:0747159bf07d 129 //executed when passing checkpoint 2
dtran76 0:0747159bf07d 130 void checkpoint2(int distance)
dtran76 0:0747159bf07d 131 {
dtran76 0:0747159bf07d 132 if (setup[2]) {
dtran76 0:0747159bf07d 133 pc.printf("Setup\n");
dtran76 0:0747159bf07d 134 pc.printf("%d",distance);
dtran76 0:0747159bf07d 135 width[2] = distance;
glanier9 1:28e137ae5af7 136 setup[2] = !setup[2];
dtran76 0:0747159bf07d 137 }
glanier9 1:28e137ae5af7 138
dtran76 0:0747159bf07d 139 pc.printf("Past Checkpoint 2\n");
dtran76 0:0747159bf07d 140 if (width[2] - distance >= sensitivity) {
dtran76 0:0747159bf07d 141 led2 = 1;
dtran76 0:0747159bf07d 142 track_state = past_cp2;
dtran76 0:0747159bf07d 143 pc.putc('2');
dtran76 0:0747159bf07d 144 }
dtran76 0:0747159bf07d 145 }
dtran76 0:0747159bf07d 146
dtran76 0:0747159bf07d 147 ultrasonic sonar0(p15,p16,0.1,0.1,&start_line); //starting line
dtran76 0:0747159bf07d 148 ultrasonic sonar1(p17,p18,0.1,0.1,&checkpoint1); //checkpoint 1
dtran76 0:0747159bf07d 149 ultrasonic sonar2(p21,p22,0.1,0.1,&checkpoint2); //checkpoint 2
dtran76 0:0747159bf07d 150
glanier9 1:28e137ae5af7 151 int main()
dtran76 0:0747159bf07d 152 {
dtran76 0:0747159bf07d 153 sonar0.startUpdates();
dtran76 0:0747159bf07d 154 sonar1.startUpdates();
dtran76 0:0747159bf07d 155 sonar2.startUpdates();
glanier9 1:28e137ae5af7 156
dtran76 0:0747159bf07d 157 sonar0.checkDistance();
dtran76 0:0747159bf07d 158 sonar1.checkDistance();
dtran76 0:0747159bf07d 159 sonar2.checkDistance();
dtran76 0:0747159bf07d 160
glanier9 3:293a771fc470 161 thread2.start(&start_race);
glanier9 3:293a771fc470 162
glanier9 3:293a771fc470 163 while(!start_done) {
glanier9 3:293a771fc470 164 if (current_lap) {
glanier9 3:293a771fc470 165 // Flash everything red. Play bad sounds.
glanier9 3:293a771fc470 166 }
glanier9 3:293a771fc470 167 Thread::wait(50);
glanier9 3:293a771fc470 168 }
glanier9 3:293a771fc470 169
glanier9 1:28e137ae5af7 170 while(1) {
dtran76 0:0747159bf07d 171 switch (track_state) {
dtran76 0:0747159bf07d 172 case start:
dtran76 0:0747159bf07d 173 sonar0.checkDistance();
dtran76 0:0747159bf07d 174 break;
dtran76 0:0747159bf07d 175 case past_start:
dtran76 0:0747159bf07d 176 sonar1.checkDistance();
dtran76 0:0747159bf07d 177 break;
dtran76 0:0747159bf07d 178 case past_cp1:
dtran76 0:0747159bf07d 179 sonar2.checkDistance();
dtran76 0:0747159bf07d 180 break;
dtran76 0:0747159bf07d 181 case past_cp2:
dtran76 0:0747159bf07d 182 sonar0.checkDistance();
dtran76 0:0747159bf07d 183 break;
dtran76 0:0747159bf07d 184 }
dtran76 0:0747159bf07d 185 if (current_lap > total_laps) {
dtran76 0:0747159bf07d 186 pc.putc('9');
dtran76 0:0747159bf07d 187 while(1) {
dtran76 0:0747159bf07d 188 pc.printf("Race Over");
glanier9 3:293a771fc470 189 Thread::wait(50);
dtran76 0:0747159bf07d 190 }
dtran76 0:0747159bf07d 191 }
glanier9 3:293a771fc470 192 Thread::wait(50);
dtran76 0:0747159bf07d 193 }
dtran76 0:0747159bf07d 194 }