Basic funcitonality

Dependencies:   mbed mbed-rtos SevenSegmentSerial HC_SR04_Ultrasonic_Library

Committer:
glanier9
Date:
Mon Apr 19 18:06:59 2021 +0000
Revision:
1:28e137ae5af7
Parent:
0:0747159bf07d
Child:
2:8c29e1aaaff0
Needs rtos version

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;
dtran76 0:0747159bf07d 15 Serial pc(USBTX,USBRX);
dtran76 0:0747159bf07d 16 DigitalOut led0(p5);
dtran76 0:0747159bf07d 17 DigitalOut led1(p6);
dtran76 0:0747159bf07d 18 DigitalOut led2(p7);
glanier9 1:28e137ae5af7 19 //Ticker sound;
glanier9 1:28e137ae5af7 20 PwmOut speaker(p25);
dtran76 0:0747159bf07d 21
dtran76 0:0747159bf07d 22 int width[3]; //width of each checkpoint, mm
dtran76 0:0747159bf07d 23 int sensitivity = 5; //sensitivity, adjust with testing, mm
dtran76 0:0747159bf07d 24 int total_laps = 3;
dtran76 0:0747159bf07d 25 int current_lap = 0;
glanier9 1:28e137ae5af7 26 int frequency = 500;
glanier9 1:28e137ae5af7 27 int i = 500;
dtran76 0:0747159bf07d 28
dtran76 0:0747159bf07d 29 int setup[3] = {1,1,1};
dtran76 0:0747159bf07d 30
dtran76 0:0747159bf07d 31 //state machine, tracks current position in track
dtran76 0:0747159bf07d 32 enum state_type {start,past_start,past_cp1,past_cp2};
dtran76 0:0747159bf07d 33 state_type track_state = start;
dtran76 0:0747159bf07d 34
glanier9 1:28e137ae5af7 35 void play_audio()
glanier9 1:28e137ae5af7 36 {
glanier9 1:28e137ae5af7 37 speaker =0.5; //50% duty cycle - max volume
glanier9 1:28e137ae5af7 38 Thread::wait(3);
glanier9 1:28e137ae5af7 39 speaker=0.0; // turn off audio
glanier9 1:28e137ae5af7 40 }
glanier9 1:28e137ae5af7 41
dtran76 0:0747159bf07d 42 //executed when crossing starting line
dtran76 0:0747159bf07d 43 void start_line(int distance)
dtran76 0:0747159bf07d 44 {
dtran76 0:0747159bf07d 45 if (setup[0]) {
dtran76 0:0747159bf07d 46 pc.printf("Setup\n");
dtran76 0:0747159bf07d 47 pc.printf("%d",distance);
dtran76 0:0747159bf07d 48 width[0] = distance;
glanier9 1:28e137ae5af7 49 setup[0] = !setup[0];
dtran76 0:0747159bf07d 50 }
glanier9 1:28e137ae5af7 51
dtran76 0:0747159bf07d 52 if (width[0] - distance >= sensitivity) {
dtran76 0:0747159bf07d 53 pc.printf("Past start line\n");
dtran76 0:0747159bf07d 54 led0 = 1;
dtran76 0:0747159bf07d 55 led1 = 0;
dtran76 0:0747159bf07d 56 led2 = 0;
dtran76 0:0747159bf07d 57 current_lap++;
dtran76 0:0747159bf07d 58 pc.printf("%d\n",current_lap);
dtran76 0:0747159bf07d 59 track_state = past_start;
dtran76 0:0747159bf07d 60 pc.putc('0');
glanier9 1:28e137ae5af7 61 thread1.start(&play_audio);
dtran76 0:0747159bf07d 62 }
dtran76 0:0747159bf07d 63 }
dtran76 0:0747159bf07d 64
dtran76 0:0747159bf07d 65 //executed when passing checkpoint 1
dtran76 0:0747159bf07d 66 void checkpoint1(int distance)
dtran76 0:0747159bf07d 67 {
dtran76 0:0747159bf07d 68 if (setup[1]) {
dtran76 0:0747159bf07d 69 pc.printf("Setup\n");
dtran76 0:0747159bf07d 70 pc.printf("%d",distance);
dtran76 0:0747159bf07d 71 width[1] = distance;
glanier9 1:28e137ae5af7 72 setup[1] = !setup[1];
dtran76 0:0747159bf07d 73 }
glanier9 1:28e137ae5af7 74
dtran76 0:0747159bf07d 75 pc.printf("Past Checkpoint 1\n");
dtran76 0:0747159bf07d 76 if (width[1] - distance >= sensitivity) {
dtran76 0:0747159bf07d 77 led1 = 1;
dtran76 0:0747159bf07d 78 track_state = past_cp1;
dtran76 0:0747159bf07d 79 pc.putc('1');
dtran76 0:0747159bf07d 80 }
dtran76 0:0747159bf07d 81 }
dtran76 0:0747159bf07d 82
dtran76 0:0747159bf07d 83 //executed when passing checkpoint 2
dtran76 0:0747159bf07d 84 void checkpoint2(int distance)
dtran76 0:0747159bf07d 85 {
dtran76 0:0747159bf07d 86 if (setup[2]) {
dtran76 0:0747159bf07d 87 pc.printf("Setup\n");
dtran76 0:0747159bf07d 88 pc.printf("%d",distance);
dtran76 0:0747159bf07d 89 width[2] = distance;
glanier9 1:28e137ae5af7 90 setup[2] = !setup[2];
dtran76 0:0747159bf07d 91 }
glanier9 1:28e137ae5af7 92
dtran76 0:0747159bf07d 93 pc.printf("Past Checkpoint 2\n");
dtran76 0:0747159bf07d 94 if (width[2] - distance >= sensitivity) {
dtran76 0:0747159bf07d 95 led2 = 1;
dtran76 0:0747159bf07d 96 track_state = past_cp2;
dtran76 0:0747159bf07d 97 pc.putc('2');
dtran76 0:0747159bf07d 98 }
dtran76 0:0747159bf07d 99 }
dtran76 0:0747159bf07d 100
dtran76 0:0747159bf07d 101 ultrasonic sonar0(p15,p16,0.1,0.1,&start_line); //starting line
dtran76 0:0747159bf07d 102 ultrasonic sonar1(p17,p18,0.1,0.1,&checkpoint1); //checkpoint 1
dtran76 0:0747159bf07d 103 ultrasonic sonar2(p21,p22,0.1,0.1,&checkpoint2); //checkpoint 2
dtran76 0:0747159bf07d 104
glanier9 1:28e137ae5af7 105 int main()
dtran76 0:0747159bf07d 106 {
glanier9 1:28e137ae5af7 107 speaker.period(1.0/frequency); // 500hz period
dtran76 0:0747159bf07d 108 sonar0.startUpdates();
dtran76 0:0747159bf07d 109 sonar1.startUpdates();
dtran76 0:0747159bf07d 110 sonar2.startUpdates();
glanier9 1:28e137ae5af7 111
dtran76 0:0747159bf07d 112 sonar0.checkDistance();
dtran76 0:0747159bf07d 113 sonar1.checkDistance();
dtran76 0:0747159bf07d 114 sonar2.checkDistance();
dtran76 0:0747159bf07d 115
glanier9 1:28e137ae5af7 116 while(1) {
dtran76 0:0747159bf07d 117 switch (track_state) {
dtran76 0:0747159bf07d 118 case start:
dtran76 0:0747159bf07d 119 sonar0.checkDistance();
dtran76 0:0747159bf07d 120 break;
dtran76 0:0747159bf07d 121 case past_start:
dtran76 0:0747159bf07d 122 sonar1.checkDistance();
dtran76 0:0747159bf07d 123 break;
dtran76 0:0747159bf07d 124 case past_cp1:
dtran76 0:0747159bf07d 125 sonar2.checkDistance();
dtran76 0:0747159bf07d 126 break;
dtran76 0:0747159bf07d 127 case past_cp2:
dtran76 0:0747159bf07d 128 sonar0.checkDistance();
dtran76 0:0747159bf07d 129 break;
dtran76 0:0747159bf07d 130 }
dtran76 0:0747159bf07d 131 if (current_lap > total_laps) {
dtran76 0:0747159bf07d 132 pc.putc('9');
dtran76 0:0747159bf07d 133 while(1) {
dtran76 0:0747159bf07d 134 pc.printf("Race Over");
glanier9 1:28e137ae5af7 135 Thread::wait(0.05);
dtran76 0:0747159bf07d 136 }
dtran76 0:0747159bf07d 137 }
glanier9 1:28e137ae5af7 138 Thread::wait(0.05);
dtran76 0:0747159bf07d 139 }
dtran76 0:0747159bf07d 140 }