groep 16 / Mbed 2 deprecated Project_BioRobotics_12

Dependencies:   mbed QEI HIDScope BiQuad4th_order biquadFilter MODSERIAL FastPWM

Committer:
arnouddomhof
Date:
Mon Oct 22 14:45:37 2018 +0000
Revision:
3:dca57056e5cb
Parent:
2:b6b962d7db36
Child:
4:a0c1c021026b
State machine af en toegevoegd

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Mirjam 0:46dbc9b620d8 1 #include "mbed.h"
arnouddomhof 3:dca57056e5cb 2 #include "MODSERIAL.h"
Mirjam 0:46dbc9b620d8 3
arnouddomhof 3:dca57056e5cb 4 DigitalOut led_red(LED_RED);
arnouddomhof 3:dca57056e5cb 5 DigitalOut led_green(LED_GREEN);
arnouddomhof 3:dca57056e5cb 6 DigitalOut led_blue(LED_BLUE);
arnouddomhof 3:dca57056e5cb 7 DigitalIn button(SW2);
arnouddomhof 3:dca57056e5cb 8 InterruptIn Fail_button(SW3);
arnouddomhof 3:dca57056e5cb 9 MODSERIAL pc(USBTX, USBRX);
arnouddomhof 3:dca57056e5cb 10
arnouddomhof 3:dca57056e5cb 11 enum states {WAITING,MOTOR_ANGLE_CLBRT,EMG_CLBRT,HOMING,WAITING4SIGNAL,MOVE_W_EMG,MOVE_W_DEMO,FAILURE_MODE,SHUTDOWN};
arnouddomhof 3:dca57056e5cb 12 states currentState = WAITING;
arnouddomhof 3:dca57056e5cb 13 char c;
arnouddomhof 3:dca57056e5cb 14
arnouddomhof 3:dca57056e5cb 15 void Failing() {
arnouddomhof 3:dca57056e5cb 16 currentState = FAILURE_MODE;
arnouddomhof 3:dca57056e5cb 17 wait(1.0f);
arnouddomhof 3:dca57056e5cb 18 }
Mirjam 0:46dbc9b620d8 19
Mirjam 0:46dbc9b620d8 20 int main()
Mirjam 0:46dbc9b620d8 21 {
arnouddomhof 3:dca57056e5cb 22 led_red = 1;
arnouddomhof 3:dca57056e5cb 23 led_green = 1;
arnouddomhof 3:dca57056e5cb 24 led_blue = 1;
arnouddomhof 3:dca57056e5cb 25 pc.baud(115200);
arnouddomhof 3:dca57056e5cb 26 Fail_button.fall(&Failing);
arnouddomhof 3:dca57056e5cb 27
arnouddomhof 3:dca57056e5cb 28 pc.printf("\r\n______________ STATE MACHINE ______________ \r\n\r\n");
arnouddomhof 3:dca57056e5cb 29
Mirjam 0:46dbc9b620d8 30 while (true) {
arnouddomhof 3:dca57056e5cb 31 switch (currentState)
arnouddomhof 3:dca57056e5cb 32 {
arnouddomhof 3:dca57056e5cb 33 case WAITING:
arnouddomhof 3:dca57056e5cb 34 pc.printf("WAITING... \r\n");
arnouddomhof 3:dca57056e5cb 35 led_red = 0; led_green = 0; led_blue = 0; // Colouring the led WHITE
arnouddomhof 3:dca57056e5cb 36 if (!button) {
arnouddomhof 3:dca57056e5cb 37 currentState = MOTOR_ANGLE_CLBRT;
arnouddomhof 3:dca57056e5cb 38 }
arnouddomhof 3:dca57056e5cb 39 wait(1.0f);
arnouddomhof 3:dca57056e5cb 40 break;
arnouddomhof 3:dca57056e5cb 41 case MOTOR_ANGLE_CLBRT:
arnouddomhof 3:dca57056e5cb 42 pc.printf("Motor angle calibration \r\n");
arnouddomhof 3:dca57056e5cb 43 led_red = 1; led_green = 0; led_blue = 0; // Colouring the led TURQUOISE
arnouddomhof 3:dca57056e5cb 44 wait(3.0f); // time_in_this_state > 3.0f
arnouddomhof 3:dca57056e5cb 45 // if (fabs(motor_velocity) < 0.01f) {
arnouddomhof 3:dca57056e5cb 46 currentState = EMG_CLBRT;
arnouddomhof 3:dca57056e5cb 47 break;
arnouddomhof 3:dca57056e5cb 48 case EMG_CLBRT:
arnouddomhof 3:dca57056e5cb 49 pc.printf("EMG calibration \r\n");
arnouddomhof 3:dca57056e5cb 50 led_red = 1; led_green = 1; led_blue = 0; // Colouring the led BLUE
arnouddomhof 3:dca57056e5cb 51 wait(5.0f); // time_in_this_state > 5.0f
arnouddomhof 3:dca57056e5cb 52 // if moving_average(procd_emg) < 0.1*max_procd_emg_ever
arnouddomhof 3:dca57056e5cb 53 currentState = HOMING;
arnouddomhof 3:dca57056e5cb 54 break;
arnouddomhof 3:dca57056e5cb 55 case HOMING:
arnouddomhof 3:dca57056e5cb 56 pc.printf("HOMING, moving to the home starting configuration. \r\n");
arnouddomhof 3:dca57056e5cb 57 led_red = 0; led_green = 1; led_red = 0; // Colouring the led PURPLE
arnouddomhof 3:dca57056e5cb 58 wait(5.0f); // time_in_this_state > 5.0f
arnouddomhof 3:dca57056e5cb 59 // if ((fabs(angle_error1) < 0.01f) && (fabs(angle_error2) < 0.01f)) {
arnouddomhof 3:dca57056e5cb 60 currentState = WAITING4SIGNAL;
arnouddomhof 3:dca57056e5cb 61 break;
arnouddomhof 3:dca57056e5cb 62 case WAITING4SIGNAL:
arnouddomhof 3:dca57056e5cb 63 led_red = 0; led_green = 0; led_blue = 0; // Colouring the led WHITE
arnouddomhof 3:dca57056e5cb 64 pc.printf("Press d to run the demo, Press e to move with EMG, Press c to re-calibrate or Press s to shut the robot down. \r\n");
arnouddomhof 3:dca57056e5cb 65 c = pc.getc();
arnouddomhof 3:dca57056e5cb 66 if (c == 'd') {
arnouddomhof 3:dca57056e5cb 67 currentState = MOVE_W_DEMO;
arnouddomhof 3:dca57056e5cb 68 }
arnouddomhof 3:dca57056e5cb 69 else if (c == 'e') {
arnouddomhof 3:dca57056e5cb 70 currentState = MOVE_W_EMG;
arnouddomhof 3:dca57056e5cb 71 }
arnouddomhof 3:dca57056e5cb 72 else if (c == 'c') {
arnouddomhof 3:dca57056e5cb 73 currentState = MOTOR_ANGLE_CLBRT;
arnouddomhof 3:dca57056e5cb 74 }
arnouddomhof 3:dca57056e5cb 75 else if (c == 's') {
arnouddomhof 3:dca57056e5cb 76 currentState = SHUTDOWN;
arnouddomhof 3:dca57056e5cb 77 }
arnouddomhof 3:dca57056e5cb 78 break;
arnouddomhof 3:dca57056e5cb 79 case MOVE_W_DEMO:
arnouddomhof 3:dca57056e5cb 80 led_red = 1; led_green = 1; led_blue = 0; // Colouring the led GREEN
arnouddomhof 3:dca57056e5cb 81 pc.printf("MOVE_W_DEMO, Running the demo \r\n");
arnouddomhof 3:dca57056e5cb 82 c = pc.getcNb();
arnouddomhof 3:dca57056e5cb 83 if (c == 'h') {
arnouddomhof 3:dca57056e5cb 84 currentState = HOMING;
arnouddomhof 3:dca57056e5cb 85 }
arnouddomhof 3:dca57056e5cb 86 Fail_button.fall(&Failing);
arnouddomhof 3:dca57056e5cb 87 wait(1.0f);
arnouddomhof 3:dca57056e5cb 88 break;
arnouddomhof 3:dca57056e5cb 89 case MOVE_W_EMG:
arnouddomhof 3:dca57056e5cb 90 led_red = 1; led_green = 0; led_blue = 1; // Colouring the led GREEN
arnouddomhof 3:dca57056e5cb 91 pc.printf("MOVE_W_EMG, Moving with use of EMG \r\n");
arnouddomhof 3:dca57056e5cb 92 wait(1);
arnouddomhof 3:dca57056e5cb 93 c = pc.getcNb();
arnouddomhof 3:dca57056e5cb 94 if (c == 'h') {
arnouddomhof 3:dca57056e5cb 95 currentState = HOMING;
arnouddomhof 3:dca57056e5cb 96 }
arnouddomhof 3:dca57056e5cb 97 Fail_button.fall(&Failing);
arnouddomhof 3:dca57056e5cb 98 wait(1.0f);
arnouddomhof 3:dca57056e5cb 99 break;
arnouddomhof 3:dca57056e5cb 100 case FAILURE_MODE:
arnouddomhof 3:dca57056e5cb 101 led_red = 0; led_green = 1; led_blue = 1; // Colouring the led RED
arnouddomhof 3:dca57056e5cb 102 pc.printf("FAILURE MODE \r\n");
arnouddomhof 3:dca57056e5cb 103 wait(2.0f);
arnouddomhof 3:dca57056e5cb 104 break;
arnouddomhof 3:dca57056e5cb 105 case SHUTDOWN:
arnouddomhof 3:dca57056e5cb 106 pc.printf("Shutting down \r\n");
arnouddomhof 3:dca57056e5cb 107 led_red = 1; led_green = 1; led_blue = 1; // Colouring the led BLACK
arnouddomhof 3:dca57056e5cb 108 wait(1.0f);
arnouddomhof 3:dca57056e5cb 109 for (int i = 0; i < 4; i++) { // Blinking WHITE 3x before turning BLACK
arnouddomhof 3:dca57056e5cb 110 led_red = !led_red;
arnouddomhof 3:dca57056e5cb 111 led_green = !led_green;
arnouddomhof 3:dca57056e5cb 112 led_blue = !led_blue;
arnouddomhof 3:dca57056e5cb 113 wait(0.6f);
arnouddomhof 3:dca57056e5cb 114 }
arnouddomhof 3:dca57056e5cb 115 led_red = !led_red;
arnouddomhof 3:dca57056e5cb 116 led_green = !led_green;
arnouddomhof 3:dca57056e5cb 117 led_blue = !led_blue;
arnouddomhof 3:dca57056e5cb 118 wait(1.0f);
arnouddomhof 3:dca57056e5cb 119 led_red = !led_red;
arnouddomhof 3:dca57056e5cb 120 led_green = !led_green;
arnouddomhof 3:dca57056e5cb 121 led_blue = !led_blue;
arnouddomhof 3:dca57056e5cb 122 while (true) {
arnouddomhof 3:dca57056e5cb 123 }
arnouddomhof 3:dca57056e5cb 124
arnouddomhof 3:dca57056e5cb 125
arnouddomhof 3:dca57056e5cb 126 default:
arnouddomhof 3:dca57056e5cb 127 pc.printf("Unknown or unimplemented state reached!!! \n\r");
arnouddomhof 3:dca57056e5cb 128 led_red = 1; led_green = 1; led_blue = 1; // Colouring the led BLACK
arnouddomhof 3:dca57056e5cb 129 for (int n = 0; n < 50; n++) { // Making an SOS signal with the RED led
arnouddomhof 3:dca57056e5cb 130 for (int i = 0; i < 6; i++) {
arnouddomhof 3:dca57056e5cb 131 led_red = !led_red;
arnouddomhof 3:dca57056e5cb 132 wait(0.6f);
arnouddomhof 3:dca57056e5cb 133 }
arnouddomhof 3:dca57056e5cb 134 wait(0.4f);
arnouddomhof 3:dca57056e5cb 135 for (int i = 0 ; i < 6; i++) {
arnouddomhof 3:dca57056e5cb 136 led_red = !led_red;
arnouddomhof 3:dca57056e5cb 137 wait(0.2f);
arnouddomhof 3:dca57056e5cb 138 }
arnouddomhof 3:dca57056e5cb 139 wait(0.4f);
arnouddomhof 3:dca57056e5cb 140 }
arnouddomhof 3:dca57056e5cb 141 } // end of switch
Mirjam 0:46dbc9b620d8 142 }
arnouddomhof 3:dca57056e5cb 143 }
arnouddomhof 3:dca57056e5cb 144