Basic funcitonality
Dependencies: mbed mbed-rtos SevenSegmentSerial HC_SR04_Ultrasonic_Library
main.cpp
- Committer:
- glanier9
- Date:
- 2021-04-26
- Revision:
- 4:8588557fbd75
- Parent:
- 3:293a771fc470
File content as of revision 4:8588557fbd75:
//************************** // Mbed to Raspberry Pi //************************** // 0 - pass starting line // 1 - pass checkpoint 1 // 2 - pass checkpoint 2 // ... // 9 - end race /* Color Coding Finish Line: red + black - yellow mbed out (rbg ctrl) red rbgRed blue pwm (audio) white echo orange trigger Checkpoint 1-2 red + black - white echo orange trigger yellow led ctrl */ // Includes #include "mbed.h" #include "ultrasonic.h" #include "rtos.h" #include "SevenSegmentSerial.h" // Threads Thread thread1; Thread thread2; // PC Serial Serial pc(USBTX,USBRX); //LED Ctrls (1 per CP) DigitalOut led0(p5); DigitalOut led1(p6); DigitalOut led2(p7); // Finish Line RGB Ctrl DigitalOut rgbCtrl1(p8); DigitalOut rgbCtrl2(p9); DigitalOut rgbCtrl3(p10); // Finish Line RGB Colors DigitalOut rgbRed(p23); DigitalOut rgbGreen(p24); PwmOut speaker(p25); // Seven Segment Display SevenSegmentSerial ssd(UART_MODE, p28); // Globals int width[3]; //width of each checkpoint, mm int sensitivity[3]; //sensitivity, adjust with testing, mm int total_laps = 3; int current_lap = 0; int B4Note = 500; int E5Note = 659; int i = 500; bool early_start = 0; bool start_done = 0; int setup[3] = {1,1,1}; //state machine, tracks current position in track enum state_type {start,past_start,past_cp1,past_cp2}; state_type track_state = start; // Race start lights and sound void start_race() { // 3 ssd.setDigit(3,0); speaker.period(1.0/B4Note); speaker =0.5; rgbRed = 1; rgbCtrl1 = 1; Thread::wait(500); speaker = 0; Thread::wait(500); // 2 ssd.setDigit(2,1); ssd = 2; speaker =0.5; rgbCtrl2 = 1; Thread::wait(500); speaker = 0; Thread::wait(500); // 1 ssd.setDigit(1,2); speaker =0.5; rgbCtrl3 = 1; Thread::wait(500); speaker = 0; Thread::wait(500); // GO! ssd.write("GOOO"); rgbRed = 0; rgbGreen = 1; start_done = 1; speaker.period(1.0/E5Note); speaker =0.5; Thread::wait(1000); speaker = 0; rgbCtrl1 = 0; rgbCtrl2 = 0; rgbCtrl3 = 0; } // Plays bleep for crossing finish line void play_audio() { speaker.period(1.0/B4Note); // 500hz period speaker =0.5; //50% duty cycle - max volume Thread::wait(150); speaker=0.0; // turn off audio } //executed when crossing starting line void start_line(int distance) { if (setup[0]) { pc.printf("Setup\n"); pc.printf("%d",distance); width[0] = distance; setup[0] = !setup[0]; sensitivity[0] = 0.1f*width[0]; } if (width[0] - distance >= sensitivity[0]) { pc.printf("Past start line\n"); led0 = 1; led1 = 0; led2 = 0; current_lap++; pc.printf("%d\n",current_lap); track_state = past_start; pc.putc('0'); thread1.start(&play_audio); } } //executed when passing checkpoint 1 void checkpoint1(int distance) { if (setup[1]) { pc.printf("Setup\n"); pc.printf("%d",distance); width[1] = distance; setup[1] = !setup[1]; sensitivity[1] = 0.1f*width[1]; } pc.printf("Past Checkpoint 1\n"); if (width[1] - distance >= sensitivity[1]) { led1 = 1; track_state = past_cp1; pc.putc('1'); } } //executed when passing checkpoint 2 void checkpoint2(int distance) { if (setup[2]) { pc.printf("Setup\n"); pc.printf("%d",distance); width[2] = distance; setup[2] = !setup[2]; sensitivity[2] = 0.1f*width[2]; } pc.printf("Past Checkpoint 2\n"); if (width[2] - distance >= sensitivity[2]) { led2 = 1; track_state = past_cp2; pc.putc('2'); } } // Sonars (19-20 CANNOT be set for sonar, they don't allow for interrupts) ultrasonic sonar0(p15,p16,0.1,0.1,&start_line); //starting line ultrasonic sonar1(p17,p18,0.1,0.1,&checkpoint1); //checkpoint 1 ultrasonic sonar2(p21,p22,0.1,0.1,&checkpoint2); //checkpoint 2 int main() { // Reset ssd.clear(); // Settings ssd.setBrightness(100); // Start Sonars sonar0.startUpdates(); sonar1.startUpdates(); sonar2.startUpdates(); sonar0.checkDistance(); sonar1.checkDistance(); sonar2.checkDistance(); // Start Race Lights + Sound thread2.start(&start_race); while(!start_done) { if (current_lap) { // Flash everything red. Play bad sounds. } Thread::wait(50); } // Race Checkpoint Tracking while(1) { switch (track_state) { case start: sonar0.checkDistance(); break; case past_start: sonar1.checkDistance(); break; case past_cp1: sonar2.checkDistance(); break; case past_cp2: sonar0.checkDistance(); break; } if (current_lap > total_laps) { pc.putc('9'); speaker.period(1.0/E5Note); // 500hz period speaker =0.5; //50% duty cycle - max volume Thread::wait(1000); speaker=0.0; // turn off audio while(1) { pc.printf("Race Over"); Thread::wait(50); } } Thread::wait(50); } }