Basic funcitonality

Dependencies:   mbed mbed-rtos SevenSegmentSerial HC_SR04_Ultrasonic_Library

Committer:
dtran76
Date:
Fri Apr 30 12:42:11 2021 +0000
Revision:
8:88cf71c84e04
Parent:
7:04c8f6b7a42a
Removed unused variable i; removed unused pin p5; changed switch/case statements to single putc; removed debug printf statements; added reset check for during race; minor: reduced GO! beep duration; changed false start beep pitch

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 8:88cf71c84e04 4 // 0 - start line, lap 1 ** S - start race *
dtran76 8:88cf71c84e04 5 // 1 - cp1, lap 1 ** R - reset *
dtran76 8:88cf71c84e04 6 // 2 - cp2, lap 2 ** *
dtran76 8:88cf71c84e04 7 // 3 - start line, lap 2 ** *
dtran76 5:99be83f824b8 8 // ... ** *
dtran76 5:99be83f824b8 9 // 9 - end race ** *
dtran76 5:99be83f824b8 10 //******************************************************
dtran76 0:0747159bf07d 11
dtran76 0:0747159bf07d 12 #include "mbed.h"
dtran76 0:0747159bf07d 13 #include "ultrasonic.h"
glanier9 1:28e137ae5af7 14 #include "rtos.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 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
glanier9 7:04c8f6b7a42a 33 float sensitivity[3] = {0.1,0.1,0.1};
dtran76 8:88cf71c84e04 34 int setup[3] = {1,1,1};
dtran76 8:88cf71c84e04 35
dtran76 0:0747159bf07d 36 int total_laps = 3;
dtran76 0:0747159bf07d 37 int current_lap = 0;
glanier9 3:293a771fc470 38 bool early_start = 0;
glanier9 3:293a771fc470 39 bool start_done = 0;
dtran76 0:0747159bf07d 40
dtran76 0:0747159bf07d 41 //state machine, tracks current position in track
dtran76 0:0747159bf07d 42 enum state_type {start,past_start,past_cp1,past_cp2};
dtran76 0:0747159bf07d 43 state_type track_state = start;
dtran76 0:0747159bf07d 44
dtran76 5:99be83f824b8 45 //Mbed reset
dtran76 5:99be83f824b8 46 extern "C" void mbed_reset();
dtran76 5:99be83f824b8 47
dtran76 5:99be83f824b8 48 //Starting countdown
glanier9 3:293a771fc470 49 void start_race()
glanier9 3:293a771fc470 50 {
glanier9 3:293a771fc470 51 // 3
glanier9 3:293a771fc470 52 rgbRed = 1;
dtran76 5:99be83f824b8 53 speaker.period(1.0/B4NOTE);
glanier9 3:293a771fc470 54 speaker =0.5;
glanier9 3:293a771fc470 55 rgbCtrl1 = 1;
glanier9 3:293a771fc470 56 Thread::wait(500);
glanier9 3:293a771fc470 57 speaker = 0;
glanier9 3:293a771fc470 58 Thread::wait(500);
glanier9 3:293a771fc470 59 // 2
glanier9 3:293a771fc470 60 speaker =0.5;
glanier9 3:293a771fc470 61 rgbCtrl2 = 1;
glanier9 3:293a771fc470 62 Thread::wait(500);
glanier9 3:293a771fc470 63 speaker = 0;
glanier9 3:293a771fc470 64 Thread::wait(500);
glanier9 3:293a771fc470 65 // 1
glanier9 3:293a771fc470 66 speaker =0.5;
glanier9 3:293a771fc470 67 rgbCtrl3 = 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 // GO!
glanier9 3:293a771fc470 72 rgbRed = 0;
glanier9 3:293a771fc470 73 rgbGreen = 1;
glanier9 3:293a771fc470 74 start_done = 1;
dtran76 5:99be83f824b8 75 speaker.period(1.0/E5NOTE);
glanier9 3:293a771fc470 76 speaker =0.5;
dtran76 8:88cf71c84e04 77 Thread::wait(1000);
glanier9 3:293a771fc470 78 speaker = 0;
glanier9 3:293a771fc470 79 rgbCtrl1 = 0;
glanier9 3:293a771fc470 80 rgbCtrl2 = 0;
glanier9 3:293a771fc470 81 rgbCtrl3 = 0;
glanier9 3:293a771fc470 82 }
glanier9 3:293a771fc470 83
dtran76 8:88cf71c84e04 84 //plays for crossing finish line and checkpoints
glanier9 1:28e137ae5af7 85 void play_audio()
glanier9 1:28e137ae5af7 86 {
dtran76 8:88cf71c84e04 87 speaker.period(1.0/B4NOTE); //500hz period
dtran76 8:88cf71c84e04 88 speaker =0.5; //50% duty cycle - max volume
glanier9 2:8c29e1aaaff0 89 Thread::wait(150);
dtran76 8:88cf71c84e04 90 speaker=0.0; //turn off audio
glanier9 1:28e137ae5af7 91 }
glanier9 1:28e137ae5af7 92
dtran76 0:0747159bf07d 93 //executed when crossing starting line
dtran76 0:0747159bf07d 94 void start_line(int distance)
dtran76 0:0747159bf07d 95 {
dtran76 8:88cf71c84e04 96 //calibration
dtran76 0:0747159bf07d 97 if (setup[0]) {
dtran76 0:0747159bf07d 98 width[0] = distance;
dtran76 5:99be83f824b8 99 threshold[0] = distance*sensitivity[0];
glanier9 1:28e137ae5af7 100 setup[0] = !setup[0];
dtran76 0:0747159bf07d 101 }
glanier9 1:28e137ae5af7 102
dtran76 5:99be83f824b8 103 if (width[0] - distance >= threshold[0]) {
dtran76 0:0747159bf07d 104 led1 = 0;
dtran76 0:0747159bf07d 105 led2 = 0;
dtran76 0:0747159bf07d 106 current_lap++;
dtran76 0:0747159bf07d 107 track_state = past_start;
dtran76 8:88cf71c84e04 108 pc.putc('0' + (current_lap*total_laps) - 3);
glanier9 1:28e137ae5af7 109 thread1.start(&play_audio);
dtran76 0:0747159bf07d 110 }
dtran76 0:0747159bf07d 111 }
dtran76 0:0747159bf07d 112
dtran76 0:0747159bf07d 113 //executed when passing checkpoint 1
dtran76 0:0747159bf07d 114 void checkpoint1(int distance)
dtran76 0:0747159bf07d 115 {
dtran76 0:0747159bf07d 116 if (setup[1]) {
dtran76 0:0747159bf07d 117 width[1] = distance;
dtran76 5:99be83f824b8 118 threshold[1] = distance*sensitivity[1];
glanier9 1:28e137ae5af7 119 setup[1] = !setup[1];
dtran76 0:0747159bf07d 120 }
glanier9 1:28e137ae5af7 121
dtran76 5:99be83f824b8 122 if (width[1] - distance >= threshold[1]) {
dtran76 0:0747159bf07d 123 led1 = 1;
dtran76 0:0747159bf07d 124 track_state = past_cp1;
dtran76 8:88cf71c84e04 125 pc.putc('0' + (current_lap*total_laps) - 2);
dtran76 6:c8f14de0e3f4 126 thread1.start(&play_audio);
dtran76 0:0747159bf07d 127 }
dtran76 0:0747159bf07d 128 }
dtran76 0:0747159bf07d 129
dtran76 0:0747159bf07d 130 //executed when passing checkpoint 2
dtran76 0:0747159bf07d 131 void checkpoint2(int distance)
dtran76 0:0747159bf07d 132 {
dtran76 0:0747159bf07d 133 if (setup[2]) {
dtran76 0:0747159bf07d 134 width[2] = distance;
dtran76 5:99be83f824b8 135 threshold[2] = distance*sensitivity[2];
dtran76 5:99be83f824b8 136 setup[2] = !setup[1];
dtran76 0:0747159bf07d 137 }
glanier9 1:28e137ae5af7 138
dtran76 5:99be83f824b8 139 if (width[2] - distance >= threshold[2]) {
dtran76 0:0747159bf07d 140 led2 = 1;
dtran76 0:0747159bf07d 141 track_state = past_cp2;
dtran76 8:88cf71c84e04 142 pc.putc('0' + (current_lap*total_laps) - 1);
dtran76 6:c8f14de0e3f4 143 thread1.start(&play_audio);
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 5:99be83f824b8 153 //sonar initialization
dtran76 0:0747159bf07d 154 sonar0.startUpdates();
dtran76 0:0747159bf07d 155 sonar1.startUpdates();
dtran76 0:0747159bf07d 156 sonar2.startUpdates();
glanier9 1:28e137ae5af7 157
dtran76 5:99be83f824b8 158 //sonar calibration
dtran76 0:0747159bf07d 159 sonar0.checkDistance();
dtran76 0:0747159bf07d 160 sonar1.checkDistance();
dtran76 0:0747159bf07d 161 sonar2.checkDistance();
dtran76 0:0747159bf07d 162
dtran76 8:88cf71c84e04 163 //wait for start char from PC
dtran76 5:99be83f824b8 164 while (1) {
dtran76 5:99be83f824b8 165 if (pc.getc() == 'S') {
dtran76 5:99be83f824b8 166 break;
dtran76 5:99be83f824b8 167 }
dtran76 5:99be83f824b8 168 Thread::wait(50);
dtran76 5:99be83f824b8 169 }
dtran76 5:99be83f824b8 170
glanier9 7:04c8f6b7a42a 171 //starting countdown sequence
glanier9 3:293a771fc470 172 thread2.start(&start_race);
glanier9 3:293a771fc470 173
dtran76 5:99be83f824b8 174 //false start detect
glanier9 3:293a771fc470 175 while(!start_done) {
glanier9 3:293a771fc470 176 if (current_lap) {
dtran76 5:99be83f824b8 177 rgbCtrl1 = rgbCtrl2 = rgbCtrl3 = 0;
dtran76 8:88cf71c84e04 178 led1 = led2 = 0;
dtran76 5:99be83f824b8 179 rgbRed = 1;
dtran76 5:99be83f824b8 180 rgbGreen = 0;
dtran76 8:88cf71c84e04 181 speaker.period(1/B4NOTE);
dtran76 8:88cf71c84e04 182 bool other = true; //true every other interation, used to turn speaker on/off
dtran76 5:99be83f824b8 183 while (1) {
dtran76 5:99be83f824b8 184 rgbCtrl1 = !rgbCtrl1;
dtran76 5:99be83f824b8 185 rgbCtrl2 = !rgbCtrl2;
dtran76 5:99be83f824b8 186 rgbCtrl3 = !rgbCtrl3;
dtran76 6:c8f14de0e3f4 187 led1 = !led1;
dtran76 6:c8f14de0e3f4 188 led2 = !led2;
dtran76 6:c8f14de0e3f4 189 speaker = other ? 0.5 : 0.0;
dtran76 6:c8f14de0e3f4 190 other = !other;
dtran76 8:88cf71c84e04 191 //check for reset char
dtran76 5:99be83f824b8 192 if (pc.getc() == 'R') {
dtran76 5:99be83f824b8 193 mbed_reset();
dtran76 5:99be83f824b8 194 }
dtran76 8:88cf71c84e04 195 Thread::wait(200);
dtran76 5:99be83f824b8 196 }
glanier9 3:293a771fc470 197 }
glanier9 3:293a771fc470 198 Thread::wait(50);
glanier9 3:293a771fc470 199 }
glanier9 3:293a771fc470 200
glanier9 1:28e137ae5af7 201 while(1) {
dtran76 0:0747159bf07d 202 switch (track_state) {
dtran76 0:0747159bf07d 203 case start:
dtran76 0:0747159bf07d 204 sonar0.checkDistance();
dtran76 0:0747159bf07d 205 break;
dtran76 0:0747159bf07d 206 case past_start:
dtran76 0:0747159bf07d 207 sonar1.checkDistance();
dtran76 0:0747159bf07d 208 break;
dtran76 0:0747159bf07d 209 case past_cp1:
dtran76 0:0747159bf07d 210 sonar2.checkDistance();
dtran76 0:0747159bf07d 211 break;
dtran76 0:0747159bf07d 212 case past_cp2:
dtran76 0:0747159bf07d 213 sonar0.checkDistance();
dtran76 0:0747159bf07d 214 break;
dtran76 0:0747159bf07d 215 }
dtran76 0:0747159bf07d 216 if (current_lap > total_laps) {
dtran76 0:0747159bf07d 217 pc.putc('9');
dtran76 8:88cf71c84e04 218 //wait for reset char
dtran76 0:0747159bf07d 219 while(1) {
dtran76 5:99be83f824b8 220 if (pc.getc() == 'R') {
dtran76 5:99be83f824b8 221 mbed_reset();
dtran76 5:99be83f824b8 222 }
glanier9 3:293a771fc470 223 Thread::wait(50);
dtran76 0:0747159bf07d 224 }
dtran76 0:0747159bf07d 225 }
dtran76 8:88cf71c84e04 226 //check for reset char
dtran76 8:88cf71c84e04 227 if (pc.getc() == 'R') {
dtran76 8:88cf71c84e04 228 mbed_reset();
dtran76 8:88cf71c84e04 229 }
glanier9 3:293a771fc470 230 Thread::wait(50);
dtran76 0:0747159bf07d 231 }
dtran76 0:0747159bf07d 232 }