State machine
Dependencies: mbed Adafruit_GFX BioroboticsMotorControl MODSERIAL BioroboticsEMGFilter
EMG_calibration.h
- Committer:
- hermanindeput
- Date:
- 2018-11-01
- Revision:
- 35:38a5af0afee8
- Child:
- 36:691ea4660f29
File content as of revision 35:38a5af0afee8:
#pragma once #include "mbed.h" #include "MODSERIAL.h" #include "Screen.h" #include "EMGFilter.h" //Define objects InterruptIn Button1(D2); // Button on interface Ticker calibration_timer; Timeout calibration_bicep; // Timeout to get to relax state Timeout end_of_calibration; // Timeout to get to final state Screen screen(D14, D15, D9); //Variables volatile float EMG_signal1; volatile float EMG_min_relax=1.000; volatile float EMG_min_tense=1.000; volatile float EMG_max_relax=0.000; volatile float EMG_max_tense=0.000; volatile float EMG_threshold; // IN STATE MACHINE: EMGFilter emg_input = EMGFilter(A0); // Voor kalibratie van bicep 1 //EMGFilter emg_input = EMGFilter(A1); // Voor kalibratie van bicep 2 void tense_calibration() { EMG_signal1 = emg_input.get_envelope_emg(); if (EMG_max_tense < EMG_signal1) { EMG_max_tense=EMG_signal1; } if (EMG_min_tense > EMG_signal1) { EMG_min_tense=EMG_signal1; } screen.get_screen_handle()->setTextCursor(0, 0); screen.get_screen_handle()->printf("Tense "); screen.get_screen_handle()->printf("EMG maximum= %.6f",EMG_max_tense); screen.get_screen_handle()->printf("EMG minimum= %.6f",EMG_min_tense); screen.get_screen_handle()->printf(" ",EMG_min_tense); screen.display(); } void relax_calibration() { EMG_signal1 = emg_input.get_envelope_emg(); if (EMG_max_relax < EMG_signal1) { EMG_max_relax=EMG_signal1; } if (EMG_min_relax > EMG_signal1) { EMG_min_relax=EMG_signal1; } EMG_threshold=(((EMG_min_tense-EMG_max_relax)/2)+EMG_max_relax); screen.get_screen_handle()->setTextCursor(0, 0); screen.get_screen_handle()->printf("Relax "); screen.get_screen_handle()->printf("EMG maximum= %.6f",EMG_max_relax); screen.get_screen_handle()->printf("EMG minimum= %.6f",EMG_min_relax); screen.get_screen_handle()->printf("threshold= %.6f",EMG_threshold); screen.display(); } void TheFinalCalibration() { calibration_bicep.detach(); calibration_timer.detach(); screen.get_screen_handle()->setTextCursor(0, 0); screen.get_screen_handle()->printf("threshold= %.6f",EMG_threshold); screen.get_screen_handle()->printf(" "); screen.get_screen_handle()->printf(" "); screen.get_screen_handle()->printf(" "); screen.display(); emg_input.set_threshold(EMG_threshold); } void relax_measure() { calibration_timer.detach(); screen.get_screen_handle()->setTextCursor(0, 0); screen.get_screen_handle()->printf("Relax muscle ",EMG_max_relax); screen.get_screen_handle()->printf(" ",EMG_min_tense); screen.get_screen_handle()->printf(" ",EMG_min_tense); screen.get_screen_handle()->printf(" ",EMG_min_tense); screen.display(); wait(2.5f); calibration_timer.attach(&relax_calibration, 0.1); end_of_calibration.attach(TheFinalCalibration,5.0f); } void tense_measure() { calibration_timer.detach(); screen.get_screen_handle()->setTextCursor(0, 0); screen.get_screen_handle()->printf("Tense muscle ",EMG_max_relax); screen.get_screen_handle()->printf(" ",EMG_min_tense); screen.get_screen_handle()->printf(" ",EMG_min_tense); screen.get_screen_handle()->printf(" ",EMG_min_tense); screen.display(); wait(2.5f); calibration_timer.attach(&tense_calibration, 0.1); calibration_bicep.attach(&relax_measure,5); } int main() { emg_input.start(0.005); while(1) { Button1.fall(&tense_measure); } // return 0; }